นี่คือการทดลองเล็กน้อยที่ฉันกำลังทำงานกับที่ฉันพยายามสร้างเคอร์เนล OS ในภาษาการเขียนโปรแกรม GO
เป้าหมายคือไม่สร้างระบบปฏิบัติการ "เต็ม" (ไม่ว่าจะหมายความว่าอะไรก็ตาม) แต่เรียนรู้เพิ่มเติมเกี่ยวกับระบบปฏิบัติการและวิธีการทำ
เดิมทีฉันวางแผนที่จะใช้ระบบ FAT32-Filesystem ฉันดำเนินการหนึ่งครั้ง (ใน c) แต่ฉันไม่สามารถทำงานในโครงการต่อไปได้เนื่องจาก Harware หายไป แน่นอนว่าคุณสามารถใช้ระบบไฟล์ใน Linux ได้อย่างง่ายดาย แต่นั่นก็น่าเบื่อ
ดังนั้นฉันจึงเริ่มเขียนระบบปฏิบัติการของตัวเองสำหรับโครงการนี้ นอกจากนี้ยังเป็นวิธีที่จะเริ่มเรียนรู้ไป อย่างน้อยก็ค่อนข้าง
เมื่อฉันมีความคิดที่จะเขียนระบบปฏิบัติการฉันรู้ว่าฉันไม่ต้องการใช้ C เนื่องจากฉันมีประสบการณ์บางอย่างที่เขียนระบบปฏิบัติการใน C ฉันพิจารณาว่าจะใช้สนิมหรือไปเขียนระบบปฏิบัติการของฉัน ปัจจัยในการตัดสินใจในที่สุดก็คือความท้าทายที่ยิ่งใหญ่กว่า
ตอนนี้คุณอาจคิดว่ามันไม่ใช่ความคิดที่จะใช้ไปเขียนเคอร์เนลและคุณจะพูดถูก Go-runtime ได้รับการออกแบบให้ใช้ในผู้ใช้พื้นที่ของระบบปฏิบัติการ มีข้อสันนิษฐานมากมายว่าสิ่งนี้มีความหมายเช่นความสามารถในการเรียกใช้ syscalls และการใช้การจัดสรรหน่วยความจำแบบไดนามิก ในเคอร์เนลคุณไม่สามารถพึ่งพาระบบปฏิบัติการเพื่อจัดการสิ่งนี้ให้คุณได้เช่นเดียวกับระบบปฏิบัติการ อย่างไรก็ตามด้วยการเขียนโปรแกรมอย่างระมัดระวังและการยอมแพ้คุณสามารถทำได้ดังนั้นทำไมล่ะ? มันเป็นความท้าทาย
เป้าหมายหนึ่งของโครงการนี้คือการบรรลุสิ่งที่รวดเร็วดังนั้นฉันจึงไม่ได้ใช้เวลาในการออกแบบระบบปฏิบัติการ เพื่อเร่งกระบวนการทั้งหมดฉันตัดสินใจใช้อินเตอร์เฟส SyScall ของ Linux วิธีนี้ฉันจะไม่ต้องเขียนไลบรารีผู้ใช้สเปซของตัวเองและสามารถใช้ภาษาการเขียนโปรแกรมใด ๆ ที่ฉันต้องการใน Userspace ของฉัน มันมีข้อเสียค่อนข้างน้อย ในขณะที่ฉันทำ syscalls ในลักษณะเดียวกับ Linux สิ่งนี้ต้องการให้ฉันใช้สมมติฐานทั้งหมดของ Linux เช่นกัน ตัวอย่างเช่นการเริ่มต้นกระบวนการ requries ให้ฉันตั้งค่าพื้นที่หน่วยความจำในลักษณะเดียวกับที่ Linux ต้องการ syscalls จำเป็นต้องส่งคืนค่าที่คาดว่าจะอยู่ในเคอร์เนล Linux และการออกแบบเคอร์เนลจะถือว่าเป็นเสาหิน
ฉันยังไม่แน่ใจว่าฉันยึดติดกับการออกแบบนี้หรือไม่ ความคิดอีกอย่างที่ฉันมีคือการเขียน ABI ของตัวเอง แต่ยังเขียนไลบรารี Wrapper Linux-Syscall ที่จะสกัดกั้น Linux syscalls และแปลไปยังระบบปฏิบัติการของฉัน