JSIX เป็นระบบปฏิบัติการมัลติคอร์ x64 ที่กำหนดเองที่ฉันกำลังสร้างตั้งแต่เริ่มต้น มันยังห่างไกลจากการเสร็จสิ้นหรือแม้กระทั่งการใช้งาน (ดูส่วน สถานะและแผนงาน ด้านล่าง) แต่คุณสมบัติเคอร์เนลหลักที่วางแผนไว้ทั้งหมดในปัจจุบันได้ถูกนำมาใช้อย่างน้อยก็ในระดับที่ผ่านได้
เป้าหมายการออกแบบของโครงการคือ:
ความทันสมัย - ฉันไม่สนใจที่จะออกแบบระบบมรดกหรือทำงานกับฮาร์ดแวร์ทั้งหมด เป้าหมายของฉันคือสถาปัตยกรรมเพียง 64 บิตและฮาร์ดแวร์สินค้าโภคภัณฑ์ที่ทันสมัย ปัจจุบันนั่นหมายถึงระบบ X64 ที่มี Nehalem หรือซีพียูใหม่และเฟิร์มแวร์ UEFI (ดูรายการนี้สำหรับคุณสมบัติ CPU ที่ต้องการในปัจจุบัน) ในที่สุดฉันต้องการทำงานบนพอร์ต Aarch64 ส่วนหนึ่งเพื่อบังคับตัวเองให้คำนึงถึงชิ้นส่วนที่ขึ้นกับสถาปัตยกรรมของฐานรหัส
Modularity - ฉันต้องการดึงระบบออกเป็นกระบวนการที่แยกออกจากกันมากที่สุดเท่าที่จะทำได้ในรูปแบบ microkernel เป้าหมายย่อยของสิ่งนี้คือการสำรวจว่าปัญหาคอขวดของ microkernel อยู่ในขณะนี้และไม่ว่าฮาร์ดแวร์มรดกมรดกจะช่วยให้ฉันออกแบบระบบที่จมอยู่กับปัญหา microkernel แบบดั้งเดิมน้อยลงหรือไม่
การสำรวจ - ฉันส่วนใหญ่ทำสิ่งนี้เพื่อให้มีความสนุกสนานในการเรียนรู้และสำรวจการพัฒนาระบบปฏิบัติการที่ทันสมัย การใช้งานคุณสมบัติเบื้องต้นอาจทำให้การออกแบบแบบแยกส่วนชั่วคราวเพื่อให้สามารถสำรวจฮาร์ดแวร์ที่เกี่ยวข้องได้
หมายเหตุเกี่ยวกับชื่อ: เคอร์เนลนี้มีชื่อว่า Popcorn แต่เดิมฉันได้ค้นพบว่าโครงการ Popcorn Linux กำลังพัฒนาเคอร์เนลที่มีชื่อนั้นเริ่มต้นในเวลาเดียวกันกับโครงการนี้ ดังนั้นฉันจึงเปลี่ยนชื่อเคอร์เนล JSIX นี้ (สไตล์ JSIX หรือ j6 มักจะไม่เคยเป็นตัวพิมพ์ใหญ่) เป็นการแสดงความเคารพต่อ L4, XV6 และภรรยาที่ยอดเยี่ยมของฉัน
พื้นที่คุณลักษณะที่สำคัญต่อไปนี้คือเป้าหมายสำหรับการพัฒนา JSIX:
เสร็จแล้ว. bootloader โหลดเคอร์เนลและโปรแกรมผู้ใช้เริ่มต้นและตั้งค่าอาร์กิวเมนต์เคอร์เนลที่จำเป็นเกี่ยวกับแผนที่หน่วยความจำและ EFI GOP Framebuffer แนวคิดในอนาคตที่เป็นไปได้:
หน่วยความจำเสมือนจริง: เพียงพอ เคอร์เนลจัดการหน่วยความจำเสมือนจริงที่มีวัตถุ vm_area หลายชนิดที่แสดงถึงพื้นที่ที่แมปซึ่งอาจเป็นหนึ่งในวัตถุ vm_space หนึ่งวัตถุหรือมากกว่าซึ่งเป็นตัวแทนของพื้นที่หน่วยความจำเสมือนทั้งหมด (แต่ละกระบวนการมี vm_space และเคอร์เนลเองก็เช่นกัน)
ยังเหลืออยู่:
การจัดสรรหน้าทางกายภาพ: เพียงพอ การจัดสรรการจัดสรรหน้าฟิสิคัลปัจจุบันใช้กลุ่มของบล็อกที่แสดงถึงพื้นที่ที่ทันสมัยของหน่วยความจำที่ใช้งานได้ตามที่กำหนดโดย bootloader แต่ละบล็อกมีบิตแมปสามระดับแสดงหน้าฟรี/ใช้งาน
งานในอนาคต:
เพียงพอ. วัตถุ Global Scheduler แยกรายการพร้อม/บล็อกแยกต่างหากต่อคอร์ คอร์พยายามที่จะสร้างความสมดุลให้กับการโหลดผ่านการขโมยงานเป็นระยะ
งานพื้นที่ผู้ใช้สามารถสร้างเธรดและกระบวนการอื่น ๆ ได้
Syscalls: เพียงพอ งานพื้นที่ผู้ใช้สามารถสร้าง syscalls ไปยังเคอร์เนลผ่านคำแนะนำ Syscall/Sysret ที่รวดเร็ว Syscalls ทำผ่าน libj6 ดูทั้ง Callee และผู้โทรเช่นการเรียกใช้ฟังก์ชั่นมาตรฐาน SYSV ABI การใช้งานจะถูกห่อหุ้มด้วยฟังก์ชั่น wrapper ที่สร้างขึ้นซึ่งตรวจสอบความถูกต้องของคำขอตรวจสอบความสามารถและค้นหาวัตถุเคอร์เนลหรือจัดการที่เหมาะสมก่อนที่จะเรียกฟังก์ชั่นการใช้งาน
IPC: การทำงานต้องการการเพิ่มประสิทธิภาพ IPC Primitives ปัจจุบันคือ:
JSIX ใช้เครื่องมือสร้างนินจาและสร้างไฟล์บิลด์สำหรับมันด้วยสคริปต์ configure บิลด์ยังขึ้นอยู่กับระบบเครื่องมือที่กำหนดเองซึ่งสามารถดาวน์โหลดหรือสร้างได้โดยใช้สคริปต์ใน JSIX-OS/Toolchain
การพึ่งพางานสร้างอื่น ๆ :
configure สคริปต์มีการพึ่งพา Python บางส่วน - สามารถติดตั้งได้ผ่าน pip แม้ว่าจะแนะนำในสภาพแวดล้อมเสมือนจริงของ Python การติดตั้งผ่าน pip จะติดตั้ง ninja
ระบบ Debian 11 (bullseye) สามารถกำหนดค่าด้วยการพึ่งพาการสร้างที่จำเป็นโดยเรียกใช้คำสั่งต่อไปนี้จากรูทที่เก็บ JSIX:
sudo apt install clang lld nasm mtools python3-pip python3-venv
python3 -m venv ./venv
source venv/bin/activate
pip install -r requirements.txt
peru sync สร้างหรือดาวน์โหลด Toolchain Sysroot ดังที่ได้กล่าวไว้ข้างต้นด้วย JSIX-OS/Toolchain และ Symlink ไดเรกทอรี Toolchain ที่สร้างขึ้นเป็น sysroot ที่รากของโครงการนี้
# Example if both the toolchain and this project are cloned under ~/src
ln -s ~ /src/toolchain/toolchains/llvm-13 ~ /src/jsix/sysroot เมื่อมีการตั้งค่า Toolchain แล้วให้เรียกใช้สคริปต์ ./configure ค่า (ดู ./configure --help สำหรับตัวเลือกที่มีอยู่) จะตั้งค่าการกำหนดค่าการสร้างและ ninja -C build (หรือที่ใดก็ตามที่คุณใส่ไดเรกทอรีบิลด์) จะเรียกใช้งานจริง หากคุณติดตั้ง qemu-system-x86_64 สคริปต์ qemu.sh จะเรียกใช้ JSIX ในโหมด QEMU -nographic
โดยส่วนตัวแล้วฉันเรียกใช้สิ่งนี้จากเครื่อง Debian AMD64 Bullseye จริงหรือการติดตั้ง Windows WSL Debian Bullseye ไมล์สะสมของคุณอาจแตกต่างกันไปตามการตั้งค่าและ distros อื่น ๆ
ตอนนี้ JSIX มีโปรแกรม test_runner userspace ที่ทำงานการทดสอบอัตโนมัติต่างๆ มันไม่รวมอยู่ในบิลด์เริ่มต้น แต่ถ้าคุณใช้ test.yml manifest มันจะถูกสร้างขึ้นและสามารถเรียกใช้กับสคริปต์ test.sh หรือสคริปต์ qemu.sh
./configure --manifest=assets/manifests/test.yml
if ./test.sh ; then echo " All tests passed! " ; else echo " Failed. " ; fi