سنستكمل الدرس العاشر واسف على التاخير لكن هذه الفترة عندى اختبارات
شرح موجز لبنية وطريقة عمل الأقراص :
داخل الغلاف البلاستيكي يوجد قرص مغلف بشريط مغناطيسي ( مثل أشرطة الفيديو)، عندما يراد تخزين المعلومات داخل القرص يقوم قارئ الأقراص بتشفير المعلومات على شكل رموز مغناطيسية. بالطريقة نفسها يقوم القارئ عند القراءة بفك هذه الرموز و ترجمتها إلى رموز ثنائية (Binary).
يحتوي القارئ على: - محرك يقوم بجعل القرص يدور بسرعة معينة. – رأسين من أجل القراءة و الكتابة، كل رأس في جهة ( هذا لأن القرص المرن يحتوي على جهتين). – كل من الرأسين متصل بذراع آلي يقوم بتحريك الرأس من وسط القرص إلى جانبه أو العكس عبر شعاع الحلقات.
تتقسم مساحة القرص إلى حلقات دائرية بدءا بحواف القرص و انتهاء بوسطه ( أنظر الشكل 1-1)، كل حلقة مقسمة إلى عدة قطاعات. و كل قطاع يحتوي على نفس الكمية من المعلومات، في أغلب الأحيان يكون طول القطاع 512 بايت.
الأقراص الصلبة لها نفس التصميم، الفرق الوحيد هو أنه بدل قرص بلاستيكي يوجد قرص من مادة صلبة كالزجاج مما يتيح لها الدوران بسرعة أكبر بكثير من الأقراص المرنة. ذلك ما يجعل القراءة والكتابة في الأقراص الصلبة أسرع بكثير. أيضا بدل الوجه المزدوج للقرص المرن توجد به عدة أقراص مرتبة فوق بعضها البعض.
بما أن للقرص المرن وجهان (و للقرص الصلب عدة أوجه)، تشكل الحلقات التي توجد في نفس الترتيب على مختلف الأوجه ما يشبه الموشور(cylinder).
من وجهة نظر المبرمج، من أجل قراءة أو كتابة قطاع معين ينبغي تحديد : 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
ومعلومات من مشروع الخوارزمى الله يرحمه :) :)