3 คะแนน โดย GN⁺ 2024-05-25 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

โปรเจกต์เขียนโปรแกรมใหม่: Bunnix

ที่มาของโปรเจกต์

  • ช่วงหลังมานี้ เพื่อพักจาก "งานจริง" ชั่วคราว จึงเริ่มโปรเจกต์เขียนโปรแกรมใหม่ที่มีความเสี่ยงต่ำและทำเพื่อความสนุกล้วน ๆ
  • ตั้งแต่วันที่ 21 เมษายน ได้ลองดูว่าจะสร้างระบบปฏิบัติการคล้าย Unix สำหรับเป้าหมาย x86_64 ได้มากแค่ไหนภายในเวลาประมาณหนึ่งเดือน
  • ผลลัพธ์คือระบบปฏิบัติการชื่อ Bunnix
  • ใช้เวลากับโปรเจกต์นี้รวม 27 วัน

เดโมของ Bunnix

  • มีไฟล์ ISO ของ Bunnix 0.0.0 ให้ใช้งาน
  • สามารถบูตด้วย QEMU ได้:
    qemu-system-x86_64 -cdrom bunnix.iso -display sdl -serial stdio
    
  • สามารถเขียน ISO ลง USB stick แล้วบูตบนฮาร์ดแวร์จริงได้เช่นกัน
  • มีแนวโน้มสูงว่าจะทำงานได้บนอุปกรณ์ AMD64 ส่วนใหญ่
  • ข้อจำกัด: ไม่มีการรองรับ USB จึงต้องใช้คีย์บอร์ด PS/2

องค์ประกอบของ 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 ความคิดเห็น

 
GN⁺ 2024-05-25
ความคิดเห็นจาก 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.

    • เป็นโปรเจ็กต์ที่เจ๋งมาก ทำให้นึกถึงตอนที่ Unix ดั้งเดิมถูกสร้างขึ้นในเวลาไม่กี่สัปดาห์ ระหว่างที่ครอบครัวของ Ritchie ไปพักร้อนที่แคลิฟอร์เนียเพื่อไปเยี่ยมครอบครัวของภรรยา
  • 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.

    • ในที่สุดก็ได้เรียนรู้การทำงานของ signals ตั้งแต่ต้นจนจบ และมันชวนปวดหัวมาก ฉันรู้สึกมาตลอดว่านี่เป็นหนึ่งในจุดอ่อนที่สุดของการออกแบบ Unix และโปรเจ็กต์นี้ก็ไม่ได้ทำให้ฉันเปลี่ยนความคิดนั้น
  • 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.

    • ตัวอย่างของการ “สร้างสิ่งที่น่าทึ่งใน X วัน” ต้องอาศัยประสบการณ์และพรสวรรค์ที่สั่งสมมาหลายปี
  • 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.

    • การติดตามอัปเดตรายวันเกี่ยวกับเรื่องนี้บน Mastodon เป็นอะไรที่เจ๋งมาก ได้เห็นว่าคนที่มีฝีมือสูงค่อย ๆ ประกอบซอฟต์แวร์ที่ซับซ้อนขึ้นมาอย่างไร
  • From "Linux System Call Table – Chromiumos"

    • แชร์ข้อมูลเกี่ยวกับตาราง system call ของ Linux
  • Code is here: Git Repository

  • Hare looks like an interesting language. Though this limitation will limit its adoption in this multicore age I think:

    • Hare ดูเป็นภาษาที่น่าสนใจ แต่ฉันคิดว่าข้อจำกัดนี้น่าจะทำให้การนำไปใช้แพร่หลายในยุค multicore ถูกจำกัด
  • Very cool. Most of these Unix clones are usually written in C. This one is written in a new programming language.

    • เจ๋งมาก ปกติ Unix clone ส่วนใหญ่จะเขียนด้วย C แต่โปรเจ็กต์นี้เขียนด้วยภาษาโปรแกรมใหม่
  • Quite cool, by making use of Hare instead.

    • การเลือกใช้ Hare นั้นเจ๋งมาก
  • Waiting for an OS that treats GPU(s) as a first class citizen ...

    • กำลังรอระบบปฏิบัติการที่ปฏิบัติต่อ GPU ในฐานะ first-class citizen ...