السلام عليكم ورحمة الله ,,,
هذا الموضوع تكملة لما سبق ( برمجة البويس أو البيوس BIOS)
وصلنا في الموضوع السابق إلى طريقة تحميل نظام التشغيل .. وسنبدأ من هذة النقطة .
قبل البدء : أنظمة التشغيل الموجودة حاليا تنقسم إلى قسمين هي أنظمة 16 بت وأنظمة 32 بت
والإختلاف بين منصة 16 بت و 32 بت إختلاف كبير جدا ولذلك سينقسم الموضوع إلى قسمين
1- بنية و عمل أنظمة 16 بت :
بإختصار أنظمة 16 بت هي الأنظمة القديمة وهي عبارة عن شاشة سوداء تستقبل الأوامر
ظهرت هذة الأنظمة للعالم بعد ظهور المعالج 8086 ( إختصارة x86 ) من قبل شركة إنتل
ومن هذة الأنظمة الدوس و اليونكس و OS2 و بعض البرامج المستقلة وغيرها !
هذة الأنظمة تعمل في النمط الحقيقي ( بمعنى أنة لاتوجد قواعد وشروط وإمتيازات للبرامج والنظام )
أهم نقطة في هذة الأنظمة : أنها لا تستطيع تشغيل أكثر من مهمة أو برنامج في نفس الوقت
معلومة : قد تلاحظ أنة في نظام الدوس مثلا أكثر من برنامج مقيم في الذاكرة وكلها شغالة
ومع ذلك لا يعتبر النظام متعدد المهام , لأن كل البرامج المقيمة في الذاكرة لاتعمل في نفس الوقت
وإنما ينتقل التنفيذ من برنامج لآخر بالترتبيب ( وستتضح فكرة تعدد المهام في القسم الثاني من الموضوع)
المسجلات المتوفرة لهذة الأنظمة هي :
المسجلات العامة : AX,BX,CX,DX,SI,DI,BP,SP
مسجلات الأقسام : ES,SS,CS,DS
وكل هذة المسجلات حجمها 16 بت ( ولذلك سميت أنظمة 16 بت )
-------------
هذة النقاط تكفي للدخول في الموضوع ,,, سيتم إختيار النظام دوس من بين أنظمة 16 بت
لأنة متوفر عند الأغلبية لتطبيق أمثلة الدرس والنقطة الثانية أن كل الأنظمة متشابهة في طريقة عملها
ذكرنا في الدرس السابق أن آخر عملية يقوم بها البويس هي تحميل قطاع الإقلاع ونقل التحكم للنظام
ماذا يكتب نظام الدوس في قطاع الإقلاع ؟
كيف يقوم نظام الدوس ببناء بيئة لنظام التشغيل ؟
يبدأ البويس بتحميل قطاع الإقلاع إلى العنوان hex =0000:7C00 بمعنى أن هذا العنوان هو بداية برنامج الإقلاع
في النظام دوس يبدأ برنامج الإقلاع بتعليمة قفز إلى الإزاحة hex =3E والتعليمة هي JMP 3E
ولذلك فإن بداية التنفيذ الفعلي لبرنامج الإقلاع يبدأ عند العنوان hex =0000:7C3E
لماذا يتجاوز النظام دوس 62 بايت تقريبا من بداية القرص ؟!
السبب لأن مقدمة القرص تحتوي على معلومات عن القرص يخزنها نظام التشغيل ( عند عملية الفورمات )
وهذة المعلومات هي عدد القطاعات في كل تجمع وعدد التجمعات وعدد البايتات في كل قطاع ... وهكذا
وهي ما تعرف بمقدمة القرص , وتجد المعلومات عن كل بايت في هذة المقدمة هنا :
يبدأ التنفيذ الفعلي لبرنامج الإقلاع عند العنوان hex =0000:7C3E
بداية برنامج الإقلاع : الخطوة الأولى
0000:7C3E CLI 0000:7C3F XOR AX,AX 0000:7C41 MOV SS,AX 0000:7C43 MOV SP,7C00 0000:7C46 PUSH SS 0000:7C47 POP ES
يبدأ برنامج الإقلاع بتصفير أعلام أو رايات المقاطعات عن طريق التعليمة الأولى
وهذة الطريقة لا تعتبر شرط لبداية الإقلاع لأن برامج الإقلاع لأنظمة IBM لا تستخدم هذة التعليمة
المهم بعد ذلك يصفر المسجل ax ومن خلالة يصفر قسم المكدس وهو ss
ويعطا المسجل sp قيمة تمثل بداية البرنامج في الذاكرة ويتم دفع القيمة للمكدس
لماذا ؟ لأن المسجل sp مرتبط بالمقطع ss ويمثلان مكدس البرنامج وهو ss:sp ويساوي 0000:7C00
وبهذا يكون قد عرف مكدس البرنامج لتخزين المعلومات المؤقتة أو المتغيرات في البرنامج
الخطوة الثانية :
0000:7C48 MOV BX,0078 0000:7C4B SS: 0000:7C4C LDS SI,[BX] // DS:SI = [0000:0078] 0000:7C4E PUSH DS 0000:7C4F PUSH SI 0000:7C50 PUSH SS 0000:7C51 PUSH BX
هذة الخطوة للتغيير في بعض خصائص القرص (بمعنى أن النظام دوس سيغير في خصائص القرص للبويس) ؟؟
لاحظ التعليمة الأولى المسجل bx = 0078 بعد هذة التعليمة تلاحظ أن باقي التعليمات تنفذ داخل المقطع ss
وقيمة ss = 0000 والتعليمة lds تحمل مقطع البيانات بالقيمة صفر والمسجل si = 0078
والعلاقة هي DS:SI أي أن المسجل والمقطع مرتبطين مع بعض مثل الخطوة الأولى ( وهذة قوانين في لغة الإسمبلي )
المهم كل هذة الشغلة هي لجعل مقطع البيانات يمثل العنوان 0000:0078 بعد إرتباطة بهذة الطريقة DS:SI
ماذا يمثل العنوان ولماذا هذة الشغلة ؟! معرفة هذا العنوان سيحل اللغز الأول ؟ لاحظ
هل قرأت موضوع برمجة البويس بدقة ؟ راجع الجدول الأول وهو لعناوين المقاطعات وخاصة المقاطعة INT 1E
ستجد عنوانها بهذة الطريقة INT 1E =0000:0078 وهي خاصة لجدول وبارمترات القرص ؟! أي خصائص القرص
في هذا الجدول يخزن البويس معلومات القرص الذي حمل منة قطاع الإقلاع ؟ فيقوم الدوس بقرائتها والتغيير حسب طلبة
كيف ؟ بهذة الطريقة :
0000:7C52 MOV DI,7C3E 0000:7C55 MOV CX,000B 0000:7C58 CLD 0000:7C59 REPZ 0000:7C5A MOVSB 0000:7C5B PUSH ES 0000:7C5C POP DS
تلاحظ أن الدوس نقل بيانات القرص إلى نفس مقطع البرنامج وقد يكون أي عنوان في مقطع البرنامج
والملاحظة الثانية أن حجم البيانات تساوي B أي 11 بايت
بعد ذلك يغير الدوس بعض الخصائص بهذة الطريقة
0000:7C5D MOV BYTE PTR [DI-02],0F 0000:7C61 MOV CX,[7C18] 0000:7C65 MOV [DI-07],CL 0000:7C68 MOV [BX+02],AX 0000:7C6B MOV WORD PTR [BX],7C3E 0000:7C6F STI 0000:7C70 INT 13
أول تعليمة يقوم نظام الدوس بتغيير خاصية تسمى مدة الإنتظار لرأس القرائة والكتابة في القرص
وهي إحدى خصائص القرص ويحدد المدة بالقيمة F ( أعتقد أنها لتسريع القرائة )
التعليمة الثانية والثالثة : يقوم نظام الدوس بتغيير عدد القطاعات في كل مسار ( لكي يحدد قطاعات ملف محدد )
ولو تلاحظ أنة قرأ القيمة الموجودة في مقدمة القرص والإزاحة هي 18 وتمثل عدد القطاعات في المسار
بعد ذلك يقوم بنقل الخصائص بعد تعديلها , والتعليمة sti هي لإعادة تفعيل المقاطعات
وآخر شيء يقوم بتنفيذ مقاطعة إعادة تهئية القرص ,, ويصبح القرص جاهز بعد التغيير
والآن يبدأ النظام بويس بتحميل الملفات وتشغيل النظام ,, كيف ؟
يقوم بقرائة مقدمة القرص ويستخرج كل المعلومات الموجودة . بهذة الطريقة
0000:7C84 MOV AL,[7C10] 0000:7C87 MUL WORD PTR [7C16] 0000:7C8B ADD AX,[7C1C] 0000:7C8F ADC DX,[7C1E] 0000:7C93 ADD AX,[7C0E] 0000:7C97 ADC DX,+00 0000:7C9A MOV [7C50],AX 0000:7C9D MOV [7C52],DX 0000:7CA1 MOV [7C49],AX 0000:7CA4 MOV [7C4B],DX
التعليمة الأولى يتعرف على عدد جداول نظام الملفات فات وهي الإزاحة 10
والتعليمة الثانية عدد قطاعات الجدول فات الإزاحة 16 ,, ثم عدد القطاعات المخفية وهكذا
راجع مقدمة القرص لتعرف كل قيمة ماذا تمثل , وكيفية الإستفادة منها
المهم أنة بعد الحسابات يحدد قطاعات ملف معين لبداية تشغيل النظام
وفي مثالنا فإن النظام دوس يبحث عن قطاعات الملف IO.sys يقوم بتحميلة إلى العنوان hex 0070:0000
ملاحظة : يتم قرائة أول 3 قطاعات من الملف فقط وبعد ذلك تنقل للذاكرة
وأكيد بإستخدام الخدمة 2 من المقاطعة INT 13 ( بنفس الطريقة التي قمنا بتطبيقها في موضوع البويس )
وآخر خطوة في برنامج الإقلاع هي تعلمية قفز إلى بداية العنوان 700 ( وهي أول 3 قطاعات من الملف io.sys )
هل لاحظت الدورة الغير منتهية ؟! وأهم شيء هل لاحظت تشابة الأفكار ؟!
المعالج يبدأ بقفزة إلى البويس ثم يقوم البويس بتحميل قطاع الإقلاع إلى العنوان hex 0000:7C00
ثم ينتهي البويس بقفزة إلى قطاع الإقلاع
ثم يبدأ قطاع الإقلاع بقفزة ويبدأ التنفيذ ثم يحمل برنامج الإقلاع نواة النظام إلى العنوان hex 0070:0000
ثم ينتهي برنامج الإقلاع بقفزة إلى نواة النظام
وبعد ذلك تبدأ صناعة بيئة نظام التشغيل ؟!
في الحقيقة أن هذة المعلومات لقطاع الإقلاع متشابة في أكل أنظمة التشغيل بما فيها أنظمة 16 بت و 32 بت
ولآن ماهي خطوات صناعة بيئة لنظام التشغيل لمنصة 16 بت ؟
قبل البدء في هذة النقطة , لدي ملاحظة مهمة وهي :
لا تعتقد أن تحميل نواة النظام إلى الذاكرة هي عبارة عن تحميل ملف معين من القرص
والنقطة الثانية وهي الأهم : لا تعتقد أن محتويات القرص هي الملفات الموجودة بة فقط ؟!!
سؤحاول توضيح الفكرة ,, هل لاحظت برنامج الإقلاع الذي عرضنا بعض شفرتة وهو موجود في القطاع الأول
هل يوجد ملف في القرص يدل على هذا البرنامج ؟؟ أكيد لا رغم أنة موجود فعلا في القرص
وتستطيع أن تكتب برنامج كامل في كل مساحة القرص لتحميل النظام .. دون وجود أي ملف مرئي في القرص
وستكون طريقة تحملية للذاكرة أسهل وأفضل لأن محتوياتة ستكون في قطاعات متتالية (ولكنة سيكون غامض للمستخدم)
بإختصار أريد أن أصل لنقطة , وهي أن النظام دوس يحمل برامج لصناعة بيئة للنظام من أماكن متفرقة
في القرص قد تكون من بعض الملفات المرئية أو من قطاعات مخفية لا توجد لها ملفات في القرص !
المهم : تبدأ نواة النظام في العمل .. خطوات بناء بيئة للنظام :
الخطوة الأولى : يتم بناء جدول مقاطعات الدوس وجدول معلومات الدوس ؟ أكيد مرت عليك هذة الجداول؟!
هل راجعت الموضوع السابق ( برمجة البويس ) تقصدت شرح جدولين بالتفصيل وهما جدول مقاطعات البويس
وجدول معلومات البويس ؟! فالنظام دوس سرق الفكرة من البويس وبنفس التخطيط مئة بالمئة
والآن دعنا نراجع :
ذكرنا أن أول جدول هو جدول مقاطعات البويس عند العنوان 0000:0000
بعد ذلك جدول معلومات البويس عند العنوان 0040:0000
بعد ذلك يبدأ الدوس في كتابة جدول للمقاطعات عند العنوان الذي توقفنا عندة في الدرس السابق (وذكرت ملاحظة)
ثم تتم كتابة جدول بيانات الدوس عند العنوان 0050:0000 حجم هذا الجدول 200 بالعنونة =0020:0000
لوجمعت العنوان 0050:0000 و 0020:0000 فالنتيجة هي 0070:0000 ماذا يمثل العنوان
بداية برنامج نواة نظام التشغيل الذي إنتقل لة التنفيذ من قطاع الإقلاع ,, لاحظ الترتيب الدقيق جدا
ولا بايت فارغ من بداية الذاكرة إلى هنا ؟
إذ تعمد النظام من جعل مساحة فارغة تسبق عنوان نواة النظام ليتم كتابة الجداول بها ,
والسؤال : ماهو البرنامج الذي كتب الجدولين للدوس وكيف ؟
أولا : الجدولين عبارة عن أرقام وبيانات لترتيب ونقل التنفيذ مثلا مقاطعة الدوس int 21
تتصل بجدول المقاطعات , جدول المقاطعات ينقل التنفيذ إلى برنامج آخر في الذاكرة لتنفيذ المقاطعة
بمعنى أنة لإنشاء جداول تخطيط في الذاكرة لا نحتاج لأي تعليمة للعتاد أو المنافذ أو مقاطعة للبويس
فقط نحتاج لتعليمات نقل المعلومات مثل mov ولذلك تجد البرنامج io.sys لا يحتوي على أي مقاطعة
خارجية , فقط يحتوي على بعض تعليمات الفحص والمنافذ
والنتيجة : أن المسؤل عن بناء الجدولين هو البرنامج io.sys وقد تتدخل بعض قطاعات القرص المخفية
والآن أنشأ نظام الدوس الجدولين ولكن جدول المقاطعات ينقل كل مقاطعة إلى عنوان لتنفيذ المقاطعة
أين هذة العناوين وكيفية إنشائها ؟
يبدأ برنامج io.sys بتحميل جزء من الملف msdos.sys وهذا الملف لا يحتوي على أي تعليمة
فقط يحتفظ بإعدادات تخص الملف io.sys
وبعد ذلك يبدأ بتحميل باقي ملفات القرص بعد تجزئتها حسب العنوان التي ستتصل بة مقاطعة الدوس
كيف ؟
مثلا الملف command.com يقرأ منة 5 قطاعات مثلا وينقلها لعنوان التنفيذ لمقاطعة محددة
وعندما تنفذ المقاطعة ينتقل التنفيذ لجدول المقاطعات بعد ذلك ينقل جدول المقاطعات التنفيذ لعنوان الخمس قطاعات
وهكذا مع بقية الملفات والقطاعات التي لا يوجد لها ملفات تعبر عنها في القرص
والآن مثال لتوضيح الفكرة ؟!
من قائمة start ثم run إكتب command لتشغيل برنامج الدوس
أكتب الأمر التالي : mem /p لإستعراض محتوى الذاكرة
ولاحظ الترتيب الذي سيظهر , أول سطر جدول المقاطعات وعنواة 0 ثم جدول بيانات البويس وعنوانة 40
ثم جدول بيانات الدوس وعنوانة 50 وبعد ذلك لاحظ تقسيم البرامج مثلا io.sys ستجدة أكثر من قسم
وكذلك باقي الملفات مثل msdos و command ..., بإختصار هذة هي فكرة أنظمة 16 بت
والإختلاف بسيط بين الدوس واليونكس 16 بت وهو عبارة عن ترتيب للمقاطع التي تم ذكرها
فمثلا اليونكس يكتب معلوماتة بعد جدول معلومات البويس بهذا الترتيب
- نواة النظام -
- ذاكرة مؤقتة لتحميل البرامج -
- وهنا يكتب جداول المعلومات -
- هنا يخصص قسم كبير يستخدم مكدس لكل البرامج -
---------
وفي النهاية هذة الأساليب لبرمجة أنظمة 16 بت لم تعد موجودة أو نادرة الإستخدام
ولكن الهدف من ذكرها لتكون مدخل لأنظمة 32 بت مثل وندوز ولينكس
لتكتشف الفرق الكبير ,,, والتحول من المقاطعات إلى الدوال API والبوابات والإمتيازات والمهام
وأفضل طريقة لكشف أسرار بناء الأنظمة هي برامج المتابعة والتصحيح وهي متوفرة
مثل برنامج debug في دوس والبرامج التجارية مثل السوفت آيس وبرنامج TD من بورلند وغيرها الكثير
وعند متابعة أي نظام يجب أن تعرف أن سياسة الأنظمة هي : الترتيب والغموض ؟
الترتيب : وهو عمل النظام وأفكارة دائما تأتي تحت ترتيب أو قانون محدد إما أن يكون مأخوذ من البويس
كما شاهدنا أفكار نظام الدوس أو تكون فكرة جديدة بترتيب معين ( والترتيب هو أساس في صناعة الأنظمة )
الغموض : وهو أن النظام يحاول بكل الطرق أن يظهر مئة علامة تعجب فوق رأسك ؟ كيف قام بهذا العمل ؟
لأن شركات الأنظمة تسرق من بعضها الأفكار لمحاولة تطوير أنظمتها ,, ودائما تجد بعض الطرق في الأنظمة
تلف وتدور للوصول لهدف يمكن الوصول لة في خطوة واحدة ببساطة ووضوح ؟ فلا تستغرب من هذة الدورة
--------------------
وبالتوفيق ,,,