
คำเตือน! แทบจะ ไม่มีอะไร เลย ทุกอย่างที่นี่คือการทดลองและในการพัฒนาที่กระตือรือร้นมาก ดำเนินการด้วยความระมัดระวัง
คอมพิวเตอร์ แปลก แปลกในแง่ที่ว่าพวกเขารู้สึกมหัศจรรย์ถ้าคุณไม่รู้ว่าพวกเขาทำงานอย่างไร ถ้าและเมื่อไหร่คุณเริ่มเรียนรู้วิธีการทำงานความรู้สึกมหัศจรรย์นั้นจางหายไป คุณจะจบลงด้วย "ว้าว! นี่คือความสดใส" หรือ "ว้าว ... นี่มันอึ"
ดังนั้นคุณมี สอง ตัวเลือก:
ในกรณีที่ยังไม่ชัดเจนฉัน ก็เอา มาก่อน
โดยพื้นฐานแล้วฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ "คอมพิวเตอร์" การทำงานกับซอฟต์แวร์ระดับสูงนั้นค่อนข้างสนุก แต่ฉันมีนิสัยที่ไม่ดีในการมองหาอินเตอร์เนลระดับต่ำและการทำงานของสิ่งของ
"โอ้ดังนั้นการโทรไปที่
malloc()และnewจบลงด้วยการเรียก syscallmmap()ลองตรวจสอบว่ามันเป็นไปได้ ..MAIRVMAคืออะไร?MMUคืออะไรTLBTCRอะไร?
มีเลเยอร์เหล่านี้ เป็นนามธรรม ที่ฉันไม่รู้! ฉันควรจะหยุดที่นั่น แต่ไม่ แต่ฉันพูดว่า: "โอเคฉันชอบความรู้สึก เรียกร้อง ของสิ่งที่อยู่ในระดับต่ำมากไปเถอะและพยายามเรียนรู้สิ่งที่เป็นนามธรรมทั้งหมดโดยการเขียนระบบปฏิบัติการ 'เรียบง่าย' และตอนนี้ฉันอยู่ที่นี่
ระบบปฏิบัติการอดิเรกที่ทำงานอยู่ระหว่างดำเนินการ /W "ทำด้วยมือ" microkernel ชื่อนี้มาจากทวีปทางการเมืองและความยุ่งเหยิงมากที่สุดในโลกแห่ง Game of Thrones [^2] ฉันชอบ Got (ใช่ตัดสินฉันทุกสิ่งที่คุณต้องการ) และความยุ่งเหยิงทางการเมืองของมันรู้สึกคล้ายกับเป้าหมายของฉันกับโครงการนี้ ทุกอย่างอยู่ทั่วสถานที่และไม่มีอะไรสมเหตุสมผล
โครงการนี้มีอยู่เพียงเพื่อช่วยให้ ฉัน เรียนรู้เกี่ยวกับระบบปฏิบัติการและเพื่อความสนุกสนานตลอดทาง ฉันไม่ได้อ้างว่ารู้มากเกี่ยวกับการพัฒนา ระบบปฏิบัติการ ดังนั้นการปฏิบัติการออกแบบ chocies และการใช้งานบางอย่างที่คุณเห็นที่นี่จะทำให้คุณตกใจ
ฉันแนะนำให้ kepp ความคาดหวังของคุณต่ำ>. <
หมายเหตุสำคัญ: Westeros อยู่ในระหว่างการพัฒนา ในช่วงต้น สิ่งต่าง ๆ จะเปลี่ยนเบรกหรือตรงขึ้นไปโง่ ฉันยังไม่ได้กำหนดเป้าหมายสุดท้าย ก่อนหน้านั้นคาดหวังทุกอย่างทุกที่ในครั้งเดียว
/dev และ /proc (idk ถ้าเป็นไปได้?)mkdir , touch & catมาดำน้ำมากขึ้นในการทำงานภายในของสิ่งต่าง ๆ เครื่องเป้าหมาย มีความเฉพาะเจาะจงและคงที่มาก ฉันต้องการให้มันง่ายที่สุดเท่าที่จะเป็นไปได้โดยการสนับสนุนเฉพาะสถาปัตยกรรม ARM64 (ARMV8) และเครื่อง Virt Virt ของ QEMU
นี่คือเครื่องเป้าหมาย

มีการกำหนดเฉพาะอุปกรณ์ต่อพ่วงขั้น พื้นฐาน เท่านั้น น่าเศร้านี่หมายความว่าไม่มี USB, NVME และ NIC :( บางทีในอนาคต?
นี่คืออุปกรณ์ต่อพ่วงที่ฉัน วางแผน จะสนับสนุน
เคอร์เนลติดตามการออกแบบ microkernel อย่างง่าย (เช่นครอบครัว L4) ฉันต้องการทำเคอร์เนล ง่ายๆ ที่เข้าใจง่ายและช่วยให้ฉันเรียนรู้ให้มากที่สุดในระหว่างกระบวนการ
ตอนแรกฉันติดตาม XV6 ของ MIT อย่างไรก็ตามเมื่อถูกถามผู้คนบอกฉันว่ามันเป็น "ไร้เดียงสา/ราคาถูก" เกินไปและอาจจะไม่ช่วยฉัน IRL ( พวกเขาเป็นคนที่น่าทึ่ง btw ) ดังนั้นฉันตัดสินใจที่จะรับคำแนะนำของพวกเขาและไปกับการออกแบบ microkernel ดูเหมือนว่าน่าสนใจมากขึ้น OO
คำเตือน! การออกแบบ microkernel ที่ทำด้วยมือ ของฉันจะทำให้คุณ ตัวอย่างเช่นฉันวางไดรเวอร์อุปกรณ์ไว้ในพื้นที่ผู้ใช้และตัวกำหนดตารางเวลาภายในพื้นที่เคอร์เนล (โดยทั่วไปไม่ได้ติดตามการออกแบบ "เหมาะสม/acedemic")
เพียงแค่ให้เวลาฉัน ฉันยังคงเรียนรู้ขณะที่ฉันไป>. <
นี่คือภาพรวมโดยรวมของเคอร์เนล (TODO: จะอัปเดตเร็ว ๆ นี้ ... )

TODO: ข้อกำหนดของระบบปฏิบัติการโดยรวม อะไรคืออะไรและเป้าหมายในอนาคต


|-- Build <- Compiled objects, binaries & debug files
|-- Documents <- Reference documents
|-- Emulation <- QEMU scripts & Device Tree Structure
|-- Kernel <- The source code. Headers, C and C++ files
| `-- Arch <- Architecture related code
| `-- Drivers <- Driver source and header files
| `-- Library <- Library source and header files
| `-- Include <- Kernel header files
|-- Media <- Images and other media
|-- Toolchain <- Cross-compiling environment
|-- Userland <- User level source code
| `-- Dir. <- TBD.
|-- .gitignore <- Good ol' .gitignore
|-- Makefile <- Makefile
`-- README.md <- Main README
ปัจจุบันวิธีเดียวที่จะบูต Westeros อยู่ในเครื่อง Virt ของ Aarch64 ของ QEMU ผ่านพารามิเตอร์ -kernel
ส่วนที่รับผิดชอบในการเปิดตัวเคอร์เนล (และดังนั้นระบบปฏิบัติการ) เรียกว่า Shim มันเป็นรหัสชิ้นเล็ก ๆ ที่เชื่อมโยงกับภาพเคอร์เนลและรับผิดชอบในการบูตระบบ
มันจัดการการดำเนินการบางอย่างก่อนที่เคอร์เนลจะควบคุม
ข้อมูลอ้างอิง: SEL4 - Elfloader
State of ARM64 Machine (เช่นทะเบียน) ก่อน kmain()
0xffff0000401080000x401010000x401020030x401020000x400007010x401030000x401040030x401040000x400007010xbbff440c04000b00000000 (DEVICE_nGnRnE)0b00000100 (DEVICE_nGnRE)0b00001100 (DEVICE_GRE)0b01000100 (NORMAL_NC)0b11111111 (NORMAL)0b10111011 (NORMAL_WT)0b00000000 (Res)0b00000000 (Res)0x4801000100b0 (48 bit)0b100 (44 bits, 16TB)0b01000 (16)0b01000 (16)0b0 (Hierarchical permissions enabled)0b0 (Hierarchical permissions enabled)0b0 (Top Byte used)0b0 (Top Byte used)0b0 (8 bit)0b0 (TTBR0_EL1.ASID defines the ASID)0b0 (Perform table walk)0b0 (Perform table walk)0b10 (4 KiB)0b00 (4 KiB)0b00 (Non-shareable)0b00 (Non-shareable)0b00 (Outer Non-cacheable)0b00 (Outer Non-cacheable)0b00 (Inner Non-cacheable)0b00 (Inner Non-cacheable)0x40101000 (k_l0_pgtbl)0x40103000 (u_l0_pgtbl)0xc508390b1 (MMU enabled)0b0 (Alignment fault checking is disabled)0b00b1 (SP Alignment check enabled)0b1 (SP Alignment check enabled for EL0)0b1 (System instruction memory barrier enabled for EL0 Aarch32)0b0 (Access to Stage 1 Normal memory from EL0 & EL1 are Stage 1 Non-cacheable)เคอร์เนล Westeros ติดตามการออกแบบ microkernel คน/องค์กรที่แตกต่างกันมีการตีความที่แตกต่างกันเกี่ยวกับวิธีการออกแบบ microkernel (เช่น L4, minix) ที่นี่ฉันใช้คำว่า micro เป็นการทำให้เคอร์เนลง่ายที่สุดเท่าที่จะทำได้ หมายความว่า:
ทั้งหมดข้างต้นจะต้องใช้เป็นแอปพลิเคชันพื้นที่ผู้ใช้
เคอร์เนล จะ ให้บริการและฟังก์ชั่นต่อไปนี้:
mmap() )msgsend() , msgrecv() )thread_create() )intr_attach() )gettimeofday() )yield() ) เคอร์เนลต้องการภาพผู้ใช้ [เริ่มต้น] จาก bootloader ภาพนี้ควรมีการดำเนินการ ELF ครั้งแรกที่เคอร์เนลจะเปิดตัว (น่าจะเป็น root task และ process manager )
ภาพใช้งานสามารถคิดได้ว่าเป็น initrd ที่ใช้ในระบบ Linux
รายการที่สมบูรณ์ของทุกสิ่งที่เคอร์เนลให้และการทำงานภายในของสิ่งของจะถูกอธิบายในภายหลังบนถนน ฉันยังไม่ได้ ใช้ พวกเขา ..
สำหรับการอ้างอิงฉันใช้ประโยชน์จาก microkernels & OSE ต่อไปนี้สูง:
TODO: บางสิ่งที่สนุก สิ่งที่รอใครบางคนที่พวกเขาเปิดตัวระบบปฏิบัติการ?
บริการต่อไปนี้จะต้องดำเนินการ:
services.config ) ในการสร้างและเรียกใช้ระบบปฏิบัติการคุณต้องการสามสิ่งหลัก: ARM GNU Toolchain , QEMU และ Patience เล็กน้อย
เป็นไปได้ที่จะสร้างทุกอย่างในระบบปฏิบัติการที่คุณชื่นชอบ ARM GNU Toolchain มีให้บริการทั้งบน Windows , MacOS และ GNU/Linux อย่างไรก็ตามฉันยังไม่ได้ทดสอบ หน้าต่าง ดังนั้นคุณอยู่คนเดียวในพื้นที่นั้น ขอโทษ :(
ขั้นตอนด้านล่างนี้สำหรับโฮสต์ GNU/Linux (Aarch64)
0. ตรวจสอบให้แน่ใจว่าคุณมี git และ make
$ apt install git make # if using `apt`
$ pacman -S git make # if using `pacman`1. โคลนที่เก็บนี้
$ git clone https://github.com/TunaCici/WesterOS.git 2. ดาวน์โหลด ARM GNU Toolchain ล่าสุด
นำทางไปยังเว็บเพจดาวน์โหลดเครื่องมือ GNU GNU
เลือก เป้าหมาย Aarch64-matel ที่เหมาะสมเพื่อดาวน์โหลด เวอร์ชัน ไม่ควร สำคัญดังนั้นเลือกรุ่นล่าสุด อย่างไรก็ตามโฮสต์เครื่องมือที่คุณดาวน์โหลดนั้นมีความสำคัญ เลือกอันที่สร้างขึ้นสำหรับระบบปฏิบัติการของคุณเอง
ตัวอย่างเช่นหากระบบปฏิบัติการของคุณคือ GNU/Linux (x86_64) คุณดาวน์โหลด:
https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-elf.tar.xz
$ cd WesterOS/Toolchain
$ wget https://developer.arm.com/-/media/Files/downloads/gnu/12.2.rel1/binrel/arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xzมันเป็นความรับผิดชอบของคุณในการตรวจสอบ "ความสมบูรณ์" และ "ลายเซ็น" ของไฟล์ที่ดาวน์โหลด ใช้คีย์ SHA256 ที่มีให้ในหน้าดาวน์โหลด
3. แยกแขน ARM GNU Toolchain ที่ดาวน์โหลดมา
ตรวจสอบให้แน่ใจว่าได้แยกออกในขณะที่อยู่ใน Westeros/Toolchain
$ tar -xvf arm-gnu-toolchain-12.2.rel1-aarch64-aarch64-none-elf.tar.xz 4. แก้ไข TOOLCHAIN_PATH ใน Makefile
TOOLCHAIN_PATH ควรชี้ไปที่การดาวน์โหลดและสกัด ARM GNU Toolchain ของคุณ เนื่องจากเวอร์ชันโฮสต์ระบบปฏิบัติการและ Toolchain อาจแตกต่างจากของฉันคุณต้องแก้ไขตัวแปรพา ธ
หากไม่ได้ตั้งค่าอย่างถูกต้องกระบวนการ make จะล้มเหลวด้วยข้อความแสดงข้อผิดพลาดเช่น:
make[1]: Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf/bin/aarch64-none-elf-as: No such file or directory
ดังนั้นตรวจสอบให้แน่ใจว่าได้แก้ไข TOOLCHAIN_PATH
# Open the main Makefile /w your favorite text editor
$ vim Makefile
# And change the `TOOLCHAIN_PATH` accordingly. For example..
> TOOLCHAIN_PATH=Toolchain/arm-gnu-toolchain-12.2.rel1-darwin-arm64-aarch64-none-elf
# Save & exit 5. สร้างโดยใช้ make
$ make allบิลด์จบลงด้วย การสร้างข้อความที่สมบูรณ์ สนุกกับชีวิต <3 . ถ้าคุณไม่เห็นโปรดติดต่อฉัน ฉันจะลองแก้ไขปัญหา>. <
Westeros สามารถทำงานได้โดยใช้ QEMU เท่านั้น ฉันไม่มีแผนที่จะสร้างภาพที่บูรณะได้อย่างเต็มที่สำหรับฮาร์ดแวร์ในโลกแห่งความเป็นจริง ในขั้นต้นความคิดของฉันคือการเลียนแบบ ราสเบอร์รี่ Pi 4b แต่ฉันรู้ว่ามันอาจจะไม่เป็น "เริ่มต้นที่เป็นมิตร" เมื่อทดสอบและ deubgging ดังนั้น qemu มันคือ!
เวลาปลั๊กไร้ยางอาย! หากคุณต้องการข้อมูลเพิ่มเติมเกี่ยวกับ QEMU ไปที่ QEMU_STARTER GITHUB ของฉัน
0. ตรวจสอบให้แน่ใจว่าคุณติดตั้ง qemu-system-aarch64
$ apt install qemu-system qemu-utils # if using `apt`
$ pacman -S qemu-full # if using `pacman`1. เปิดตัว Westeros
$ make runณ วันที่ 9 กรกฎาคม 2566 Westeros นั้นว่างเปล่าตรงไปตรงมา! ดังนั้นคุณไม่สามารถทำอะไรได้นอกจากดูข้อความเคอร์เนลพื้นฐานบางอย่างบนเทอร์มินัล:/
จากนั้นอีกครั้ง Westeros เป็น ระบบปฏิบัติการอดิเรก และ กระบวนการเรียนรู้ คุณควรพยายามสำรวจซอร์สโค้ดของมัน ฉันแน่ใจว่าคุณจะสนุกมากขึ้นที่นั่น
TODO: นำทางผู้ใช้ไปยัง readMe อื่นซึ่งเป็นเอกสาร