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

banan-os

โปรเจ็กต์นี้เป็นระบบปฏิบัติการงานอดิเรกที่เขียนด้วย C++ และรองรับสถาปัตยกรรม x86_64 และ i686 โดยมอบประสบการณ์การเรียนรู้ที่เป็นเอกลักษณ์เมื่อเทียบกับผลิตภัณฑ์อื่นหรือโปรเจ็กต์โอเพนซอร์สที่มีอยู่แล้ว

ฟีเจอร์

  • ทั่วไป

    • พื้นที่ผู้ใช้ Ring3
    • SMP (มัลติโพรเซสซิง)
    • linear framebuffer (VESA และ GOP)
    • network stack
    • การโหลดไฟล์ปฏิบัติการ ELF
    • AML interpreter (บางส่วน)
    • สภาพแวดล้อมกราฟิกพื้นฐาน
      • terminal emulator
      • แถบสถานะ
      • ตัวเรียกใช้งานโปรแกรม
      • แอปที่มีประโยชน์บางตัว
    • ELF dynamic linking
    • หน่วยความจำแบบ copy-on-write
      • file mapping
      • anonymous mapping
  • ไดรเวอร์

    • ดิสก์ NVMe
    • ดิสก์ ATA (IDE, SATA)
    • NIC E1000 และ E1000E
    • NIC RTL8111/8168/8211/8411
    • คีย์บอร์ด PS2 (ทุกชุดสแกนโค้ด)
    • เมาส์ PS2
    • USB
      • คีย์บอร์ด
      • เมาส์
      • อุปกรณ์เก็บข้อมูลขนาดใหญ่
      • ฮับ
    • อุปกรณ์ virtio (เครือข่าย, สตอเรจ)
  • เครือข่าย

    • ARP
    • ICMP
    • IPv4
    • UDP
    • TCP (บางส่วนและมีบั๊ก)
    • Unix domain socket
    • SSL
  • ระบบไฟล์

    • virtual file system
    • Ext2
    • FAT12/16/32
    • Dev
    • Ram
    • Proc
    • Sys
    • 9P
  • รองรับบูตโหลดเดอร์

    • GRUB
    • BIOS bootloader แบบกำหนดเอง
    • UEFI bootloader แบบกำหนดเอง

โครงสร้างโค้ด

แต่ละคอมโพเนนต์หลักและไลบรารีมีไดเรกทอรีย่อยของตัวเอง แต่ละไดเรกทอรีมีไดเรกทอรี include ที่รวมไฟล์เฮดเดอร์ทั้งหมดของคอมโพเนนต์นั้นไว้ เฮดเดอร์ทั้งหมดถูก include ด้วย absolute path

การบิลด์

แพ็กเกจที่ต้องใช้

  • apt (ทดสอบบน Ubuntu 22.04)

    • build-essential, git, ninja-build, texinfo, bison, flex, libgmp-dev, libmpfr-dev, libmpc-dev, parted, qemu-system-x86, cpu-checker
  • pacman

    • base-devel, git, wget, cmake, ninja, parted, qemu-system-x86

การคอมไพล์

  • หากต้องการบิลด์ toolchain สำหรับระบบปฏิบัติการนี้ สามารถรันคำสั่งต่อไปนี้ได้ ขั้นตอนนี้ทำเพียงครั้งเดียวและอาจใช้เวลานาน

    • ./bos toolchain
  • หากต้องการบิลด์ตัวระบบปฏิบัติการเอง สามารถรันหนึ่งในคำสั่งต่อไปนี้ได้ ต้องใช้สิทธิ์ root เพื่อสร้าง/แก้ไขดิสก์อิมเมจ

    • ./bos qemu
    • ./bos qemu-nographic
    • ./bos qemu-debug
    • ./bos bochs
  • สามารถบิลด์ได้โดยไม่รันเคอร์เนลหรือดิสก์อิมเมจ

    • ./bos kernel
    • ./bos image
  • หากต้องการบิลด์สำหรับสถาปัตยกรรมอื่น ให้ตั้งค่าตัวแปรสภาพแวดล้อม BANAN_ARCH=_arch_ (เช่น BANAN_ARCH=i686)

  • หากต้องการเปลี่ยนบูตโหลดเดอร์ ให้ตั้งค่าตัวแปรสภาพแวดล้อม BANAN_BOOTLOADER โดยค่าที่รองรับคือ BANAN (บูตโหลดเดอร์แบบกำหนดเอง) และ GRUB

  • หากต้องการรันด้วย UEFI ให้ตั้งค่าตัวแปรสภาพแวดล้อม BANAN_UEFI_BOOT=1 และต้องตั้งค่า OVMF_PATH ให้ชี้ไปยัง OVMF ที่ถูกต้องด้วย (ค่าเริ่มต้นคือ /usr/share/ovmf/x64/OVMF.fd)

  • หากดิสก์อิมเมจเสียหายหรืออยากสร้างใหม่ สามารถลบ _build/banan-os.img_ ด้วยตนเอง หรือรันคำสั่งต่อไปนี้

    • ./bos image-full
  • มีการสร้างสคริปต์ shell completion สำหรับ zsh ด้วย สามารถคัดลอกไฟล์ _script/shell-completion/zsh/_bos_ ไปที่ /usr/share/zsh/site-functions/ หรือเพิ่ม _script/shell-completion/zsh_ เข้าไปใน fpath ของ .zshrc

การมีส่วนร่วม

  • เนื่องจาก upstream โฮสต์อยู่บนเซิร์ฟเวอร์ส่วนตัว การรวม contribution จึงไม่ง่ายเหมือนบน GitHub หากส่ง PR บน GitHub ก็สามารถดาวน์โหลด diff และนำไปใช้ด้วยตนเองได้ หากต้องการ ก็สามารถให้บัญชีบนเซิร์ฟเวอร์ git ส่วนตัวได้ ในกรณีนั้นกรุณาติดต่อทางอีเมลหรือ Discord

  • เนื่องจากนี่เป็นประสบการณ์เพื่อการเรียนรู้เป็นหลัก จึงขอให้ติดต่อก่อนผ่านอีเมล Discord หรือ issue ก่อนเพิ่มฟีเจอร์ใหม่ หากส่ง PR มาเกี่ยวกับงานที่ผู้พัฒนากำลังวางแผนทำอยู่โดยไม่ได้สอบถามก่อน มีโอกาสสูงที่ PR จะถูกปิด แต่การแก้บั๊กยินดีต้อนรับเสมอ

  • ข้อความ commit ต้องมีรูปแบบดังนี้

    1. บรรทัดแรกต้องอยู่ในรูปแบบ " Subject: Description " โดย Subject ระบุพื้นที่ที่ได้รับผลกระทบ (เช่น Kernel, Shell, BuildSystem) และ Description เป็นคำอธิบายสั้น ๆ ของการเปลี่ยนแปลง บรรทัดแรกต้องยาวไม่เกิน 72 อักขระ
    2. เนื้อความของข้อความต้องอธิบายรายละเอียดของการเปลี่ยนแปลงและเหตุผลที่เปลี่ยน
  • commit ทั้งหมดต้องผ่าน pre-commit hook ที่กำหนดไว้ใน .pre-commit-config.yaml สำหรับคำแนะนำในการตั้งค่า pre-commit โปรดดูที่ pre-commit.com

1 ความคิดเห็น

 
GN⁺ 2024-12-06
ความคิดเห็นจาก Hacker News
  • ชื่นชมที่ลงมือทำไดรเวอร์ USB ขึ้นมาเองทั้งหมดตั้งแต่ต้น และบอกว่าเคยทำระบบพังด้วยการพิมพ์ cat doom1.wad
  • ชอบชื่อโปรเจ็กต์ และถามว่าส่วนที่ยากที่สุดในบรรดาสิ่งที่ทำคืออะไร รวมถึงมีอุปสรรคหนัก ๆ อะไรบ้างหรือไม่
  • บอกว่ามีประโยคที่ตามธรรมเนียมมักจะใส่ไว้ในการประกาศเคอร์เนล OS ใหม่หายไป
  • คิดว่าโปรเจ็กต์นี้เจ๋งมาก ถามว่าในหนึ่งสัปดาห์ทุ่มเวลาให้โปรเจ็กต์นี้กี่ชั่วโมง และโปรไฟล์ที่ระบุว่าเป็นนักเรียนนักศึกษาหมายถึงนักศึกษามหาวิทยาลัยหรือไม่ ถ้าใช่ก็สงสัยว่าได้ทำงานด้าน OS เป็นส่วนหนึ่งของการเรียนหรือเปล่า
  • สงสัยว่ากระบวนการพัฒนาเป็นอย่างไร รันบน VM หรือบนฮาร์ดแวร์จริง และถามว่าได้เรียนรู้อะไรระหว่างพัฒนาบ้าง รวมถึงจัดการบันทึกการพัฒนาอย่างไร
  • ยอมรับว่าน่าจะต้องใช้แรงไปมาก และอยากรู้ว่าความท้าทายที่โดดเด่นที่สุดคืออะไร
  • คิดว่าเป็นโปรเจ็กต์ที่มีชุดความสามารถเกินความคาดหมาย และถามว่ามีแผนจะพอร์ตซอฟต์แวร์เพิ่มอีกหรือไม่
  • คิดว่าโปรเจ็กต์นี้เจ๋ง และเสนอชื่อทางเลือกสำหรับฟอร์กว่า PlatanOS
  • คิดว่าเป็นผลงานที่น่าประทับใจมาก และก็ชอบชื่อโปรเจ็กต์ด้วย
  • ร่วมแสดงความยินดีกับไซด์โปรเจ็กต์ที่ยอดเยี่ยมนี้ และขอคำแนะนำเรื่องจุดเริ่มต้นหรือแหล่งข้อมูลสำหรับคนที่อยากลองทำโปรเจ็กต์คล้ายกัน