เปิดตัวบน HN: ในที่สุด Hobby OS ที่เขียนเองก็รันได้บน IBM ThinkPad วินเทจ
(github.com/joexbayer)- 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ด้วย
- MacOS:
- บน 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.ldkernelมีซอร์สเคอร์เนลหลัก โค้ดเฉพาะสถาปัตยกรรม และโค้ด kernel threadappsมีแอปพลิเคชันใน user space และlibcore.a,libgraphic.a,libnet.anetมีโค้ดด้านเครือข่าย และ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
ไลเซนส์และลิงก์โปรเจ็กต์
- RetrOS-32 เผยแพร่ภายใต้ MIT License
- ลิงก์โปรเจ็กต์คือ https://github.com/joexbayer/RetrOS-32
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
โปรเจกต์แบบนี้ดูดีกว่า AI จืด ๆ เยอะ ถึงคงไม่ใช่ของที่จะขายได้ แต่มันคือภาพของวิศวกรที่ปลดปล่อยทักษะของตัวเองอย่างสร้างสรรค์
ช่วงปลายวัยรุ่นผมศึกษาเรื่องการพัฒนา OS เป็นงานอดิเรกเยอะมาก มันเจ๋งจริง ๆ และตอนนี้ก็ยังทำเคอร์เนลเล็ก ๆ เล่นเป็นครั้งคราว อันล่าสุดที่ทำคือ เคอร์เนล RISC-V ขนาดเล็ก ที่พิมพ์ข้อความให้คู่ของผม
อยากให้ฟอนต์ระบบเริ่มต้นเป็น ตัวแปรที่แคบกว่า นี้หน่อย แบบนั้นระบบน่าจะดูเนี้ยบขึ้นมาก และก็เห็นหลายจุดที่ตัวอักษรต้องการพื้นที่แนวนอนมากกว่านี้
ควรลดความกว้างของแต่ละตัวอักษร และบีบระยะห่างระหว่างตัวอักษรให้แคบที่สุดเท่าที่ทำได้ ด้วยขนาดฟอนต์และความละเอียดที่ใช้อยู่ตอนนี้ ระยะห่าง 1 พิกเซล ก็น่าจะพอ
ผมไม่ค่อยรู้เรื่องระบบฟอนต์ แต่เดาว่าเป็นฟอนต์บิตแมปแบบความกว้างคงที่ ถ้าแก้ในโค้ดเบสยากเกินไปก็ไม่ต้องใส่ใจก็ได้
ผมเองก็ทำเว็บ OS จากศูนย์มาสักพัก และเพิ่งเขียนคลาสฟอนต์ทั้งหมดใหม่เมื่อไม่นานนี้ เลยสะดุดตาเรื่องนี้เป็นพิเศษ
เคยดูเรื่องการเรนเดอร์ฟอนต์ที่จริงจังแล้ว และอยู่ในรายการสิ่งที่ต้องทำ แต่ก็ผัดผ่อนมาตลอด
“ผมสร้างระบบปฏิบัติการครับ!”
“อืม ฟอนต์ไม่ค่อยดีนะ”
นี่แหละเหมือนเป็น จุดสูงสุดของ HN
เจ๋งมาก ถ้าเริ่มใหม่วันนี้ อยากรู้ว่าจะทำอะไรต่างออกไปบ้าง
อยากรู้ด้วยว่ามองว่าภาษาอะไรเหมาะกับส่วนระดับต่ำ เช่น จะยึด C ต่อไป ใช้ซับเซ็ต C++ แบบเรียบง่าย หรือพิจารณาภาษาใหม่กว่านั้น
ข้อมูลมีเยอะมาก เลยอยากรู้ด้วยว่าทำอย่างไรให้โปรเจกต์ยังน่าสนใจต่อไป แทนที่จะกลายเป็นการลอกโค้ดคนอื่น
คงพยายามลดการพึ่งพา UNIX ด้วย
เรื่องภาษา ผมชอบ C เพราะไวยากรณ์พื้นฐานและสไตล์ที่พุ่งเข้าประเด็นหลักทันที สำหรับแอปพลิเคชัน user space อาจพิจารณาภาษาอื่นได้
ตั้งแต่แรกผมอยากเขียนทุกอย่างเอง และการไม่พอร์ตซอฟต์แวร์เป็นแกนหลักของโปรเจกต์ โดยรวมแล้วผมยึดกฎว่า “ลอกไอเดีย ไม่ใช่ลอกโค้ด”
จากมุมมองของคนที่เคยใช้ Commodore PET 2001 ในปี 1977 ก็ยังมองว่านี่เจ๋งมาก ผมกำลังลองเล่น KolibriOS กับ MenuetOSx64 อยู่ แล้วก็เริ่มอยากลองสร้าง OS เองขึ้นมาเลย ยอดเยี่ยมจริง ๆ ที่ทำสำเร็จ
โปรเจกต์นี้น่าประทับใจมาก และอยากแสดงความยินดีด้วย ผมชอบ การพัฒนา OS มาตั้งแต่วัยรุ่น พอได้เห็นผลงานแบบนี้ถูกทำออกมาได้จริงก็รู้สึกดี
แอบสงสัยนิดหน่อยว่าระบบย่อยกราฟิกถูกเริ่มต้นอย่างไร ขอให้ไปได้สวยนะ
https://github.com/joexbayer/RetrOS-32/blob/development/grap...
https://github.com/joexbayer/RetrOS-32/blob/development/grap...
อยากให้ตัวเองมีเวลาสำหรับ โปรเจกต์จากแพสชัน แบบนี้บ้าง
ลืมเรื่องประโยชน์ใช้สอย ลืมกลยุทธ์ go-to-market ลืมความเหมาะสมกับตลาดเป้าหมาย แล้วแค่สร้างและเรียนรู้
หนึ่งในนั้นเคยเป็น OS ของเล่น แต่พอการพัฒนา OS ระดับต่ำกลายเป็นงานจริง โปรเจกต์นั้นก็หยุดไป
ผมอยู่ในสายนี้มาหลายสิบปี และกำลังพยายามเรียนรู้การพัฒนา OS รู้จัก FASM, NASM, FASM-G อยู่บ้าง
แต่ผมอยากศึกษาผลลัพธ์ของโปรแกรมแอสเซมเบลอร์ เพื่อเข้าใจว่า OS ทำงานจริงอย่างไรใน ระดับไบนารี
อยากรู้ว่าคุณได้เรียนโค้ดคำสั่งของสถาปัตยกรรมเฉพาะหรือไม่ จัดการโปรแกรมไดรเวอร์อุปกรณ์อย่างไร และช่วยสรุปขั้นตอนในการพัฒนา OS ด้วยตัวเองได้ไหม
มี tutorial อยู่บ้าง แต่หลายอันมีบั๊ก และมักกลายเป็นการสร้าง OS ของพวกเขาขึ้นมาใหม่โดยปริยาย
โค้ดคำสั่งผมไม่ได้ขุดลึกขนาดนั้น แค่ค้นตอนทำ C compiler เลยรู้เฉพาะคำสั่งพื้นฐานที่พบบ่อยที่สุด
https://forum.osdev.org/
https://wiki.osdev.org/Expanded_Main_Page
เจ๋งมาก อยากให้ จิตวิญญาณยุคคอมพิวเตอร์แรกเริ่ม ที่คนเล่นกับตัวคอมพิวเตอร์เองมากกว่าระดับแอปพลิเคชันกลับมาอีกเยอะ ๆ
ผมเคยคิดจะทำคอมพิวเตอร์ส่วนตัวเป็นโปรเจกต์งานอดิเรกระยะยาว เป็นคอมพิวเตอร์ที่สร้างสแต็กซอฟต์แวร์ทั้งหมดเอง และรู้ที่มาของทุกบิตที่อยู่ในระบบ
ฮาร์ดแวร์อาจควบคุมในระดับเดียวกันได้ยาก เว้นแต่จะใช้ FPGA ให้ได้ประสิทธิภาพพอสำหรับรันทั้งหมด แต่อย่างน้อยฝั่งซอฟต์แวร์ก็น่าจะเป็นไปได้
จนถึงตอนนี้มันดูไม่ค่อยสมจริง แต่สิ่งนี้แสดงให้เห็นว่าเป็นไปได้ ดูเหมือนกำลังทำ C compiler สำหรับงานอดิเรกด้วย: https://github.com/joexbayer/C-Compiler
C compiler ทำขึ้นสำหรับ OS นี้และทำงานอยู่ใน OS ได้ โปรเจกต์ใหญ่เกินไปจนผมอยากแยกออกจาก repository ของ OS โดยเฉพาะเพราะมันทำงานบน Linux ได้ด้วย
อยากให้ช่วยอธิบายเพิ่มเติมว่า compiler นี้โต้ตอบกับระบบปฏิบัติการอย่างไร โดยเฉพาะว่าจัดการฟีเจอร์อย่าง struct อย่างไร รวมถึงข้อจำกัดปัจจุบันและการปรับปรุงที่วางแผนไว้ในบริเวณนี้
struct ถูกมองเป็นพื้นที่หน่วยความจำที่มีขนาดกำหนดตาม member และการเข้าถึง member ก็จัดการด้วย offset ภายในพื้นที่นั้น
ตอนนี้ยังมีข้อจำกัดเยอะ เช่น มีแค่ int กับ char และยังไม่มีคำสั่ง switch ความต่างใหญ่ที่สุดจาก C มาตรฐานคืออนุญาตให้มีฟังก์ชันใน struct และถ้าเป็นฟังก์ชันของ struct ก็จะส่ง struct ให้ฟังก์ชันแบบอัตโนมัติ รายละเอียดเพิ่มเติมดูได้ที่นี่:
https://github.com/joexbayer/C-Compiler
นี่เป็นหนึ่งในโปรเจกต์จากแพสชันที่น่าประทับใจที่สุดในรอบค่อนข้างนานที่ผมเห็นที่นี่ อยากรู้ว่าทำไมถึงตัดสินใจใช้ C compiler ที่เขียนเอง