4 คะแนน โดย GN⁺ 2025-04-27 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • RetrOS-32 คือระบบปฏิบัติการงานอดิเรกแบบคัสตอมทั้งหมด 32 บิตที่สร้างโดยเน้นสถาปัตยกรรม i386 และมีทั้งกราฟิก มัลติทาสกิ้ง และเครือข่าย
  • เคอร์เนล ยูทิลิตี และระบบบิลด์เขียนด้วย C และ Assembly ส่วนแอปพลิเคชันใน user space เขียนด้วย C++ และใช้ Make กับ Docker สำหรับการบิลด์
  • ฮาร์ดแวร์จริงที่ใช้ทดสอบมี Lenovo x240, Asus Eee PC series, Dell Optiplex 780, Samsung N150 Plus, Samsung NP-NC10 และ IBM Thinkpad a21p
  • รองรับการรันผ่าน QEMU, v86 ของ copy.sh และการบูตบนฮาร์ดแวร์จริง โดยบนอุปกรณ์จริงจะใช้ GRUB ISO เพื่อเขียนไฟล์ .iso ลง USB หรือ CD แล้วรัน
  • ในโรดแมปมีรายการที่ทำเสร็จแล้ว เช่น บูตโหลดเดอร์ การจัดตารางมัลติเธรดแบบ preemptive ไฟล์ซิสเต็ม ตัวจัดการหน้าต่างกราฟิก network stack เธรดใน user space และเทอร์มินัลเสมือนระยะไกลผ่าน TCP

ภาพรวม RetrOS-32

  • RetrOS-32 เป็นโปรเจ็กต์ระบบปฏิบัติการงานอดิเรกแบบ 32 บิตที่มุ่งเน้นสถาปัตยกรรม i386
  • คำอธิบายโปรเจ็กต์ระบุว่าเป็นระบบปฏิบัติการงานอดิเรก 32 บิตที่มีกราฟิก มัลติทาสกิ้ง และเครือข่าย
  • วันที่เริ่มต้นระบุไว้เป็น 12 พฤษภาคม 2022
  • หน้าโปรเจ็กต์ลิงก์ไปที่ Project OSHub page

การล็อกอินและผู้ใช้

  • ผู้ใช้เริ่มต้นมี 3 รายคือ system, admin, guest
  • รหัสผ่านของ admin คือ admin และ guest ไม่มีรหัสผ่าน
  • ตอนนี้ยังไม่มีความแตกต่างระหว่าง admin กับ guest
  • สามารถสร้างผู้ใช้ได้ด้วยคำสั่ง admin create <username> <password>

ภาษาในการพัฒนาและโครงสร้างการบิลด์

  • เคอร์เนล ยูทิลิตี และระบบบิลด์เขียนด้วย C และ Assembly
  • แอปพลิเคชันใน user space เขียนด้วย C++
  • ใช้ Make สำหรับการคอมไพล์
  • ใช้ Docker สำหรับการคอมไพล์ข้ามแพลตฟอร์ม

ฮาร์ดแวร์ที่ทดสอบแล้ว

  • รายการฮาร์ดแวร์จริงที่ทดสอบแล้วมีดังนี้
    • Lenovo x240
    • Asus Eee PC series
    • Dell Optiplex 780
    • Samsung N150 Plus
    • Samsung NP-NC10
    • IBM Thinkpad a21p

วิธีบิลด์และรัน

  • ในสภาพแวดล้อมข้ามแพลตฟอร์ม ต้องใช้ Docker สำหรับคอมไพล์ไฟล์อิมเมจ และใช้ QEMU สำหรับการอีมูเลชัน
  • dependencies สำหรับการคอมไพล์แบบเนทีฟแตกต่างกันตามแพลตฟอร์ม
    • MacOS: i386-elf-gcc, i386-elf-ld, i386-elf-g++
    • Linux / WSL Ubuntu: build-essential, gcc-multilib
    • หากใช้ GRUB เป็นบูตโหลดเดอร์ จะต้องมี grub2, xorriso, xxd ด้วย
  • บน Linux จะบิลด์และรันตามลำดับด้วยการ clone repository, ./debian.sh, เริ่มต้น Git submodule, make compile, make img, make qemu
  • บน MacOS ตอนนี้ยังคอมไพล์แบบเนทีฟไม่ได้ เพราะเครื่องมือบิลด์พึ่งพาโค้ด x86 แบบ 32 บิต ดังนั้น Docker เป็นวิธีที่ง่ายที่สุด
  • บน Windows ใช้ Docker หรือ WSL
  • มีวิธีรัน 3 แบบ
    • อัปโหลดไฟล์ .img เป็นฮาร์ดดิสก์อิมเมจใน copy.sh v86
    • รัน make qemu หรือ qemu-system-i386 <image name> บน QEMU
    • บนฮาร์ดแวร์จริง ให้เขียนไฟล์ .iso ลง USB หรือ CD แล้วใช้ GRUB ISO

โครงสร้างโปรเจ็กต์

  • โครงสร้าง repository แบ่งเป็นไดเรกทอรีเคอร์เนล ไดรเวอร์ กราฟิก เครือข่าย ไฟล์ซิสเต็ม ไลบรารี แอปใน user space การทดสอบ และเครื่องมือ
  • boot มีบูตโหลดเดอร์แบบคัสตอมและ multiboot.ld
  • kernel มีซอร์สเคอร์เนลหลัก โค้ดเฉพาะสถาปัตยกรรม และโค้ด kernel thread
  • apps มีแอปพลิเคชันใน user space และ libcore.a, libgraphic.a, libnet.a
  • net มีโค้ดด้านเครือข่าย และ fs มีโค้ดเกี่ยวกับไฟล์ซิสเต็ม
  • tools มีเครื่องมือและสคริปต์สำหรับการบิลด์

รายการที่ทำเสร็จแล้วและงานที่ยังเหลือ

  • ส่วนที่เกี่ยวกับการบูต มี บูตโหลดเดอร์แบบคัสตอม, ความเข้ากันได้กับ GRUB และ Stage 2 bootloader ที่ทำเสร็จแล้ว
  • ฟังก์ชันของเคอร์เนลและระบบมีดังนี้
    • การจัดตารางแบบ preemptive สำหรับมัลติเธรด
    • การแยกเคอร์เนลกับ user space โดยใช้ GDT และ TSS
    • การจัดการ interrupt
    • IPC
    • system call
    • เธรดใน user space
  • ฟังก์ชันด้านไดรเวอร์และฮาร์ดแวร์มี PS/2 keyboard และ mouse, PIT, VESA 640x480x8, RTC, Serial, E1000, PCI
  • ด้านไฟล์ซิสเต็มและสตอเรจ มี ATA IDE driver, ไฟล์ซิสเต็มคล้าย Ext2, FAT16 และรองรับการอ่าน/เขียนแล้ว
    • FAT16 รองรับไฟล์ขนาดสูงสุด 32MB
    • Atapi ยังไม่เสร็จ
  • ฟังก์ชันด้านหน่วยความจำมี virtual memory แบบ 32 บิต, kalloc/kfree ของเคอร์เนล และ malloc/free ของ user space
  • ฟังก์ชันด้านกราฟิกมี window manager, GFXLib, การเรนเดอร์แบบ double framebuffer, mouse event, การปรับขนาดแบบไดนามิก, fullscreen, widget library
    • Custom HTML to Widgets ยังไม่เสร็จ
  • ใน network stack มี Ethernet, IP, ARP, UDP, Socket API, Loopback interface, DHCP, DNS, TCP และคำสั่งสไตล์ netcat ที่ทำเสร็จแล้ว
    • Webserver, FTP, IRC, SSH, Telnet, HTTP, HTML ยังไม่เสร็จ
  • แอปพลิเคชันและเครื่องมือมี terminal, window server, ข้อมูลโปรเซส, Finder, C compiler/bytecode interpreter, custom VM สำหรับรัน bytecode, editor ที่มี syntax highlighting, calculator, เกม 3D, เกม Snake แบบ text mode, เทอร์มินัลเสมือนระยะไกลผ่าน TCP, ไลบรารีบีบอัด LZ
  • รายการฟีเจอร์ที่เสนอและปัญหาที่ทราบทั้งหมดอยู่ที่ open issues

ไลเซนส์และลิงก์โปรเจ็กต์

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

 
GN⁺ 2025-04-27
ความคิดเห็นใน Hacker News
  • โปรเจกต์แบบนี้ดูดีกว่า AI จืด ๆ เยอะ ถึงคงไม่ใช่ของที่จะขายได้ แต่มันคือภาพของวิศวกรที่ปลดปล่อยทักษะของตัวเองอย่างสร้างสรรค์
    ช่วงปลายวัยรุ่นผมศึกษาเรื่องการพัฒนา OS เป็นงานอดิเรกเยอะมาก มันเจ๋งจริง ๆ และตอนนี้ก็ยังทำเคอร์เนลเล็ก ๆ เล่นเป็นครั้งคราว อันล่าสุดที่ทำคือ เคอร์เนล RISC-V ขนาดเล็ก ที่พิมพ์ข้อความให้คู่ของผม

    • การไม่ต้องกังวลเรื่องการขายหรือการตลาดนี่มันปลดปล่อยจริง ๆ แค่ประดิษฐ์ล้อขึ้นมาใหม่ไปเรื่อย ๆ จนกว่าจะมีไอเดียใหม่ออกมา
    • การเหมารวมว่า AI “จืด” นี่แปลกนะ ก่อนที่มันจะถูกห่อด้วยประสบการณ์ผู้ใช้ที่ฉลาด ๆ มันแทบทำเงินไม่ได้เลย เป็นเหมือน การสำรวจเชิงวิชาการ หรืองานแบบช่างฝีมือมากกว่า
    • ฟังดูเหมือนกำลังบอกว่า อุปกรณ์งานอดิเรก เล็ก ๆ น่าสนใจกว่าเทคโนโลยีที่เหลวไหลที่สุดในประวัติศาสตร์มนุษย์เสียอีก
  • อยากให้ฟอนต์ระบบเริ่มต้นเป็น ตัวแปรที่แคบกว่า นี้หน่อย แบบนั้นระบบน่าจะดูเนี้ยบขึ้นมาก และก็เห็นหลายจุดที่ตัวอักษรต้องการพื้นที่แนวนอนมากกว่านี้
    ควรลดความกว้างของแต่ละตัวอักษร และบีบระยะห่างระหว่างตัวอักษรให้แคบที่สุดเท่าที่ทำได้ ด้วยขนาดฟอนต์และความละเอียดที่ใช้อยู่ตอนนี้ ระยะห่าง 1 พิกเซล ก็น่าจะพอ
    ผมไม่ค่อยรู้เรื่องระบบฟอนต์ แต่เดาว่าเป็นฟอนต์บิตแมปแบบความกว้างคงที่ ถ้าแก้ในโค้ดเบสยากเกินไปก็ไม่ต้องใส่ใจก็ได้
    ผมเองก็ทำเว็บ OS จากศูนย์มาสักพัก และเพิ่งเขียนคลาสฟอนต์ทั้งหมดใหม่เมื่อไม่นานนี้ เลยสะดุดตาเรื่องนี้เป็นพิเศษ

    • เห็นด้วยว่าฟอนต์ตอนนี้ยังค่อนข้างไม่เหมาะเท่าไร ตอนเริ่มต้นใช้ ฟอนต์แรกเริ่ม ที่ทำให้ทำงานได้เป็นตัวแรกแทบจะเหมือนเดิมทุกอย่าง
      เคยดูเรื่องการเรนเดอร์ฟอนต์ที่จริงจังแล้ว และอยู่ในรายการสิ่งที่ต้องทำ แต่ก็ผัดผ่อนมาตลอด
    • บรรยากาศโหดจัด
      “ผมสร้างระบบปฏิบัติการครับ!”
      “อืม ฟอนต์ไม่ค่อยดีนะ”
      นี่แหละเหมือนเป็น จุดสูงสุดของ HN
  • เจ๋งมาก ถ้าเริ่มใหม่วันนี้ อยากรู้ว่าจะทำอะไรต่างออกไปบ้าง
    อยากรู้ด้วยว่ามองว่าภาษาอะไรเหมาะกับส่วนระดับต่ำ เช่น จะยึด C ต่อไป ใช้ซับเซ็ต C++ แบบเรียบง่าย หรือพิจารณาภาษาใหม่กว่านั้น
    ข้อมูลมีเยอะมาก เลยอยากรู้ด้วยว่าทำอย่างไรให้โปรเจกต์ยังน่าสนใจต่อไป แทนที่จะกลายเป็นการลอกโค้ดคนอื่น

    • สิ่งที่ต่างออกไปที่สุดคือ การวางแผน ตอนแรกมีเป้าหมายแค่ทำ hello world OS พื้นฐาน แต่พอเพิ่มฟีเจอร์ใหม่ไปเรื่อย ๆ และทำหลายอย่างพร้อมกัน ก็เกิด หนี้ทางเทคนิค ที่ยังต้องชดใช้อยู่จนถึงตอนนี้
      คงพยายามลดการพึ่งพา UNIX ด้วย
      เรื่องภาษา ผมชอบ C เพราะไวยากรณ์พื้นฐานและสไตล์ที่พุ่งเข้าประเด็นหลักทันที สำหรับแอปพลิเคชัน user space อาจพิจารณาภาษาอื่นได้
      ตั้งแต่แรกผมอยากเขียนทุกอย่างเอง และการไม่พอร์ตซอฟต์แวร์เป็นแกนหลักของโปรเจกต์ โดยรวมแล้วผมยึดกฎว่า “ลอกไอเดีย ไม่ใช่ลอกโค้ด”
  • จากมุมมองของคนที่เคยใช้ Commodore PET 2001 ในปี 1977 ก็ยังมองว่านี่เจ๋งมาก ผมกำลังลองเล่น KolibriOS กับ MenuetOSx64 อยู่ แล้วก็เริ่มอยากลองสร้าง OS เองขึ้นมาเลย ยอดเยี่ยมจริง ๆ ที่ทำสำเร็จ

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

  • อยากให้ตัวเองมีเวลาสำหรับ โปรเจกต์จากแพสชัน แบบนี้บ้าง
    ลืมเรื่องประโยชน์ใช้สอย ลืมกลยุทธ์ go-to-market ลืมความเหมาะสมกับตลาดเป้าหมาย แล้วแค่สร้างและเรียนรู้

    • การไม่ต้องคิดว่ามันจะ “ถูกใช้งานจริงไหม” หรือไม่ต้องคิดเรื่องตลาดนี่สดชื่นมาก เป็นงานที่ทำเพื่อความสนุกและการเรียนรู้ล้วน ๆ
    • สงสัยว่าทำไมถึงหาเวลาไม่ได้ ตั้งแต่เด็ก ถ้าไม่มีโปรเจกต์งานอดิเรก ผมคงรู้สึกหลงทางอยู่ไม่น้อย
      หนึ่งในนั้นเคยเป็น OS ของเล่น แต่พอการพัฒนา OS ระดับต่ำกลายเป็นงานจริง โปรเจกต์นั้นก็หยุดไป
  • ผมอยู่ในสายนี้มาหลายสิบปี และกำลังพยายามเรียนรู้การพัฒนา OS รู้จัก FASM, NASM, FASM-G อยู่บ้าง
    แต่ผมอยากศึกษาผลลัพธ์ของโปรแกรมแอสเซมเบลอร์ เพื่อเข้าใจว่า OS ทำงานจริงอย่างไรใน ระดับไบนารี
    อยากรู้ว่าคุณได้เรียนโค้ดคำสั่งของสถาปัตยกรรมเฉพาะหรือไม่ จัดการโปรแกรมไดรเวอร์อุปกรณ์อย่างไร และช่วยสรุปขั้นตอนในการพัฒนา OS ด้วยตัวเองได้ไหม

    • ผมคิดว่าสถานที่ที่ดีที่สุดสำหรับการเรียนรู้คือ ฟอรัม osdev และ วิกิ osdev มีแหล่งข้อมูลที่มีประโยชน์ต่อการเริ่มต้นเยอะมาก
      มี tutorial อยู่บ้าง แต่หลายอันมีบั๊ก และมักกลายเป็นการสร้าง OS ของพวกเขาขึ้นมาใหม่โดยปริยาย
      โค้ดคำสั่งผมไม่ได้ขุดลึกขนาดนั้น แค่ค้นตอนทำ C compiler เลยรู้เฉพาะคำสั่งพื้นฐานที่พบบ่อยที่สุด
      https://forum.osdev.org/
      https://wiki.osdev.org/Expanded_Main_Page
  • เจ๋งมาก อยากให้ จิตวิญญาณยุคคอมพิวเตอร์แรกเริ่ม ที่คนเล่นกับตัวคอมพิวเตอร์เองมากกว่าระดับแอปพลิเคชันกลับมาอีกเยอะ ๆ
    ผมเคยคิดจะทำคอมพิวเตอร์ส่วนตัวเป็นโปรเจกต์งานอดิเรกระยะยาว เป็นคอมพิวเตอร์ที่สร้างสแต็กซอฟต์แวร์ทั้งหมดเอง และรู้ที่มาของทุกบิตที่อยู่ในระบบ
    ฮาร์ดแวร์อาจควบคุมในระดับเดียวกันได้ยาก เว้นแต่จะใช้ FPGA ให้ได้ประสิทธิภาพพอสำหรับรันทั้งหมด แต่อย่างน้อยฝั่งซอฟต์แวร์ก็น่าจะเป็นไปได้
    จนถึงตอนนี้มันดูไม่ค่อยสมจริง แต่สิ่งนี้แสดงให้เห็นว่าเป็นไปได้ ดูเหมือนกำลังทำ C compiler สำหรับงานอดิเรกด้วย: https://github.com/joexbayer/C-Compiler

    • การรู้ว่าตัวเองเขียนทุกอย่างเอง ตั้งแต่ส่วนบนของ user space ลงไปจนถึงไดรเวอร์ เป็นความรู้สึกที่ดีจริง ๆ แต่ในเวลาเดียวกันก็เป็น นรกแห่งการดีบัก ด้วย
      C compiler ทำขึ้นสำหรับ OS นี้และทำงานอยู่ใน OS ได้ โปรเจกต์ใหญ่เกินไปจนผมอยากแยกออกจาก repository ของ OS โดยเฉพาะเพราะมันทำงานบน Linux ได้ด้วย
  • อยากให้ช่วยอธิบายเพิ่มเติมว่า compiler นี้โต้ตอบกับระบบปฏิบัติการอย่างไร โดยเฉพาะว่าจัดการฟีเจอร์อย่าง struct อย่างไร รวมถึงข้อจำกัดปัจจุบันและการปรับปรุงที่วางแผนไว้ในบริเวณนี้

    • ไม่มีปฏิสัมพันธ์วิเศษอะไรระหว่าง compiler กับ OS แค่คอมไพล์เป็น ภาษาเครื่อง (i386) เดียวกัน และใช้ interrupt สำหรับ system call
      struct ถูกมองเป็นพื้นที่หน่วยความจำที่มีขนาดกำหนดตาม member และการเข้าถึง member ก็จัดการด้วย offset ภายในพื้นที่นั้น
      ตอนนี้ยังมีข้อจำกัดเยอะ เช่น มีแค่ int กับ char และยังไม่มีคำสั่ง switch ความต่างใหญ่ที่สุดจาก C มาตรฐานคืออนุญาตให้มีฟังก์ชันใน struct และถ้าเป็นฟังก์ชันของ struct ก็จะส่ง struct ให้ฟังก์ชันแบบอัตโนมัติ รายละเอียดเพิ่มเติมดูได้ที่นี่:
      https://github.com/joexbayer/C-Compiler
  • นี่เป็นหนึ่งในโปรเจกต์จากแพสชันที่น่าประทับใจที่สุดในรอบค่อนข้างนานที่ผมเห็นที่นี่ อยากรู้ว่าทำไมถึงตัดสินใจใช้ C compiler ที่เขียนเอง

    • ผมมีกฎว่าอยากเขียนทุกอย่างเอง และการทำ compiler ก็เป็นหนึ่งใน “เป้าหมาย” ของผมมาตลอด เลยลงตัวอย่างเป็นธรรมชาติ