برمجة أنظمة تشغيل الكمبيوتر 32 بت أنظمة وندوز & لينكس – معالجات x386 –

عام 0 geek4arab
Spread the love
برمجة أنظمة تشغيل الكمبيوتر 32 بت أنظمة وندوز & لينكس – معالجات x386 –
JAAScois.com » أبحاث ودراسات »
الكاتب: JAAScois
تاريخ النشر: 22/11/2004 م
أنظمة 32 بت (وندوز && لينكس ..)

إنتشر المعالج x86 ( أول معالج 16 بت ) بشكل رهيب وحقق تحول كبير في صناعة الأنظمة 16 بت

وظهرت لهذا المعالج أنظمة مثل دوس وينكس وغيرها , وبالتأكيد حققت الشركات أرباح شبة خيالية

مما جعل شركة إنتل تستمر في البحث لإنتاج معالج مطور يحدث نقلة أخرى وأرباح أكثر ؟؟

وفي سنة 1988 -1989 تقريبا طرحت شركة إنتل معالج الأحلام وهو المعالج 80386 إختصارة x386

وهو المعالج 32 بت الذي يملك كل الخدمات مثل الإمتيازات وتعدد المهام ومسجلات 32 بت والأنماط الرسومية

ولكن شركة إنتل لا تريد أن تخسر أنظمة المعالج 16 بت , فجعلت المعالج يعمل في المنصتين 16 بت و32 بت

الآن عرفنا أن المعالج 32 بت ظهر تقريبا في سنة 89 ولكن شركات الأنظمة تحتاج وقت لفهم عمل معالج

32 بت وبناء أنظمة التشغيل له ,, بعد 6 سنوات تقريباً ظهر النظام وندوز 95 وهو نظام 32 بت ؟!!

نظام الوندوز أول نظام يستخدم كل خدمات المعالج 32 بت وهو بداية في عصر الأنظمة الرسومية

وبهذا هيمت شركة مايكروسفت على سوق البرمجيات والأنظمة وأصبح صانعها الأغنى في العالم !

ماهو الجديد في أنظمة 32 بت ؟

ذكرنا في الدرسين السابقين أساسيات في برمجة أنظمة 16 بت ووجدنا أن النظام يستخدم مسجلات المعالج

في البرمجة وهي نفسها المسجلات التي تستخدمها البرامج , وإكتشفنا أن أنظمة التشغيل تستخدم نفس أفكار نظام الBIOS

بمعنى أن أنظمة 16 بت معظم أفكارها مستهلكة … وطرق برمجتها واضحة ,,, ولكن في أنظمة 32 بت الأمر يختلف !

المسجلات التي تستخدمها أنظمة التشغيل 32 بت :

المسجلات العامة تغيرت لتصبح : EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP

مسجلات الأقسام : ES,SS,CS,DS وأضيف لها GS,FS

هذة المسجلات كانت في أنظمة 16 بت وتم تطويرها لتتسع إلى 32 بت أي 4 بايت ولهذا سميت أنظمة 32 بت

لو كان التطوير فقط لهذة المسجلات لما تطور النظام ,,, فمثلا الخدمات الجديدة مثل :

الذاكرة الوهمية وصفحات الذاكرة , النمط المحمي والبوابات , تعدد المهام , مراقبة أخطاء الهاردوير ..

كل هذة الخدمات تحتاج لمسجلات جديدة ليستخدمها نظام التشغيل ,, وسنبدأ بشرح مسجلات 32 بت الجديدة

1- مسجلات نظام التشغيل ( الجداول ) وهي :

IDTR -IDT =جدول المقاطعات ( ملاحظة : المسجل idtr يمثل الجدول , والمسجل idt يمثل دليل للجدول )
GDTR-GDT = مسجلات جدول الواصفات الشامل
LDTR -LDT= مسجلات جدول الواصفات المحلي
TSS -TR = مسجلات تعدد المهام

2- مسجلات التحكم للمعالج والذاكرة وهي :

CR0 و CR1 و CR 2 و CR3 و CR4

3- مسجلات الإختبار والتنقيح للبرامج والهاردوير :

TR0,TR1,TR2,TR3,TR4,TR5,TR6,TR7

تعليمات بعض المسجلات السابقة :

LGDT, LIDT, LLDT, LMSW, LTR,
SGDT, SIDT, SLDT, SMSW, STR,
RDMSR, WRMSR, RDTSC

وبقية المسجلات تستخدم التعليمة MOV ( وسيتم عرض الأمثلة في نهاية الموضوع )

نبدأ بشرح الجداول ,,,

جدول الواصفات الشامل والمحلي :

ماهي الجداول ؟ في أنظمة 32 بت تم حجز مساحات فارغة في الذاكرة يستخدمها النظام كجداول

مثل جدول الواصفات الشامل والمحلي و جداول الذاكرة وجدول المقاطعات , وتستطيع إستخراج

أي قيمة في أي جدول من خلال معلومتين هما : الأساس وهو يمثل عنوان الجدول

والحد وهو يمثل دليل للجدول , وسنقوم بعرض هذة الجداول والمعلومات التي تحتويها

جداول الواصفات من إسمها تعني : وصف عناوين المقاطع ووصف لخصائص المقاطع وأنواعها ,, ماهو المقطع ؟!

نعرف بأن نظام التشغيل عبارة عن برامج (عمليات ) البرامج عبارة عن مقاطع , مثل مقطع الكود ومقطع البيانات

ومقطع الكود يمثلة المسجل CS والبيانات المسجل DS , ماذا لو فتحت أي برنامج بواسطة الديبغر وأردت أن تعرف

عنوان مقطع الكود مثلاً , أنا جربت بواسطة برنامج olly وظهر لي في النافذة اليمنى أن مقطع الكود يساوي CS =21 ??

ومقطع البيانات مثلا DS =1B , هل من المعقول أن هذا العنوان في الذاكرة يمثل عنوان كود البرنامج ؟! أكيد لا

جرب شغل أي برنامج آخر بواسطة الديبغر ,, ستجد أن عناوين المقاطع نفسها في البرنامج السابق لم تتغير ؟

هل كل البرامج لها عنوان واحد في الذاكرة ؟ بإختصار هل العنواين التي نراها حقيقية أم أن النظام يخدعنا ؟!!

الجواب هو جدول الواصفات الشامل ,,, ماهو جدول الواصفات الشامل ؟

يتكون الجدول من مسجلين الأول GDTR ويمثل الجدول(الأساس) , والمسجل GDT يمثل الدليل (الحد)

مثلا لو كان GDT =10 يعني السطر 10 في الجدول GDTR

والمعلومة الثانية أن المسجل GDTR حجمة 64 بت (يحتوي على العنوان الذاكري للقسم وخصائصة )

وبهذا سنفهم الفكرة , نظام التشغيل يعطي أي عملية في الذاكرة (مثلا مقطع كود ) يعطية رقم مثلا 20

هذا الرقم يمثل رقم السطر في جدول الواصفات الشامل ,, بهذا الشكل

الملاحظة الأولى : الجداول في الذاكرة تبدأ الترتيب من الأسفل إلى الأعلى, مثل مقطع المكدس في البرامج

الملاحظة2 : جدول الواصفات لا يحتوي على مقاطع للبيانات والكود فقط , وإنما يحتوي على أكثر من نوع

للعمليات مثل TSS مسجل حالة لعملية معينة ! و قد يحتوي LDT وهو يمثل إزاحة في جدول آخر

وقد يحتوي على إتصال لبوابة أو مقاطعة لبوابة أو مصيدة لبوابة , المهم أن القاعدة هي

جدول الواصفات الشامل هو المسؤل عن نقل التحكم ؟إما إلى جدول آخر مثل جدول المقاطعات أو الجدول المحلي

أو إلى جدول عناوين الذاكرة أو إلى عملية في الذاكرة , وستتضح الفكرة بعد قليل !

ولآن لو أخذنا أي قيمة من الجدول مثل القيمة 1 قسم بيانات , حجمها سيكون 64 بت , ماذا تمثل هذة 64 بت

يقوم نظام التشغيل بكتابة كل معلومات العملية أو القسم في هذة الخانة , مثل العنوان الذاكري الذي سيتجة لة التنفيذ

نوع القسم مثل كود أو بيانات أو معرف لجدول أو بوابة , ويكتب إمتيازات القسم مثلا قسم للنظام أو للمستخدم

ومعلومات أخرى كثيرة ,, يستفيد منها النظام في تنظيم القيم وتحديد مستويات التنفيذ , دعنا نشرح كل بت بالتفصيل !

التقسيم العام لقيم جدول الواصفات الشامل GDTR , حجمة 64 بت :

البتات من 0 إلى 15 + البتات من 48 إلى 51 : يمثل الحد (للإنتقال لجدول آخر )

البتات من 16 إلى 39 + البتات من 56 إلى 63 : يمثل الأساس ( وهو عنوان الجدول )

وهذة القيم تمثل عنوان الإنتقال للتنفيذ إما لجدول واصفات آخر أو إلى جدول عناوين وصفحات الذاكرة

وبعد ذلك يتم الإنتقال الفعلي للكود التنفيذي , نرجع لتقسيم 64 بت , بقية البتات تمثل خصائص المقطع :

البت من 40 إلى 43 : وعددها 4 بتات والقيمة التي تحتويها هذة 4 البتات تمثل خصائص القسم ,

تنقسم خصائص القسم إلى نوعين , الأول خصائص القسم لعملية النظام , وخصائص القسم لعمليات المستخدم

والذي يحدد نوع العملية هو البت 44 الذي يلي هذة 4 البتات , إذا كان بت نوع العملية 0 فإن العملية

تكون للنظام , وبذلك فإن خصائص أقسام عمليات النظام المكونة من 4 بت تكون بالشكل التالي

القيمة 0 : محجوزة للمستقبل ( لايوجد )
القيمة 1 : نوع القسم عملية TSS من نوع 16 بت
القيمة 2 : نوع القسم دليل لجدول LDT وهو يمثل دليل لجدول الواصفات المحلي
القيمة 3 : عملية TSS من نوع 16 بت وهي في حالة التنفيذ بمعنى عملية مشغولة
القيمة 4 : نوع العملية إتصال لبوابة من نوع 16 بت
القيمة 5 : نوع العملية بوابة للتنفيذ
القيمة 6 : مقاطعة لبوابة من نوع 16 بت
القيمة 7 : مصيدة لبوابة من نوع 16 بت
القيمة 8 : قيمة محجوزة للمستقبل
القيمة 9 : عملية TSS من نوع 32 بت
القيمة 10 : محجوز للمستقبل
القيمة 11 : عملية TSS من نوع 32 بت , مشغولة
القيمة 12 : إتصال لبوابة 32 بت
القيمة 13 : محجوز
القيمة 14 : مقاطعة لبوابة 32 بت
القيمة 15 : مصيدة لبوابة 32 بت

أما إذا كان نوع العملية ( عملية مستخدم ) بمعنى أن البت 44 يساوي 1

تكون خصائص القسم لل 4 بت بهذا الشكل

القيمة 0 : قسم بيانات للقرائة فقط
القيمة 1 : قسم بيانات للقرائة + إمكانية الوصول
القيمة 2 : قسم بيانات للقرائة والكتابة
القيمة 3 : قسم بيانات للقرائة والكتابة + إمكانية الوصول
القيمة 4 : قسم بيانات للقرائة فقط + قسم موسع
القيمة 5 : قسم بيانات للقرائة فقط + قسم موسع + إمكانية الوصول
القيمة 6 : قسم بيانات للقرائة والكتابة + قسم موسع
القيمة 7 : قسم بيانات للقرائة والكتابة + قسم موسع + إمكانية الوصول
القيمة 8 : قسم شفرة قابل للتنفيذ فقط
القيمة 9 : قسم شفرة تنفيذي + إمكانية الوصول
القيمة 10 : قسم شفرة تنفيذي + للقرائة
القيمة 11 : قسم شفرة تنفيذي + للقرائة + إمكانية الوصول
القيمة 12 : قسم شفرة تنفيذي متوافق
القيمة 13 : قسم شفرة تنفيذي +متوافق + إمكانية الوصول
القيمة 14 : قسم شفرة تنفيذي + للقرائة + متوافق
القيمة 15 : قسم شفرة تنفيذي + للقرائة + متوافق + إمكانية الوصول

هذة هي نفسها خصائص أقسام البرامج في نظام وندوز , وهي نفسها خصائص أقسام جداول الواصفات

بعد ذلك يأتي البت 44 في جدول الواصفات الشامل , نكمل باقي 64 بت

البت 44 : هذا البت يحدد إذا كانت العملية للنظام أو للمستخدم , وهو البت المسؤل عن كيفية التقسيم

لخصائص الأقسام كما ذكرناة سابقاً , إذا كان 0 عملية نظام وإذا كان 1 عملية مستخدم

البت 45 و 46 : يمثل رقم الإمتياز أو الحلقة التي ستعمل بها هذة العملية , والحلقات من 0 إلى 3

البت 47 : يمثل هذا البت وجود القسم الحالي في الذاكرة أو عدم وجودة ؟!
يستفيد النظام من هذا البت في أمور كثيرة منها مثلا معرفة الأقسام النشطة والغير نشطة لنقل محتواها من القرص إلى الذاكرة والعكس , كما أن البت يستخدم للتبديل بين الأقسام

البت 52 : هذا البت إحتياطي ؟! إلى أن يتم التبديل بين الأقسام فيصبح البت مكمل لقيم الحد بمعنى أن البت لا يستخدم في هذا التقسيم وسيتم إستخدامة في تقاسيم أخرى ,

البت 53 : هذا البت غير مستخدم دائما 0 محجوز للمستقبل

البت 54 : إذا كان قيمة البت 0 فإن المقاطع تكون 16 بت وإذا كان 1 تصبح المقاطع 32 بت

البت 55 : هذا البت يتسخدم في طريقة التعامل مع قيمة الحد للعملية , إذا كان 0 فإن المعالج يحسب قيمة الحد كماهي , وإذا كانت قيمة البت 1 يستخدم المعالج قانون جديد , وهو حساب كل قيمة للحد 4 كيلوبايت

وبهذا نكون أكملنا كل 64 بت لعملية نظام داخل جدول الواصفات الشامل ,

بقية معلومة وهي : يوجد تقسيم آخر لجدول الواصفات الشامل , إذا كانت العملية تخص البوابات

فإن بعض الخصائص في 64 بت تختلف – والإختلاف بسيط بهذا الشكل ,,

تقسيم جدول الواصفات لعملية نوعها ( إتصال لبوابة ):

عملية الإتصال لبوابة تستخدم تقسيم آخر غير التقسيم العام ولكن مشابة بشكل كبير للتقسيم العام

فمثلا البتات من 52 إلى 55 : لا تستخدمها البوابة , وتضاف بتات جديدة وهي

البت من 32 إلى 36 : وتستخدمها البوابة لتمرير مجموع البارمترات التي ستمرر عبر البوابة

أما بقية البتات : الخصائص ومستوى الإمتيازات و.و. , تبقى كما هي

نستنتج : أن أي عملية تخص البوابات مثل مقاطعة لبوابة أو مصيدة لبوابة فإنها لا تستخدم

البتات من 52 إلى 55 وبقية الخصائص تبقى كما هي

التبديل بين المهام وتقسيم المسجل TSS تقسيم :

من أعقد العمليات في نظام التشغيل 32 بت هي عملية التبديل بين المهام , ولكن المعالج يتكلف بأغلب

الشغلة , تستطيع أن تقول أن كل عملية في الذاكرة عبارة جدول معلومات يمثلة المسجل TSS
بهذة الصورة :

تلاحظ القيم التي باللون الأزرق : المسجل TR يمثل رقم العملية السابقة التي إنتقل منها التنفيذ للعملية الحالية

مثلا كنت تعمل على برنامج ومن خلالة شغلت برنامج آخر , يتم تسجيل رقم البرنامج الأول في هذا المسجل

ليس بالتحديد رقم البرنامج الذي كنت علية ؟!! ولكن لتقريب الفكرة , يمكن تكون عملية نظام سبقت التنفيذ

وبهذا يصبح ترابط بين العمليات في الذاكرة , مثال : يبدأ النظام بأول عملية ( أكيد مافي شيء قبلها تكون هذة القيمة 0)

بعد ذلك تشتغل عملية أخرى ترتبط مع العملية التي قبلها بهذا المسجل وهكذا مع ثالث عملية , وتصبح كل العمليات مترابطة

ليقوم المعالج بسرعة كبيرة بالتبديل بين هذة المهام من الأحدث إلى الأقدم , وبهذا تعتقد أن لكل عملية معالج خاص ؟!!

وتلاحظ مسجلات المكدس ss0 و ss1 .. ودليل المكدس esp1 و esp2 ( هذة المسجلات آخر 3 عمليات)

سبقت هذة العملية , والسؤال لماذا إختار المعالج مسجل المكدس لثلاث عمليات , لماذا لم يختر مسجل الكود مثلاً

لأن أي عملية إتصال تخرج التنفيذ من البرنامج إلى كود خارج البرنامج , فإنة يتم تسجيل معلوماتها في المكدس

مثل عنوان الإتصال و عنوان العودة للبرنامج , سأعطيك مثال على هذة النقطة ؟!! تخيل

أنك تعمل على الكمبيوتر وفجأة ظهرت رسالة خطأ في النظام ثم يغلق النظام ؟ كيف تعرف مصدر الخطأ

عن طريق عرض العمليات المقيمة في الذاكرة , وإلقاء نظرة على مكدس البرنامج لتجد آخر عملية خروج من البرنامج

وستجد عنوان العودة , إذهب إلية ولاحظ الكود الذي تسبب في الخطأ , هذة النقطة سنتفيد منها كثير في البرمجة العكسية

المهم : وما غرض المعالج من معرفة المكدس لآخر ثلاث عمليات ؟! لكي يعرف مكان التنفيذ قبل الإنتقال للعملية

إذا كان التنفيذ خارج البرنامج , مافائدت الإنتقال للعملية بشكل مباشر ؟! ولذلك فإنة يتم التبديل بين المهام

بسرعة أكبر , بعد ذلك يأتي المسجل CR3 هذا المسجل خاص للصفحات الذاكرية للعملية

وسيتم مناقشتة في القسم الثاني من الموضوع ( مسجلات التحكم للمعالج والنظام )

وبعد ذلك المسجلات التي باللون الأحمر : وهي بالطبع المسجلات العامة ومسجلات الأقسام التي تخص العملية

الحالية , يحتفظ بها المعالج عندما يبدل بين العملية وعندما يرجع إليها يعيد القيم للمسجلات

المسجل LDT وهو دليل لهذة العملية في جدول الواصفات المحلي , وتستخدم لمعالجة الإستثنائات في العملية

وهذة القيمة لاتستخدم في النظام , دائما صفر

بقي آخر قيمة : تخطيط الذاكرة لعناوين الإدخال والإخراج في البرنامج , وهذا الموضوع سيكون لة شرح

أكثر عندما ندخل في طرق البرمجة و المقاطعات للهاردوير + مقاطعات البرامج

والآن سنقوم بمراجعة سريعة للجداول لتوضيح طرق الترابط بينها , وأماكن تواجدها

علمنا أن أي عملية في نظام التشغيل يمكن أن تكون :

قسم بيانات – قسم كود – عملية أو معرف للمسجل TSS – دليل لجدول آخر مثل LDT

أو إتصال لبوابة – مقاطعة لبوابة – عملية لبوابة – مصيدة لبوابة

وأي عملية من هذة العمليات يمثلها 64 بت(جداول الواصفات) هذة ال 64 بت تمثل عنوان الإنتقال + الخصائص

والسؤال أين المكان المناسب لكل عملية في أي جدول , الجداول هي

جدول الواصفات الشامل GDTR : العمليات التي يمكن أن يحتويها 5 وهي :

إما أن تكون قسم كود – أو قسم بيانات – أو معرف TSS – أو دليل لجدول LDT – أو إتصال لبوابة

جدول المقاطعات IDTR , يمكن أن يحتوي على 3 وهي : عملية لبوابة – أو مقاطعة لبوابة – أو مصيدة لبوابة

ماذا عن جدول الواصفات المحلي LDTR , هذا الجدول مشابة لجدول الواصفات الشامل GDTR

والفرق أن الأول محلي والثاني عام , وتستطيع أن تستخدم الجدول العام بدل المحلي

ويستخدم المحلي عادة لمعالجة الإستثناءات والأخطاء وبعض الإجرائات , وبعد قليل سنرى

في بعض الأمثلة على نظام وندوز أنة لا يستخدم جدول الواصفات المحلي ؟!!

المهم في النهاية سيصبح التخطيط لهذة الجداول بهذا الشكل :

وبعد الدراسة النظرية بقي التطبيق العملي على الثلاث جداول ,, لتثبيت المعلومات

أعتقد أنة لايوجد برنامج يستطيع الوصول إلى هذة المناطق في النظام عدى البرنامج الإحترافي – السوفت آيس –

نبدأ : شغل السوفت آيس عن طريق المفتاح Ctrl+D لتظهر لك نافذة الأوامر ,

الأمر الأول GDT وهو لعرض جدول الواصفات الشامل ومحتواة في نظام التشغيل الذي تستخدمة

لاحظ العمليات وكيف ترتيبها , ستلاحظ نفس المعلومات التي ذكرناها وهي

الحد – الأساس – حلقة البرنامج أو إمتيازاتة – وخصائصة

ولآن سنحاول الوصول لكود برنامج معرف في جدول الواصفات الشامل , نبدأ

شغل اي برنامج ديبغر تستطيع من خلالة عرض قيم مسجلات الأقسام للبرنامج , أنا سأستخدم olly

بعد تشغيل olly تجول في جهازك وإختر أي ملف تنفيذي , وبعد فك التجميع لاحظ قيم المسجلات

وأهم شيء مسجل قسم الكود CS , وليكن مثلا يساوي CS = 1B , والآن شغل السوفت آيس

ثم أكتب في سطر الأوامر GDT وإضغط إنتر , بعد ذلك إبحث عن الإزاحة x 1B , لاحظ المعلومات التي

بجانبة , أولاً: القسم هو قسم كود 32 بت بهذا الشكل code32 مستوى الإمتياز أو الحلقة يساوي 3

أي أنة برنامج في مستوى المستخدم , أما عن العنونة , سنفهمها في القسم الثاني من الدرس لأنها تتطلب فهم

لمجال العنونة وترقيم الصفحات والجداول ,,,

والآن جدول الواصفات المحلي , أنا ذكرت أن الوندوز لايستخدمة لأني أستند إلى هذة المعلومات

شغل السوفت آيس وفي سطر الأوامر أكتب LDT , لتظهر لك رسالة NO LDT

والجزء الأخير البوابات والمقاطعات , جدول المقاطعات

من خلال الدرس قد تستغرب ماهي البوابة ؟! سأدعك تجاوب بنفسك

شغل السوفت آيس وأكتب الأمر idt وسترى البوابة ! وهي عبارة عن إجرائات معرفة في الذاكرة

ويعرض لك السوفت آيس إسم التعريف وملف النظام الذي يحتويها ,,,

وفي مثالنا على وندوز إكس بي , هذة بعض ملفات النظام التي تحتوي على البوابات :

HAL.dll , ntoskrnl.exe ,dbgmsg.sys,..

بقي مسجل الحالة TSS , بالتأكيد لعرض معلوماتة تستخدم الأمر

الكاتب geek4arab

geek4arab

مواضيع متعلقة

التعليقات مغلقة