นี่เป็นระบบปฏิบัติการแรกที่ฉันสร้างขึ้น มันเขียนเป็นสองภาษา: C ภาษาและการประกอบ
โครงการนี้เปิดใช้งานตั้งแต่วันที่ 15 ธันวาคม 2017

แผนการทำงาน
bootloader
กำหนดเอง
ภาคการบูต
ขั้นตอนที่ 2
ด้วง
เคอร์เนล
การจัดการหน่วยความจำ
เพจเฟรมจัดสรร
การจัดสรรหน่วยความจำแบบไดนามิก
ระบบอาคาร
เขียนข้อความถึง VGA
CPU interrupt (IDT, ISRS, IRQs ฯลฯ )
อ่านอักขระจากแป้นพิมพ์ PS/2
อ่านสตริงจากแป้นพิมพ์ PS/2
หน่วยความจำเสมือน (เพจ, เฟรม ฯลฯ )
การจัดสรรเฟรมเพจและการยกเลิกการจัดสรร
การจัดสรรหน่วยความจำแบบไดนามิก (LIBALLOC)
ตัวจับเวลา CPU
รับข้อมูล CPU
นาฬิกาเรียลไทม์: ดังนั้นเราจึงสามารถรู้ได้ว่าภาพยนตร์เริ่มต้นเมื่อใด
ร่องรอยเคอร์เนล
การทำงานหลายอย่าง
กระบวนการโหมดผู้ใช้
ฮาร์ดดิสก์ไดรเวอร์
ไดรเวอร์ฟลอปปี้ดิสก์
ระบบไฟล์
ส่วนต่อประสานผู้ใช้กราฟิก
ระบบปฏิบัติการนี้ใช้ bootloader 2 ขั้นตอน ในกรณีที่ขั้นตอนที่สองคือเมื่อเราเข้าสู่ โหมดที่ได้รับการป้องกัน และเรียกเคอร์เนล
512 ไบต์แรกของภาพฟลอปปี้ของฉันมีภาคการบูตซึ่งทำสิ่งต่าง ๆ มากมายที่ โหมดป้องกัน ไม่สามารถทำได้ (เช่นการโหลดสิ่งของจากดิสก์) จากนั้นมันจะข้ามไปยังขั้นตอนที่สองที่โหลดที่ 0x7E00 (หลังจากภาคการบูต)
ขั้นตอนนี้โหลด GDT และเข้าสู่ โหมดที่ได้รับการป้องกัน จากนั้นจะคัดลอกเคอร์เนลที่โหลดโดยภาคการบูตที่ 0x1000 ถึง 0x100000 (1 MB) ในที่สุดก็กระโดด!
ขนาดของเคอร์เนลมีการเติบโตอยู่เสมอ แต่ฉันไม่สามารถเพิ่มภาคส่วนให้โหลดได้ เป็นทางออก ฉันตัดสินใจใช้ด้วง เคอร์เนลถูกเก็บไว้เป็นภาพเอลฟ์ ( kernel.img ) ในซีดีซึ่งใช้ ISO 9660 เป็นระบบไฟล์ ด้วงยังรองรับ Multiboot ดังนั้นระบบปฏิบัติการของฉันสามารถทำงานร่วมกับผู้อื่นได้ (Windows, Linux ฯลฯ )
เราเข้าสู่โหมดที่ได้รับการป้องกันซึ่งหมายความว่าเราไม่สามารถเข้าถึงฟังก์ชั่น BIOS ได้ ดังนั้นเคอร์เนลนี้จำเป็นต้องดำเนินการอีกครั้งฟังก์ชั่นเหล่านั้นเพื่อควบคุมฮาร์ดแวร์
ตอนนี้ฉันได้ใช้อุปกรณ์มาตรฐานอีกครั้ง: หน้าจอและแป้นพิมพ์ ในการพัฒนาต่อไป ฉันจะใช้ดิสก์ไดรเวอร์
ระบบปฏิบัติการนี้ใช้ทั้งการแบ่งส่วนและการเพจเพื่อให้การป้องกันหน่วยความจำ ใน ตาราง descriptor ส่วนกลาง ของฉันฉันใส่ 5 descriptors ส่วน:
ส่วนว่าง
ส่วนรหัสสำหรับเคอร์เนล : ส่วนที่รหัสเคอร์เนลของฉันเป็นของ
ส่วนข้อมูลสำหรับเคอร์เนล : ส่วนที่ตัวแปรทั่วโลกเคอร์เนลของฉันเป็นของ
ส่วนโค้ดสำหรับผู้ใช้ : ปัจจุบันไม่ได้ใช้
เซ็กเมนต์ข้อมูลสำหรับผู้ใช้ : เหมือนกับ 4
ฉันยังเปิดใช้งานการเพจ ตอนนี้ฉันจงใจใส่หน้าสี่ในตารางหน้าแรกเพื่อ not-present และ read-only ดังนั้นคุณสามารถสร้าง ความผิดพลาดของหน้า โดยการดำเนินการป้อน bsod ในบรรทัดคำสั่งของระบบปฏิบัติการของฉัน

เคอร์เนลนี้มี การจัดสรรเฟรมเพจ ดังนั้นการจัดการหน่วยความจำจะสะดวกกว่าและฉันจะเข้าใกล้การทำงานหลายอย่างได้ง่ายขึ้น
ตามที่บทช่วยสอนของ Jamesm แนะนำฉันจะใช้บิตเซ็ตเพื่อพิจารณาว่าเฟรมฟรีหรือไม่
1: Allocated 0: Free
v v
frame_bitset: 11110111110101111101111111
^
get_free_frame()
ขณะนี้ฉันได้ใช้ตำแหน่ง Malloc โดยไม่มี ฟรี เพราะตัวแปรทั้งหมดที่ใช้โดยเคอร์เนลไม่จำเป็นต้องเป็นอิสระจนกว่าจะถึงอำนาจ
Heap Allocation
-----------------------------------------------
Allocated |
Memory | Free.......until the end of memory
|
-----------------------------------------------
เพราะฉันขี้เกียจฉันพอร์ตหน่วยความจำของบุคคลที่สามที่เรียกว่า liballoc ซึ่งต้องการเพียงไม่กี่ฟังก์ชั่นในระบบปฏิบัติการของฉัน
โครงการนี้ใช้ GNU Make ในการสร้าง ดังนั้นวิธีการสร้างคือการพิมพ์ make หากมีปัญหาใด ๆ เกิดขึ้นระหว่างการสร้างให้พิมพ์ make dep ก่อน make เปิดปัญหาหากยังคงติดอยู่
หากคุณไม่ได้ใช้ Linux หรือ WSL (Windows Subsystem สำหรับ Linux) คุณจะต้องดาวน์โหลด Cross Compiler จากที่นี่ จากนั้นแก้ไข CC และ LD ใน config.mk