كتابة نظام تشغيل عملي خاص بك لمدة ستة أشهر

الصورة

الخلفية


مرحبًا أرحب بشكل قاطع بالجميع ، وأود اليوم أن أخبركم عن تجربتي في كتابة نظام تشغيل عملي لهندسة x86.

في إحدى ليالي الربيع ، كانت لدي فكرة رائعة - لمحاولة كتابة نظام التشغيل الخاص بي ، والذي يمكن أن يسمح لك بتشغيل البرامج والعمل مع الأجهزة ، وبوجه عام ، استنفاد كل الطاقة من هندسة Intel في احتياجاتك: على سبيل المثال ، لمصنعك أو أي شيء آخر. كان هدفي هو كتابة نظام تشغيل يمكن أن يسمح بأقصى أداء لبعض المهام المحددة دون إضاعة وقت وحدة المعالجة المركزية في جميع أنواع التجاوزات. في الأساس ، أتابع الاهتمام بالرياضة فقط ، واكتسب خبرة لنفسي في برمجة النظام وكتابة برامج التشغيل للأجهزة المستخدمة في كل مكان. الأمر متروك لك لتحديد ما جاء به ، سأقول على الفور أنه ليس عليك كتابة تعليقات حول إنشاء توزيع Linux الخاص بك ، وكنت مهتمًا بكتابة كل شيء "من البداية" - من البداية ، من أجل الغوص في موضوع OSdev. أريد أن أعبر عن امتناني العميق لبنيامين لونت ومنتدى OSDev ، وكذلك ويكيهم. ساعدني بن في التعامل مع EHCI ، التي قدمت بلا شك مساهمة كبيرة لنظام التشغيل الخاص بي - أجهزة USB ، فهي في كل مكان! كان لدي أيضًا مهمة إنشاء بنية خاصة بي ، ملائمة لي ، دون استثناء استخدام معايير ملف ELF. حسنًا ، دعنا نصل إلى النقطة.
UPD: يمكن العثور على جميع المعلومات في مجموعة tyk ، وهناك أيضًا منشور يحتوي على أرصفة وصورة (قديم ، والآن أقوم بإضافة أرصفة للنسخة الثابتة)

ما العمل؟


الآن نظام التشغيل الخاص بي قادر على العمل مع محركات أقراص USB المحمولة ، وأجهزة الماوس ، ولوحات المفاتيح ، وأقراص AHCI ، ووحدة تحكم PCI IDE ، و APIC و ACPI ، ويتم تنفيذ تهجير المهام المتعددة ، ويتم تشغيل البرامج ، وتشغيل العمل مع الملفات ، ومحرك SVGA ، الذي يعمل على وضع 0x118 VBE ، يعمل كل من DNS و DHCP و TCP و UPD و IPv4 و HTTP وبرنامج تشغيل FAT32 الكامل وبرنامج تشغيل RTL8139 (69) و Intel Gigabit Ethernet.

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

كيف يعمل؟


بادئ ذي بدء ، كتبت محمل إقلاع يقرأ محمل إقلاع ثانوي مع نواة مع FAT32. يدخل محمل الإقلاع الثاني في الوضع المحمي ويقفز إلى النواة ، حيث أقوم بتحميل وتكوين IDT ، وبعد ذلك أقوم بتهيئة أجهزة PCI ، وبدء تشغيل النواة وبدء CMD.

سوف يسأل شخص ما ، كيف حققت مثل هذا الأداء مع SVGA؟ الجواب بسيط: المجمع ، المجمع و المجمع مرة أخرى. لا يخلو من تعليمات SSE ، التي تسرع نسخ الذاكرة بشكل كبير. على سبيل المثال ، إليك الشفرة لنسخ مخزن فيديو مؤقت في LFB (Linear Frame Buffer):

.byte 0x60#Save registers in stack
mov %2,%%ecx 	#Repeat count to ecx
mov %0,%%edi 	#Video memory start to edi
mov %1,%%esi 	#Video buffer start to esi
ww1sse2:
	movaps  (%%esi),%%xmm0 #Copy 16 bytes to xmm0 from buffer
	movaps 	%%xmm0,(%%edi) #Copy from xmm0 to video memory
	movaps  16(%%esi),%%xmm0	#16 again, but + 16 from current
	movaps 	%%xmm0,16(%%edi)	#16 again, but + 16 from current
	movaps  32(%%esi),%%xmm0	#16 again, but + 32 from current
	movaps 	%%xmm0,32(%%edi)	#16 again, but + 32 from current
	movaps  48(%%esi),%%xmm0	#16 again, but + 48 from current
	movaps 	%%xmm0,48(%%edi)	#16 again, but + 48 from current
	add 	$64,%%edi	#Add 64 bytes to edi
	add 	$64,%%esi	#Add 64 bytes to esi
	dec%%ecx#Decrement count
	#test 	%%ecx,%%ecx #Compare ecx with zero
	jnz 	ww1sse2 	#If not zero, repeat again
.byte 0x61	#Restore registers from stack

, , , .

— «Watermark Allocator». , , , ..

-, .
MS-DOS: — . MBR , GPT .


— - , — .

, , — , , : , VIM.

, : , , return , - . , , - , .


: , , , , . — , , — — return'.


, , -, .

— - , - - , , ( , ) — , , .

!

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


All Articles