تطوير نظام تشغيل متماثل يونيكس - الشروع في العمل (1)

فيما يتعلق بالمراجعات السلبية للمقال التجريبي "تطوير OC يشبه Microkernel OC - المجدول" ، قررت إعادة تشغيل سلسلة المقالات ، مع مراعاة بعض التعليقات. الآن ، بعد أن أدركت جمهوري المستهدف ، تمكنت من تحويل التركيز من لطفي إلى أولئك الذين يحتاجون إليه حقًا.

ردود على التعليقات على المادة السابقة.


ملاحظة 1. المجدول بسيط للغاية.

منذ نشر المقال السابق ، تغير الرمز كثيرًا. تم تشكيل نواة كاملة ، والتي لم تعد نووية دقيقة. هناك دعم لقرص ذاكرة الوصول العشوائي الأولي (نظام ملفات kernel) ، ودعم الذاكرة الظاهرية (MMU). أصبح من الممكن لـ kernel كتابة برامج مخصصة. كانت هناك مكالمات النظام ومكتبة clib (stdio ، سلسلة). لذلك ، /initrd/sh.elf shell هو برنامج منفصل يتم تحليله بواسطة أداة تحميل boot elf وتشغيله كعملية.

قائمة أوامر shell: exec <file.elf> ، ps ، القتل ، الخروج. في هذه الحالة ، يمكن إطلاق القشرة من القشرة نفسها (مما يدل على تعدد المهام).

ملاحظة 2. الكثير من السحر وراء الكواليس في دروس الفيديو.

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

ملاحظة 3. أين هو الرابط إلى جيثب ؟

الآن هي كذلك. في وصف الفيديو على يوتيوب (نعم ، أريدك ألا تمر في دروس الفيديو الخاصة بي ، على الأقل إلقاء نظرة على عين واحدة).

الملاحظة 4. يجب أن نبدأ بالتجميع أولاً.

هذا هو ما سنفعله.

ملاحظة 5. أنت لا تكتب أي شيء ولكن مجرد تعليق.

نعم ، كان من الخطأ التحدث عن شيء كبير على الفور. سننتقل الآن خطوة بخطوة ، بالتدريج ، بدءًا من أبسط Hello World kernel. ستتيح لك دروس الفيديو إنشاء صورة شاملة للعالم ، وسوف تغمرك شفرة المصدر في جيثب في التفاصيل.

جدول المحتويات.


1. بناء نظام (جعل ، مجلس التعاون الخليجي ، الغاز). التمهيد الأولي (متعدد التمهيد). إطلاق (qemu). مكتبة C (strcpy ، memcpy ، strext).
2. مكتبة C (sprintf ، strcpy ، strcmp ، strtok ، va_list ...). بناء المكتبة في وضع kernel ووضع تطبيق المستخدم.
3. سجل نظام النواة. ذاكرة الفيديو الإخراج إلى المحطة (kprintf ، kpanic ، kassert).
4. الذاكرة الديناميكية ، حفنة (kmalloc ، kfree).
6. تنظيم الذاكرة والتعامل مع المقاطعة (GDT ، IDT ، PIC ، syscall). الاستثناءات.
5. الذاكرة الافتراضية (دليل الصفحة وجدول الصفحة).
6. هذه العملية. المجدول. تعدد المهام. مكالمات النظام (القتل ، الخروج ، ملاحظة).
7. نظام الملفات من النواة (initrd) ، قزم والداخلية لها. مكالمات النظام (exec).
8. برامج تشغيل الأجهزة الشخصية. مكالمات النظام (ioctl ، fopen ، fread ، fwrite). مكتبة C (fopen ، fclose ، fprintf ، fscanf).
9. قذيفة كبرنامج كامل للنواة.
10. وضع حماية المستخدم (ring3). قسم حالة المهمة (tss).

دعنا نذهب. الجزء 1. بناء النظام وإطلاق


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

تحتاج لينكس. سوف نجمع جعل القديم الجيد. من أجل ترجمة الملف القابل للتنفيذ kernel ، يلزم الإشارات التالية:

CC_FLAGS=-g -m32 -isystem $(IDIR) -I include -DKERNEL=1 -fno-stack-protector -Wall -Werror -fno-pie AS_FLAGS=-g --32 LD_FLAGS=-m elf_i386 

كمحاكي للأجهزة ، قم بتثبيت محاكي qemu على نظام Linux. سنقوم بتشغيل نواة لدينا مثل هذا:

 qemu-system-i386 -kernel ./bin/kernel.elf 

سيتطلب أيضًا نصًا صغيرًا للرابط. هناك حاجة لتحميل المقاطع في العنوان الصحيح وبالترتيب الصحيح. أيضا في ذلك سنشير نقطة الدخول:

 OUTPUT_FORMAT(elf32-i386) ENTRY(start) SECTIONS { . = 0x100000; .text : { *(.text) } .data : { *(.data) } .bss : { *(.bss) } } 

نظرًا لأن النواة سيتم تحميلها وفقًا لمواصفات التشغيل المتعدد ، فإن الرأس مطلوب في بداية قسم الكود:

 .code32 .text # multiboot spec .align 4 multiboot: .long 0x1BADB002 # magic .long 0x00 # flags .long -(0x1BADB002 + 0x00) # checksum. m+f+c should be zero 

يوصى بالتبديل الفوري إلى المكدس الخاص بك وإعداد جدول واصف عمومي. تحديد المكدس الخاص بنا:

 .bss .fill 8192,1 # 8Kb stack: 

اكتب نقطة دخول قد تجد بناء جملة جنو المجمّع غير عادي. لقد فضلت مرة واحدة أيضًا بناء جملة Intel ، ثم بعد أن ذاقته ، وأتجهز في شفرة مصدر Linux ، فضلت تمامًا بناء جملة AT & T بنفسي ، والشيء الرئيسي الذي يجب تذكره هو أن لديهم معاملات معاكسة. الباقي سيكون بديهية.

 start: cli movl $stack,%esp push %esp push %ebx /* address of struct multiboot_t */ call kernel_start /* should never return */ hlt 

هذا يكمل رمز boilerplate. المرح يبدأ. الآن يمكننا كتابة الكود في C. وقبل كل شيء ، سوف نحدد رسالة الترحيب.

 char *hello = "Hello world!"; int screen_size = 80 * 25; 

بعد ذلك ، نكتب نقطة الإدخال نفسها التي سينقل إليها رمز المجمّع التحكم:

 /* * Api - Kernel entry point */ extern void kernel_start(struct multiboot_t* multiboot, void* kstack) { char *video = (char*)0xB8000; char buff[screen_size + 1]; video[screen_size] = '\0'; memset(buff, ' ', screen_size); strext(video, buff, 0x7); strext(video, hello, 0x7); } 

نحن هنا ببساطة عرض الرسالة على الشاشة. من حيث المبدأ ، يمكنك نسخ رمز الدرس الأول بالكامل ، نظرًا لأنه قالب ولن يتم تغييره أبدًا. لعرض شيء ما على الشاشة ، تحتاج فقط إلى كتابته مباشرة في ذاكرة الفيديو ، مع استكمال كل حرف برمز سمة. للقيام بذلك ، ستحتاج إلى مكتبة C الخاصة بك ، والتي سنكتب أنفسنا لتلبية احتياجاتنا. لذلك سيكون من الأسهل التحكم في العملية. على سبيل المثال ، اليوم لدينا تحت تصرفنا وظيفتان مألوفتان (strcpy ، memcpy) وواحدة من strext الخاصة بنا من أجل إدراج بايت سمة بعد كل حرف.

استنتاج


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

أدب



1. جيمس مولوي. لفة نظام التشغيل الخاص بك UNIX استنساخ.
2. الأسنان. مجمع ل DOS ، ويندوز ، يونيكس
3. كلاشينكوف. المجمع سهل!
4. Tanenbaum. أنظمة التشغيل. التنفيذ والتطوير.
5. روبرت لوف. نواة لينكس وصف عملية التطوير.

Source: https://habr.com/ru/post/ar466365/


All Articles