اهلا شباب ارجع اليكم اليوم بالدرس الثانى فى دورتنا لتصميم انظمة التشغيل
هذه الدورة هى دورة المستوى الاول فى تصميم انظمة التشغيل وهى ان شاء الله ستكون جزء من
3 دورات حتى الاحتراف فى مجال تصميم انظمة التشغيل
كنا قد وصلنا الى طباعة جملة فى درسنا السابق
وسنتابع اليوم
(BOOT.S)
سبق وقد امتلكنا الLoader الخاص بنا سوف ننتقل الان الى الوضع المحمى ( protected mode )
والبرنامج المخرج سنكتبه باذن الله بلغة السى
النواة ستكون نواة 32 bit
وسوف تبدا الاقلاع من bootsector وسنبنيها ب Gcc
اولا سنحتاج من المعالج ان يقوم بقراءة النواة لذا فمجددا سنستخدم
الفنكشن 0x2 المعدة من القطاع 0x13
recalibrate: mov ah, #0 mov dl, #FLOPPY_ID int 0x13 ; drive reinitialisation jc recalibrate call read_track ; calling kernel reading function jnc next_work ; if nothing bad happens, continue working bad_read ; if reding is not successful, output error mov bp,#error_read_msg mov cx, 7 call write_message inf1: jmp inf1 ; going to endless loop, so that we can be saved by "hand" rebooting only.
'طبعا القراءة الذاتية للكود سهلة للغاية :)
ينبغى علينا الان حفظ البارميترات وقراءة النواة دفعة واحدة
الصعوبة تبدأ عندما لا تتمكن النواة من ان تتناسب فى 17 sector
(i.e. 8.5 Kb)
لكن هذا سيكون فى المستقبل >>> الدروس المقبلة
لذا فليس علينا القلق من هذا الان
read_track: pusha push es push ds mov di, #sysseg mov es, di ; the data buffer address xor bx,bx mov ch, #START_TRACK ; track 0 mov c1, #START_SECTOR ; start from sector 2 mov dl, FLOPPY_ID mov dh, #START_HEAD mov ah, #2 mov al, #SYSSIZE ; read 10 sectors int 0x13 pop ds pop es popa ret
الان هذه هى النواة وتقرا بنجاح والان يمكننا اخراج رسائل اكثر
next_work: call kill_motor ; stop floppy drive mov bp,#load_msg ; output message mov cx,#4 call write_message this is the message, you want to output load_msg: .ascii "DONE" .byte 0 And here how you stop floppy: kill_motor: push dx push ax mov dx,#0x3f2 xor al,al out dx,al pop ax pop dx ret
الان من المفترض عند التنفيذ ان ترى الجملة المطبوعة
"Booting Arabic Dream of An Opreating System..."
والضوء من الفلوبى ان يغلق
الان المهم هو القفز الى الوضع او النمط المحمى
اولا علينا التحول الى سطر العنوان A20 وهذا يعنى انك ستستخدم 32 bit data addressing.
mov al, #0x01 ; the recording command for 8042 out #0x64, al mov al, #0xDF out #0x60, al
كما هو واضح للجميع فهذا يقفز بنا الى الوضع المحمى
protected_mode: mov bp,#load_msg mov cx, #25 call write_message the message load_msg: .byte 13,10 .ascii "Going to protected mode..." .byte 0
بينما البيوس ما يزا على قيد الحياة :lol: :lol: :) :)
علينا حفظ مؤشر التوقف الى وحفظه الى العنوان 0000:0x8000 والنواة سوف تستخدم هذه البيانات فيما بعد
save_cursor: mov ah,#0x03 ; read cursor position xor bh, bh int 0x10 seg cs mov [0x8000], dx ; save into special hidden place
انتباه يا مجند منك له :lol: :lol:
cli igdt GDT_DESCRIPTOR ; load descriptors table description The descriptors table consists of 3 describers: zero ( should present always), code segment and data segment. .align 4 .word 0 GDT_DESCRIPTORS: .word 3*8-1 ; descriptors table size .long 0x600 + GDT ; location of descriptors table .align 2 GDT: .long 0,0 ; e.g. 0 : empty descriptor .word 0xFFFF, 0 ; number 8: code descriptor .byte 0, CODE_ARB, 0xC0, 0 .word 0xFFFF, 0 ; number 0x10 : data descriptor .byte 0, DATA_ARB, 0xCF, 0
عملية الانتقال الى الوضع المحمى قد تنفذ بطريقتين فسوف نستخدم سطر الاوامر مثل Linux :wub:
mov ax, #1
lmsw ax ; later real mode
الان نحن بداخل الوضع المحمى وتمت عملية الانتقال اليه بنجاح
jmpi 0x1000, 8 ; Long jump onto 32 bit kernel
فى نهاية ملف الاسمبلى يمكنك ايضا اضافة
.org 511 .end_boot: .byte 0
والنتيجة ستكون ان حجم ملفك سيكون بالظبط 512 byte وهذا هو المطلوب
صح الدرس سهل وبسيط لكن ينبقى عليك التركيز والى اللقاء فى الدرس القادم
سنتكلم فيه عن التحرك داخل النواة واشياء تخصها
والى اللقاء
تحياتى لكم
