الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الدرس العاشر- الجزء الثانى(تحميل النواة من القرص المرن)

بدأه MohamedIBrahim في 23 أبريل 2011 · 0 رد · 810 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1

سنستكمل الدرس العاشر واسف على التاخير لكن هذه الفترة عندى اختبارات

شرح موجز لبنية وطريقة عمل الأقراص :

داخل الغلاف البلاستيكي يوجد قرص مغلف بشريط مغناطيسي ( مثل أشرطة الفيديو)، عندما يراد تخزين المعلومات داخل القرص يقوم قارئ الأقراص بتشفير المعلومات على شكل رموز مغناطيسية. بالطريقة نفسها يقوم القارئ عند القراءة بفك هذه الرموز و ترجمتها إلى رموز ثنائية (Binary).

post-238860-029809600 1303573076_thumb.g

يحتوي القارئ على: - محرك يقوم بجعل القرص يدور بسرعة معينة. – رأسين من أجل القراءة و الكتابة، كل رأس في جهة ( هذا لأن القرص المرن يحتوي على جهتين). – كل من الرأسين متصل بذراع آلي يقوم بتحريك الرأس من وسط القرص إلى جانبه أو العكس عبر شعاع الحلقات.

تتقسم مساحة القرص إلى حلقات دائرية بدءا بحواف القرص و انتهاء بوسطه ( أنظر الشكل 1-1)، كل حلقة مقسمة إلى عدة قطاعات. و كل قطاع يحتوي على نفس الكمية من المعلومات، في أغلب الأحيان يكون طول القطاع 512 بايت.

الأقراص الصلبة لها نفس التصميم، الفرق الوحيد هو أنه بدل قرص بلاستيكي يوجد قرص من مادة صلبة كالزجاج مما يتيح لها الدوران بسرعة أكبر بكثير من الأقراص المرنة. ذلك ما يجعل القراءة والكتابة في الأقراص الصلبة أسرع بكثير. أيضا بدل الوجه المزدوج للقرص المرن توجد به عدة أقراص مرتبة فوق بعضها البعض.

post-238860-047952700 1303573192_thumb.j

بما أن للقرص المرن وجهان (و للقرص الصلب عدة أوجه)، تشكل الحلقات التي توجد في نفس الترتيب على مختلف الأوجه ما يشبه الموشور(cylinder).

post-238860-034684200 1303573213_thumb.j

من وجهة نظر المبرمج، من أجل قراءة أو كتابة قطاع معين ينبغي تحديد : 1- رقم الموشور، 2- رقم الجهة ( أو الرأس) داخل الموشور، 3- رقم القطاع داخل الحلقة.

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

يجب التنبيه هنا على أن أرقام القطاعات تبدأ من 1 بينما أرقام الموشورات والجهات تبدأ من الصفر.

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

استعمال الوظيفة 2: تقوم بقراءة القطاعات من القرص المرن أو الصلب



المدخل(input)



es:bx -  الموقع الذي سيحمل إليه القطاع (أو القطاعات) في الذاكرة

es: عنوان القسم (segment adress)

bx: العنوان داخل القسم (Offset)



ah        -  رقم الوظيفة (2)

dh       – رقم الوجه ( القرص المرن له وجهان الوجه الأول يبدأ ب 0)

dl         -  رقم القارئ ( 0: القرص المرن A )

ch        – رقم الموشور

cl         – رقم القطاع (القطاعات تبدأ من 1)

al         – عدد القطاعات المطلوب قراءتها



المخرج  (output)



CF (carry flag) = 0:  نجحت العملية، و تم تحميل البيانات إلى العنوان المطلوب

CF (carry flag) = 1: هناك خطأ، السجل ah يحتوي على رمز الخطأ

في هذه المرحلة سيكن لدينا برنامجان، الأول هو قطاع الانطلاق و طوله 512 بايت يتم تخزينه على القطاع الأول، يأتي بعده برنامج النواة على القطاع الثاني.

بعد هذه المقدمة يمكننا المرور إلى كتابة البرنامج. فيما يلي الإضافات التي سندخلها على قطاع الانطلاق

mov [bootdrv], dl

dl يحتوي على رقم القرص الذي تم الانطلاق منه، نقوم بتحزينه في المتغير bootdrv

xor ax, ax

int 0x13

استعمال الوظيفة 0 : الهدف هو تهيئة القرص من أجل القراءة

الإنقطاع 0x13 هو المدخل إلى الوظائف المتعلقة بالأقراص

mov ax,0x100

mov es,ax

mov bx,0

mov ah,2

mov al,1

mov ch,0

mov cl,2

mov dh,0

mov dl,[bootdrv]

int 0x13

jc readFail

ret



readFail:

mov si, readErrorMsg

call ShowMsg

ret

استعمال الوظيفة 2: تقوم بقراءة القطاعات من القرص المرن أو الصلب

es:bx - الموقع الذي سيحمل إليه القطاع (أو القطاعات) في الذاكرة في هذه الحالة : 0x100:0 (= 0x1000)

ah - رقم الوظيفة (2)

dh – رقم الوجه ( القرص المرن له وجهان الوجه الأول يبتدء ب 0)

dl - رقم القارئ ( 0: القرص المرن A )

ch – رقم الموشور

cl – رقم القطاع

al – عدد القطاعات المطلوب قراءتها

في حالة وقوع خطأ(CF=1-> jc = true) نقفز إلى readFail حيث نقوم بكتابة الجملة

"Error, unable to read from floppy"

بعد هذه التعليمات نكون قد حملنا النواة إلى العنوان 0x100:0 (أي العنوان 0x1000[=0x100*4+0] بالصيغة الخطية). للبدء بتنفيذ النواة نقوم بالقفز إلى العنوان المذكور.

jmp dword 0x100:0

يتم القفز إلى العنوان الذي حملت إليه النواة

اعلم ان هذا الدرس ليس مفهوما جيدا لكنه تقريبا مكرر لكن بتفصيل اكبر وشرح افضل

وفى المرة الاقدمة سنبدأ فى الحديث عن File Systems

اتمنى يكون الدرس خفيف عليكم

تحياتى

المرجع كتاب Opreating System Design

ومعلومات من مشروع الخوارزمى الله يرحمه :) :)

المرفقات
image002.gifimage006.jpgimage011.jpg

GoodBye

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…