โปรเจกต์เขียนโปรแกรมใหม่: Bunnix
ที่มาของโปรเจกต์
- ช่วงหลังมานี้ เพื่อพักจาก "งานจริง" ชั่วคราว จึงเริ่มโปรเจกต์เขียนโปรแกรมใหม่ที่มีความเสี่ยงต่ำและทำเพื่อความสนุกล้วน ๆ
- ตั้งแต่วันที่ 21 เมษายน ได้ลองดูว่าจะสร้างระบบปฏิบัติการคล้าย Unix สำหรับเป้าหมาย x86_64 ได้มากแค่ไหนภายในเวลาประมาณหนึ่งเดือน
- ผลลัพธ์คือระบบปฏิบัติการชื่อ Bunnix
- ใช้เวลากับโปรเจกต์นี้รวม 27 วัน
เดโมของ Bunnix
องค์ประกอบของ Bunnix
- เคอร์เนลของ Bunnix เขียนด้วย Hare เป็นหลัก และมีคอมโพเนนต์บางส่วนที่เป็น C (lwext4, libvterm)
- ไดรเวอร์ที่รองรับ:
- PCI (legacy)
- อุปกรณ์บล็อก AHCI
- ตารางพาร์ทิชัน GPT และ MBR
- คีย์บอร์ด PS/2
- พอร์ตซีเรียลของแพลตฟอร์ม
- นาฬิกา CMOS
- framebuffer (ตั้งค่าโดยบูตโหลดเดอร์)
- ระบบไฟล์ ext4 และ memfs
- ความสามารถของเคอร์เนลที่รองรับ:
- virtual file system
- อุปกรณ์ /dev หลายชนิด
- terminal emulator และการรองรับ termios
- system call ราว 40 รายการ (เช่น clock_gettime, poll, openat, fork, exec เป็นต้น)
- Bunnix เป็นระบบผู้ใช้เดี่ยว และในตอนนี้ยังไม่ได้บังคับใช้โหมดไฟล์และความเป็นเจ้าของแบบ Unix
บูตโหลดเดอร์
- มีบูตโหลดเดอร์อยู่สองตัว:
- Legacy boot: เขียนด้วย Hare
- EFI boot: เขียนด้วย C
- โหลดเคอร์เนลเป็นไฟล์ ELF และโหลด initramfs ด้วยหากจำเป็น
ซอฟต์แวร์ใน userspace
- ประกอบด้วยซอฟต์แวร์จาก third party เป็นหลัก:
- Colossal Cave Adventure (advent)
- dash (/bin/sh)
- Doom
- gzip
- less (pager)
- lok (/bin/awk)
- lolcat
- mandoc (man pages)
- sbase (core utils)
- tcc (C compiler)
- Vim 5.7
- libc แตกแขนงมาจาก musl libc และถูกปรับแต่งให้เหมาะกับความต้องการของ Bunnix
กระบวนการพัฒนา Bunnix
- มีการบันทึกกระบวนการพัฒนาไว้บน Mastodon
- โค้ดบางส่วนของ Bunnix นำมาจากโปรเจกต์ก่อนหน้าอย่าง Helios
- ส่วนที่ยากที่สุดคือการรองรับ ext4 และการผสานรวม virtual terminal
- การทำ scheduler และ signal handling ก็ท้าทายเช่นกัน
- การพอร์ตซอฟต์แวร์ third party ค่อนข้างง่าย เพราะอิงจาก musl libc
สิ่งที่ได้เรียนรู้
- ได้เรียนรู้เรื่องระบบไฟล์มากมาย
- แนวทางการเข้าถึงไดรเวอร์เรียบง่ายขึ้น
- เข้าใจความซับซ้อนของ signal handling มากขึ้น
- ยืนยันได้ว่า bitmap allocator มีประสิทธิภาพในการจัดการหน่วยความจำ
- ตระหนักว่า monolithic kernel นั้นนำไปสร้างจริงได้ง่ายกว่า microkernel มาก
แผนต่อจากนี้
- Bunnix เป็นโปรเจกต์ที่ทำเพื่อความสนุก และตอนนี้ยังไม่มีแผนจะลงเวลาเพิ่มอีก
- ต่อไปจะกลับไปทำโปรเจกต์ Helios และนำบทเรียนจำนวนมากไปปรับใช้
- ลำดับความสำคัญในการปรับปรุง Bunnix:
- file system cache
- แก้บั๊ก ext4
- procfs และ top
- ไฟล์ mmap
- signal เพิ่มเติม (เช่น SIGSEGV)
- รองรับหลายผู้ใช้
- อุปกรณ์บล็อก NVMe
- อุปกรณ์บล็อก IDE
- รองรับ ATAPI และ ISO 9660
- รองรับ Intel HD Audio
- network stack
- Hare toolchain ในระบบพื้นฐาน
- self-hosting
ความเห็นจาก GN⁺
- คุณค่าของ Bunnix: Bunnix เป็นตัวอย่างที่ดีของการแฮ็กเคอร์เนลด้วยภาษา Hare และอาจน่าสนใจสำหรับนักพัฒนาที่ต้องการเรียนรู้ภาษาและเทคโนโลยีใหม่ ๆ
- การออกแบบระบบไฟล์: การออกแบบระบบไฟล์เป็นส่วนสำคัญของการพัฒนาระบบปฏิบัติการ และสามารถเรียนรู้อะไรได้มากผ่าน Bunnix
- Monolithic vs Microkernel: เป็นกรณีศึกษาที่ดีในการเปรียบเทียบข้อดีข้อเสียของ monolithic kernel กับ microkernel และช่วยให้เข้าใจการออกแบบระบบปฏิบัติการได้ลึกขึ้น
- การมีส่วนร่วมของชุมชน: Bunnix เป็นโปรเจกต์โอเพนซอร์ส และมีศักยภาพที่จะพัฒนาต่อได้มากขึ้นผ่านการมีส่วนร่วมและการสนับสนุนจากชุมชน
- จุดปรับปรุงในอนาคต: รายการปรับปรุงต่อจากนี้ของ Bunnix มอบโอกาสการเรียนรู้ที่ดีให้กับผู้ที่สนใจการพัฒนาระบบปฏิบัติการ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สรุปความคิดเห็นจาก Hacker News
This is really cool. Reminds me of the original Unix was invented in a couple weeks while Ritchie's family went on vacation to CA to visit his in-laws.
I also finally learned how signals work from top to bottom, and boy is it ugly. I’ve always felt that this was one of the weakest points in the design of Unix and this project did nothing to disabuse me of that notion.
Impressive, super cool, and inspiring!
Example of “creating something impressive in X days” requires a lot of experience and talent that is built over years.
It was really cool watching the ~daily updates on this on Mastodon - seeing how someone so skilled gradually pieces together a complex piece of software.
From "Linux System Call Table – Chromiumos"
Code is here: Git Repository
Hare looks like an interesting language. Though this limitation will limit its adoption in this multicore age I think:
Very cool. Most of these Unix clones are usually written in C. This one is written in a new programming language.
Quite cool, by making use of Hare instead.
Waiting for an OS that treats GPU(s) as a first class citizen ...