البداية في برمجة أنظمة التشغيل ونظام BIOS وكتابة قطاع الإقلاع BOOT Sector

عام 0 geek4arab
Spread the love

سنبدأ بدراسة عملية الإقلاع لنظام التشغيل بداية ب BIOS إلى ان نصل إلى الواجهة الرسومية
تابع الخطوات:
الآن عندك جهاز كمبيوتر بجانبك … بشرط أن يكون مغلق . بمعنى أنة غير موصول بالكهرباء!

قم بتوصيل كل أجزاء الكمبيوتر+ تأكد من توصيل أسلاك الكهرباء + ضع أصبعك على زر التشغيل
هل أنت مستعد لتشغيل الكمبيوتر ؟!

سنقوم الآن بكتابة كل عملية تحدث من أول ما تضغط على زر التشغيل ..إلى أن تظهر نافذة نظام التشغيل

والآن إضغط على زر التشغيل وإقرأ كل كلمة في الموضوع وفكر بها جيداً … البداية

يبدأ موزع الكهرباء أو البور سبلاي بإمداد اللوحة الأم بالطاقة .. مباشرة تصل الطاقة إلى المعالج

يشتغل المعالج أول ما يقوم بة هو تصفير لكل مسجلات المعالج مثل ax وbx وds و..و..

بعد ذلك يقوم بشغلة مهمة لبدء التحكم .. يقوم المعالج بإعطاء المسجل cs وهو قسم الشفرة أو التنفيذ

القيمة F000 (كل الأرقام بالرمز الست عشري أو الهكس ) وبهذا يكون المعالج قد حدد قسم التنفيذ

وبعد ذلك يقوم بتحديد الإزاحة للقسم وأكيد بواسطة المسجل ip فيعطية القيمة FFF0

تلاحظ أن المعالج بدأ التنفيذ في النمط الحقيقي أي نمط 16 بت وقد إستخدم مسجلات هذا النمط

والسبب في ذلك هو التوافقية بين الأنظمة + إمكانية الوصول إلى أي عنوان في الذاكرة

والآن المعالج صفر أو هيأ كل المسجلات + حدد بداية التنفيذ في الذاكرة

بعد ذلك يقوم بنقل التنفيذ من العنوان الذي حددة المعالج إلى نظام الإدخال والإخراج الأساسي ( BIOS )

ماهو BIOS : عبارة عن برنامج مخزن في ذاكرة على اللوحة الأم تسمى الذاكرة ROM

وهي ذاكرة للقرائة فقط + أنها لاتفقد المعلومات المخزنة بها عند إغلاق الجهاز

والأمثلة على البرامج المخزنة في ذاكرة ROM كثيرة .. هل لاحظت شعارات الشركات في بداية تشغيل الكمبيوتر

مثل كرت الشاشة يظهر لك علامة تجارية مثلا SIS .. هذة البرامج كلها مخزنة في الذاكرة ROM

وللمعلومة : يمكن للهكر أو الكراكر(وهم المختصين في البرمجة العكسية ) الوصول للبرامج المخزنة في ROM !!؟

والآن كيف تعمل هذة البرامج … إذا فهمت BIOS ستعرف القصة !


كيف يعمل نظام BIOS ؟

بعد أن يجهز المعالج المسجلات يقوم بتسليم القيادة أو التحكم للنظام BIOS

يبدأ التنفيذ في BIOS عند السطر 430 ( في معالجات إنتل ) يقوم BIOS بعدد من المهام الأساسية

أول مهمة هي فحص قطع الجهاز :

لا تعتقد أن طريقة فحص الأجهزة أمر معقد … بكل بساطة يقوم BIOS بإرسال إشارة لمنفذ الجهاز

عن طريق الأمر out وبعد ذلك يقوم بإستقبال أي إشارة من الجهاز عن طريق الأمر IN

إذا وصلت أي إشارة من الجهاز معنى ذلك أنة شغال … وإذا لم تصل أي إشارة معناة خطأ في الجهاز

وهكذا مع كل أجهزة الكمبيوتر .

في نقطة مهمة في الفحص .. أول مايقوم بة BIOS فحص كرت الشاشة + منفذ الشاشة

إذا وجد أي خطأ فية ( بمعنى أن الشاشة لا تعمل ولايمكن رؤية أي ملاحظة يكتبها BIOS على الشاشة )

يقوم الbios في هذة الحال بإستخدام طريقة الأصوات أو الصافرة لعرض أي خطأ في عملية الفحص

أمثلة لأهل الصيانة

قمت بتشغيل الجهاز .. لم يعمل الجهاز .. لم يصدر BIOS أي صوت ( على طول الخطأ في البور سبلاي )

لأنة كما ذكرنا. يقوم BIOS بإصدار صوت إذا وجد خطأ. وإذا لم يصدر أي صوت معنى ذلك أن التنفيذ

لم يصل إلى BIOS .. لاحظ معنى الأصوات

صافرة واحدة قصيرة = لا توجد أخطاء في عملية الفحص

صافرتين قصيرة = خطأ في كرت الشاشة أو طريقة توصيل الشاشة

وهكذا مع كل الأخطاء

والنقطة الثانية … إذا كانت الشاشة شغالة ( يتم عرض الأخطاء بطريقة الأرقام )

أخطاء BIOS في كلى الحالتين تجدها هنا :
http://www.pchell.com/hardware/beepcodes.shtml

بعد أن يقوم BIOS بفحص الأجهزة يقوم بإنشاء جدولين

الأول : جدول مقاطعات ال BIOS

عند العنوان 0000:0000 ( العنوان صفر ) يبدأ بكتابة عنواين المقاطعات .كل مقاطعة

تأخذ لها 4 بايت .. لتدل على عنوان بداية تنفيذ المقاطعة , بهذا الشكل

المقاطعة صفر INT 0 عنوانها 0000:0000 (هذا العنوا يحتوي على عنوان التنفيذ)

المقاطعة واحد INT 1 عنوانها 0000:0004 , المقاطعة 2 عنوانها 0000:0008

هذا الجدول الأول ( جدول المقاطعات )

INT 00h 0000:0000h =مقاطعة لراية الفيض في القسمة
INT 01h 0000:0004h = مقاطعة المعالج للتنفيذ خطوة ..خطوة
INT 02h 0000:0008h = NMI مقاطعة الأجهزة الخارجية لمايعرف بدبوس
INT 03h 0000:000Ch =مقاطعة لكتابة نقطة توقف للبرنامج
INT 04h 0000:0010h =مقاطعة راية الفيض في مسجل الحالة
INT 05h 0000:0014h = طباعة الشاشة
INT 06h 0000:0018h =مقاطعة لإختبار تنفيذ تعليمة غير مصرح لها
INT 07h 0000:001Ch =مقاطعة ضغط وتشفير التعليمات
INT 08h 0000:0020h = خدمات المؤقت
INT 09h 0000:0024h = خدمات الجهاز المشغل للوحة المفاتيح
INT 0Ah 0000:0028h =مقاطعة تستخدم في التبديل بين المهام
INT 0Bh 0000:002Ch = خدمة المنفذ التسلسلي com2
INT 0Ch 0000:0030h =خدمة المنفذ com2
INT 0Dh 0000:0034h = خدمة المنفذ المتوازي LPT 2
INT 0Eh 0000:0038h =خدمات القرص المرن
INT 0Fh 0000:003Ch =خدمة المنفذ LPT1
INT 10h 0000:0040h = خدمات شاشة العرض
INT 11h 0000:0044h =مقاطعة تعيد الأجهزة المتصلة بالكمبيوتر
INT 12h 0000:0048H = مقاطعة حجم الذاكرة
INT 13h 0000:004Ch = خدمات القرص الصلب
INT 14h 0000:0050h = خدمات منافذ لإتصالات
INT 15h 0000:0054h = خدمات النظام
INT 16h 0000:0058h = خدمات لوحة المفاتيح
INT 17h 0000:005Ch = خدمات الطابعة
INT 18h 0000:0060h = خدمات لتحميل ROM BASIC
INT 19h 0000:0064h = مقاطعة تحفيز قرص الإقلاع
INT 1Ah 0000:0068h = خدمات الوقت الحقيقي للساعة
INT 1Bh 0000:006Ch =تحديد مدة الإستجابة للوحة المفاتيح
INT 1Ch 0000:0070h =مقاطة التوقيت مقدر باللحظة
1Dh 00000074h =مقاطعة جدول وبارمترات شاشة العرض
1Eh 0000:0078h =مقاطعة جدول وبارمترات القرص المرن
1Fh 0000:007Ch = مقاطعة خصائص الخط والمحارف

تلاحظ أننا توقفنا عند العنوان address=1F … أين بقية المقاطعات

باقي المقاطعات سنكتبها في وقتها.. لأن نظام الدوس يتطفل ويبدأ في الكتابة عند العنوان الذي توقفنا عندة

المهم : ماالفائدة من هذا الجدول + ما الفائدة من المقاطعات ؟!

أولا : الفائدة من الجدول هي نقل التنفيذ .. والمثال على ذلك في وندوز مكاتب الربط dll

يمكن يكون الشرح غير مفهوم : والحل بالطبيق العملي

من قائمة start ثم run إكتب debug وإضغط أوكي

ما رأيكم بمقاطعة حجم الذاكرة وهي المقاطعة 12 .. عنوانها في الذاكرة 0000:0048

في برنامج الديبغر أكتب الأمر D 0000:0048 وهو عنوان المقاطعة , إحفظ أول 4 بايتات

ولتكن مثلا : AA 09 0E 02 طبق عليها قانون العكس فتساوي n= 020E:09AA

هل تعرف مايمثلة العنوان , هو بداية التنفيذ لشفرة المقاطعة … جرب إذهب للعنوان

بواسطة أمر فك التجميع u 020E:09AA ولاحظ كيف تنفذ المقاطعة

الفائدة من المقاطعة :

أهم فائدة هي تبسيط الأمور وهو إسلوب متبع إلى الآن في الأنظمة الحديثة مثل وندوز xp

ما رأيكم بتشريح مقاطعة إظهار حجم الذاكرة .. لأنها أسهل مقاطعة و أول مقاطعة ينفذها BIOS

كل مرة عند تشغيلك لجهازك ترى بأن النظام BIOS بعد فحص الأجهزة يعرض لك حجم الذاكرة

هل تريد أن تعرف كيف ينفذها .. عن طريق برمجة المنافذ + البرمجة المباشرة للذاكرة

بهذا الكود :

mov al,18h
out 70h,al
in al,71h
mov ah,al
mov al,17h
out 70h,al
in al,71h

بعد تنفيذ هذا الكود سيصبح مسجل ax = حجم الذاكرة

هل عرفت فائدة المقاطعة – فقط إستبدل كل الكود بتعليمة المقاطعة INT 12 وسيحمل المسجل ax بحجم الذاكرة

هذا هو مفهوم المقاطعة , بعد ذلك يبدأ اBIOS في بناء الجدول الثاني

جدول معلومات ال BIOS :

وهو جدول يخزن بة BIOS معلومات عن الأجهزة (الهاردوير) الموجودة في الجهاز

يبدأ نظام BIOS في كتابة معلوماتة عند العنوان 0040:0000

وهذة المعلومات هي

0040:0000h =عنوان المنفذ com1
0040:0002h =عنوان المنفذ com2
0040:0004h =عنوان المنفذ com3
0040:0006h =عنوان المنفذ com4
0040:0008h =عنوان المنفذ LPT1
0040:000Ah =عنوان المنفذ LPT2
0040:000Ch =عنوان المنفذ LPT3
0040:000Eh =عنوان المنفذ LPT4
0040:0010h =مجموعة الأجهزة وهو عبارة عن 16 بت تمثل الأجهزة المثبتة
0040:0012h = رايات المقاطعة والتحقق من الأخطاء
0040:0013h =حجم الذاكرة بالبايت
0040:0015h = معرف أو كود الخطأ

0040:0017h = رايات الحالة والتغير في لوحة المفاتيح
0040:001Ah = مؤشر إلى الحرف التالي في مخزن لوحة المفاتيح
0040:001Ch = مؤشر إلى الحرف الأخير في مخزن لوحة المفاتيح
0040:001Eh =محتوى مخزن لوحة المفاتيح

0040:003Eh =معرف القرص المرن A=0 – B=1 C=2 ..
0040:003Fh = حالة محرك الأقراص المرن
0040:0042h = مسجل التحكم للقرص الصلب والمرن

0040:0049h = إعدادات نمط شاشة العرض
0040:004Ah =عدد الأعمدة في كل سطر
0040:004Ch =حجم الصفحة في شاشة العرض
0040:0050h = نقطة ظهور المؤشر في شاشة العرض
0040:0063h = يحتوي على عنوان منفذ الإدخال والإخراج لشاشة العرض
0040:066h = لوحة الألوان لشاشة العرض

0040:075h = عدد الأقراص الصلبة في الجهاز
0040:076h =بايت التحكم للقرص الصلب
0040:077h =عنوان منفذ الإدخال والإخراج للقرص الصلب
0040:08Dh =مسجل أخطاء القرص الصلب

0040:0A1h = معرف كرت الشبكة المحلية
0040:0F0h = منطقة معلومات الإتصالات بين التطبيقات

وبهذا يكون نظام الbios قد جهز خدماتة وهي المقاطعات وبعد ذلك جهز معلوماتة
بعد ذلك يبحث عن نظام التشغيل لتحميلة إلى الذاكرة وتسليمة مهمة القيادة والتحكم


الآن: تحميل نظام التشغيل إلى الذاكرة وبداية عملة :

يبدأ الBIOS في البحث عن مشغل النظام وهو ما يعرف بقطاع الإقلاع boot sector

قد يكون في قرص مرن أو قرص صلب أو حتى CD , المهم أن BIOS يبدأ البحث

في كل الأقراص .. حسب الترتيب الذي حددتة في إعدادات BIOS

دائما يكون قطاع الإقلاع هو القطاع الأول في القرص ويجب أن يحمل علامة تدل على أنة قطاع إقلاع

العلامة هي أن يكون آخر بايتين في القطاع = AA 55

كتابة برنامج إقلاع في القطاع الأول شغلة سهلة لأن الموضوع يتطلب فهم أمرين فقط

الأول: إستخدام مقاطعات الBIOS

برنامج الإقلاع القياسي يستخدم مقاطعتين فقط وهي المقاطعة 13 لتحميل الملفات من القرص

والمقاطعة 19 لتحفيز القرص للإقلاع (وهذة المقاطعة قد لا تستخدم دائما )

والأمر الثاني : معرفة العناوين الذي سينتقل لها التنفيذ + معرفة مخزن القرائة من القرص

سنتابع قصة إقلاع الكمبيوتر وستتضح الأمور .

توقفنا عند BIOS وطريقة تحملية لنظام التشغيل , وقلنا أنة سيحمل قطاع واحد فقط

بعد أن يجد قطاع الإقلاع سيقوم بتحميلة إلى العنوان address =7C00

ماذا تستفيد من معرفة عنوان التحميل .. أول شيء تقوم بة إعطاء المسجل cs هذة القيمة

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

أو تحميل برنامج معين , في أمور مهمة عند هذة النقطة ؟ ماذا يعرف BIOS عن القرص

هل مرت عليك أنظمة الملفات مثل FAT ,NFS ,ex2..3 وغيرها من أنظمة ملفات وندوز ولينكس

بإختصار برنامج BIOS لا يعرف شيء عن هذة الخرابيط ولا يعرف حتى أسامي الملفات ولا أين تبدأ وأين تنتهي

ما يعرفة BIOS هو تركيب القرص الفيزيائي مثل الرأس و الإسطوانة و القطاع والمسار

سأعطيك مثال بارمترات مقاطعة قرائة محتوى القرص

AH=0x02 // خدمة قرائة القرص وتحميل البرامج إلى الذاكرة

AL=عدد القطاعات

CH=رقم المسار

CL=رقم القطاع

DH=رقم الرأس

DL=رقم القرص

ES:DX=مؤشر إلى المخزن

قد تعتقد أن تحديد ملف معين أمر معقد , ولهذا السبب ظهرت أنظمة الملفات مثل FAT و..و

ولكن إذا قمت أنت بكتابة ملف معين في قطاعات القرص بكل بساطة تستطيع أن تحدد موقعة بالضبط

ملاحظة: في آخر بارمتر وهو ES:DX هذا البارمتر لا تكتب بة شيء لأنك عندما تنفذ المقاطعة int13

سيقوم الBIOS بكتابة عنوان تحميل البرنامج إلى الموقع ES:DX , وبهذا تقوم بحفظ هذا العنوان

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

قد لا تصدق أن تحميل النظام بكل هذة البساطة ,, مارأيك بمثال

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

وأول ما تشغل الكمبيوتر , وبعد عملية فحص الأجهزة .. سيظهر برنامجنا بكل ثقة ؟!

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

الآن قم بإدخال القرص المضغوط( الفلوبي ) لا يهم إذا كان مفرمت أو لا لأن الBIOS لا يعرف شيء من هذا

ولكن لوكان القرص مفرمت سيوفر علينا كتابة توقيع قطاع الإقلاع وهو AA 55 في آخر بايتين

بعد ذلك من قائمة start ثم run إكتب debug لتشغيل برنامج الديبغر وستلاحظ ظهور العلامة –

عند العلامة إكتب الأمر L 100 0 0 1

الحرف L معناة تحميل قطاع من القرص إلى الذاكرة 100 تعني إلى العنوان 100 في نفس المقطع

الصفر الأولى = محرك الأقراص A و الصفر الثانية تعني رقم القطاع وهو0 أي قطاع الإقلاع

الواحد الأخير يعني عدد القطاعات التي تريد تحميلها إلى الذاكرة عند العنوان 100

بهذا الأمر نكون حملنا قطاع الإقلاع إلى الذاكرة , والآن نريد أن نكتب بة برنامج صغير

أكتب عند علامة – التعليمة a 100 أي أننا نريد كتابة كود إسمبلي عند العنوان 100

بعد ذلك إكتب البرنامج :

– a 100

-0B3A:0100 mov ah,09
-0B3A:0102 mov al,42
-0B3A:0104 mov bh,0
-0B3A:0106 mov bl,14
-0B3A:0108 mov cx,10
-0B3A:010B int 10

العناوين يكتبها الديبغر نفسة وقد تتغير .. لا يهم . أهم شيء هي التعليمات

البرنامج الذي كتبناة هو عبارة عن مقاطعة إظهار حرف على الشاشة , الرقم 42 يمثل الحرف B

الرقم 14 يمثل لون الحرف ولون الخلفية الرقم 10 يمثل عدد تكرار الحرف على الشاشة

بعد ذلك سنقوم بإدخال برنامجنا إلى العنوان 100 وتخزينة في الذاكرة , بإستخدام التعليمة e 100

-e 100
0B3A:0100 B4. 09. B0. 42. B7. 00. B3. 14.
0B3A:0108 B9. 10. 00. CD. 10.

كما شرحت سابقا يتم إدخال كل بايت بإستخدام مفتاح المسافة في لوحة المفاتيح

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

بهذة الطريقة : W 100 0 0 1

ولآن تأكد من أن القرص المضغوط بداخل السواقة

تأكد من أن ترتيب الإقلاع في إعدادات الBIOS يبدأ من القرص المضغوط

وأعد تشغيل الجهاز ……. ولاحظ( برنامجك على الشاشة )

ألف مبروك أصبحت مبرمج أنظمة معتمد ?!!

الكاتب geek4arab

geek4arab

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

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