السلام عليكم ورحمه الله وبركاته
اخباركم يا شباب الفريق اتمنى يكون الجميع بخير بما انى لدى وقت فراغ هذه الايام فقررت الاسهام باحدى الدورات
وهى دورة بسيطة لانشاء نظام تشغيل بسيط يكون نواة تعريفية للحلم العربى بعمل نظام تشغيل وان شاء الله بيكون كل اسبوع درسين
وارجو من الادارة الاعتراف بالدورة رسميا
الدرس الاول :
فى هذه الدورة سوف نتعرف كيفية بناء نظام التشغيل من الصفر ان شاء الله
ولتسهيل الدورة وجعلها مقدمة فقط سيكون نظام التشغيل خاصتنا mini ويطبع فقط جملة Arabic Dream of An Opreating System
الشئ الاول الذى علينا التفكير فيه عند تصميم نظام تشغيل هو نظام الاقلاع المسمى البيوس
لان CPU يقلع ويتم تحميله فى الوضع 16 BIT
لنستطيع عمل boot sector سوف نحتاج الى استخدام assembler وlinker من bin86 package
هناك طبعا اشياء اخرى وافضل
لكن فى هذه الدورة سنستخدم هذه الادوات السهلة
1- Boot sector (boot.s)
انا لن اقوم بكتابة كل السورس للملف لكى تتعرف اكثر على الملف وحتى لا يحدث كسل ولكى اسهل فهم الفكرة العامة فانا لست بصدد عمل نظام التشغيل الكامل الان
فى البداية علينا القيام بتعريف الثوابت العامة
START_TRACK = 0 - The track, we start reading from.
START_SECTOR = 2 - The sector, we will start reading the OS from
SYSSIZE = 10 - The size in sectors (1 sector = 512 byte)
FLOPPY_ID = 0 -The ID of the drive (0 - is first, 1 is second)
HEADS = 2 - Number of heads
SECTORS = 18 - Number of sectors for a floppy ( 18 for 1.44 Mb)
START_HEAD = 0 - The device head, we will be using.
التعليقات بالانجليزى لاننى لم اكتب فى حياتى تعليق بالعربى + فى مجال انظمة التشغيل هناك مصطلحات لا اعرف كيف اترجمها الى العربية وبما ان الدورة اساسا موجهة للمحترفين سيكون من المفترض ان يكونوا يجيدون الانجيليزية بمستوى متوسط على الاقل
نرجع الى موضوعنا
أثناء الاقلاع سيحدث ما يلى
BIOS loader سيقوم بقراءة الsector الاول من الFloppy ويضعه فى العنوان 0000:0x7c00 ويقوم بنقل التحكم اليه
سوف نقوم بالحصول عليه فى البداية يجب علينا ان نقوم بتحريك Lower الى العنوان 0000:0x600
ومن ثم نستكمل
وكل ما سنحتاجه بالفعل هو اقلاع النواة ل sector 2-12 على الtrack الاول من الفلوبى (floppy) الى العنوان 0x100:0000
لكى نقوم بالانتقال الى الوضع المحمى ويتم القفز الى بداية النواة (first rows of the kernel.) وبسبب هذا ستحتاج الى القليل من الثوابت الاخرى
INITSEG = 0x600 - Here we will move it
SYSSEG = 0x100 - Our kernel will go here
DATA_ARB = 0x92 - The definer of data segment for descriptor
CODE_ARB = 0x9A - The definer of code segment for descriptor
BOOTSEG = 0x7c00 - We will put the booting BIOS sector here
اولا نحتاج الى تحريك انفسنا الى المكان المناسب
xor ax,ax
mov ss,ax
mov sp, #BOOTSEG
mov si, sp
mov ds, ax
mov es, ax
sti
cld
move di, #INITSEG
mov cx, #0x100
repnz
movsw
jmpi go, #0 ; jump into new place of the boot sector , mark "go"
Now we have to configure data segments (es,ds)
go:
mov ax, #0xF0
mov ss,ax
mov sp, ax
0xF0:0xF0=0xFF0
mov ax, #0x60 ;we'll set data segments in 0x60
mov ds,ax
mov es,ax
cli
فى النهاية سيكون بمقدورنا الان عمل رسالة مخرجية لاننا نمتلك BIOS
نستطيع استخدام الفنكشن 0x13 من القطاع 0x10 نستطيع ايضا تجاهله والكتابة مباشرة الى Video memory
لكننا نمتلك فقط المساحة المسموح بها للبيوس هى 512 bytes وهى ليست ابدا بالمساحة الكبيرة وسوف نقوم الاعتماد على شئ اخر
mov cx,#18
mov bp,#boot_msg
call write_message
الفنكشن write_message تبدو هكذا
push bx
push ax
push cx
push dx
push cx
mov ah, #0x03; read the current cursor position, so that we don't output the message anywhere.
xor bh,bh
int 0x10
pop cx
mov bx,#0x0007 ; parameters of outputted symbols: videopage 0, attribute 7 (black and grey)
mov ax,#0x1301 ; outputting prompt and moving cursor
int 0x10
pop dx
pop cx
pop ax
pop bx
ret
write_message:
والرسالة هكذا
.byte 13,10
.ascii "Booting Arabic Dream of An Opreating System..."
.byte 0
boot_msg:
هذا افضل بكثير من كتابة Helloworld
وهكذا قد امتلكنا ال Loader الخاص بنظامنا والى هنا ايضا ينتهى الدرس الاول
والى اللقاء فى درس جديد وارج وان يكون وقتها قد تم الاعتراف بالدورة رسميا من الادارة
والسلام عليكم ورحمه الله وبركاته




