استكمالا لسلسلة اسئلة واجوبة حول تصميم انظمة التشغيل وعفوا للتأخير (نسيت اني بدأتها اساسا
)
سأضع اليوم معلومات عن السطر (احيانا يطلق عليها البوابة) A20
ما هى البوابة (العنوان / السطر) A20 ؟
عندما تم صناعة AT وتقديمها للسوق كانت قادرة وقتها على الوصول الى 16 ميجا بايت من الذاكرة ولكن من اجل ان تظل متوافقة مع IBM - XT بسبب ثغرة فى بنية XT وكانت عبارة عن memory wraparound فكان لابد ايضا من تكرار هذا الامر مع AT لكي تعمل الاشياء نفسها في AT لتطبيق مفهوم التوافق بين الاثنين وتحويل الخط 20 الى الناقل (A20) وهكذا استمر الامر فى العمل مع نفس الالتفافية (wraparound )
ويتم التحكم في البوابة A20 بواسطة وحدة التحكم (لوحة المفاتيح) . التي عادة ما تكون مشتقة من رقاقة 8042.
لماذا لا يمكنني الوصول إلى كل ما عندي من الذاكرة! لدي 128MB ويمكنني استخدام 1MB فقط ؟
السبب الرئيسي لعدم امكاننا الولوج (الوصول ) الى كل الذاكرة المتاحة لدينا هو اننا بحاجة الى تفعيل البوابة A20 ليتم هذا الامر بنجاح (راجع ما هو البوابة A20)
كيف يمكنني تفعيل البوابة A20 ؟
لتفعيل تلك البوابة علينا استخدام بعض اجهزة I/O باستخدام لوحة المفاتيح (8042 chip) وتفعيله ولفعل ذلك راجع بلغة السي انظر الكود التالي
باستخدام لغة C
void init_A20(void) { UCHAR a; disable_ints(); kyb_wait_until_done(); kyb_send_command(0xAD); // disable keyboard kyb_wait_until_done(); kyb_send_command(0xD0); // Read from input kyb_wait_until_done(); a=kyb_get_data(); kyb_wait_until_done(); kyb_send_command(0xD1); // Write to output kyb_wait_until_done(); kyb_send_data(a|2); kyb_wait_until_done(); kyb_send_command(0xAE); // enable keyboard enable_ints(); }باستخدام لغة الاسمبلي
;; ;; NASM 32bit assembler ;; [bits 32] [section .text] enable_A20: cli call a20wait mov al,0xAD out 0x64,al call a20wait mov al,0xD0 out 0x64,al call a20wait2 in al,0x60 push eax call a20wait mov al,0xD1 out 0x64,al call a20wait pop eax or al,2 out 0x60,al call a20wait mov al,0xAE out 0x64,al call a20wait ret a20wait: .l0: mov ecx,65536 .l1: in al,0x64 test al,2 jz .l2 loop .l1 jmp .l0 .l2: ret a20wait2: .l0: mov ecx,65536 .l1: in al,0x64 test al,1 jnz .l2 loop .l1 jmp .l0 .l2: ret
كيف يمكنني تحديد حجم الذاكرة RAM ؟
تحديد مقدار حجم ذاكرة الوصول العشوائي هى واحدة من اهم المهام التي علينا القيام بها اثناء تصميم النواة
وفى السابق فى تطوير انظمة التشغيل كان هذا سهل جدا لكن حاليا الامور اصعب قليلا
لماذا لم أذكر 64MB من الذاكرة؟ لأن هذا يمكن لجميع CMOS ان تصل الى ما يصل إلى 99mb ما قيمته . و عندما تواجه اجهزة مع 128MB ماذا ستفعل؟ وهناك بعض الوظائف والمقاطعات فى BIOS للتعامل مع الذاكرة واول مجموعة من النداءات (CALLS) التي تدعمها جميع انظمة BIOS تقوم بارجاع الموجود فى CMOS وذلك يجعلها غير ذات صلة وليست مضمونة ولكن هناك بعض Calls متقدمة لكن ليست كل Machines تدعمها كما انه ليس ما نريده والطريقة الاخري التي يستخدمها المبرمجين لفعل هذا
هي الوصول الى الذاكرة مباشرة واستخدام مسجلات الMiotherBoard لتحديد سجلات الذاكرة والعيب فى هذه الطريقة هى أنك يجب ان تعرف نوع المسجلات التي تدعمها الة المستخدم وماذا لو كانت متغيرة (
)
أنا افضل طريقة الوصول المباشرة مع فاصل لدي كل 1MB
هنا يمكن ملاحظة شئ ولا يجب معرفته لكن قد يفيد هو ان الاجهزة القديمة وربما حتي بعض الاجهزة حتي الان لكنها نادرة من الممكن ان تكون الذاكرة اقل من 64KB والتي لا تزال خارج اطار الذاكرة الموسعة 1MB لكن معظم اجهزة اليوم تدعم الذاكرة الموسعة باغلبية كبيرة جدا وعندما ستتعمق في مثل هذه الامور ستعرف المزيد والمزيد
وان شاء الله سنتكلم لاحقا عن تحديد الذاكرة العشوائية (RAM) باستخدام BIOS
تحياتي للجميع
والله ولى التوفيق
