
警告!幾乎什麼都沒有完成。這裡的一切都是實驗性的,並且在非常積極的發展中。謹慎行事。
計算機很奇怪。如果您不知道它們是如何工作的,那麼他們就會感到神奇的意義上很奇怪。如果以及何時開始學習它的工作方式,那神奇的感覺消失了。您要么最終都會得到“哇!這是光彩”或“哇...這是狗屎”。
因此,您基本上有兩個選擇:
如果還不明顯,我拿了後者。
基本上,我想了解有關“計算機”的更多信息。使用相對高級的軟件工作非常有趣,但是我有一個不好的習慣,最終要查看低級實習生和工作的工作。
“哦,所以我打電話給
malloc()和new最終打電話給syscallmmap()?讓我們檢查一下它的實現..哦,VMA是什麼?什麼是MMU?什麼是TLB?什麼是TCR和MAIR?我是什麼?我是什麼?我是什麼?我是什麼?
我不知道這些抽象層!我應該在那裡停下來,但沒有。取而代之的是:“好吧。我真的很喜歡低級東西的風情。讓我們瘋狂地嘗試通過編寫“簡單”操作系統來學習所有抽象。什麼可能出了問題?”現在,我在這裡。
在進行工作的業餘愛好者操作系統/W“手工製作”微核。這個名字來自《權力的遊戲世界》中最政治和混亂的大陸。 [^2]我真的很喜歡got(是的,判斷我想要的一切),政治混亂與我對這個項目的目標相似。一切都到處都是,沒有任何意義。
該項目的存在只是為了幫助我了解操作系統並在此過程中獲得一些樂趣。我聲稱對操作系統開發了解太多。因此,您在這裡看到的實踐,設計巧克力和某些實現將嚇到您。
我建議將您的期望低>。 <。 <
重要說明: Westeros處於非常早期的發展。東西會改變,制動或直接愚蠢。我還沒有定義最終目標。直到那時,任何地方都期望一切都立刻。
/dev和/proc (如果可能的話,idk?)mkdir , touch & cat讓我們進一步研究事物的內部工作。目標機非常具體且靜態。我想通過僅支持ARM64架構(ARMV8)和Qemu的Arm Virt機器來保持盡可能簡單。
這是目標機。

僅定義了必不可少的基本外圍設備。可悲的是,這意味著沒有USB,NVME和NIC。 :(也許將來?
這是我計劃支持的外圍設備。
內核遵循一個簡單的微粒設計(例如L4家庭)。我想製作一個易於理解並幫助我在此過程中盡可能多地學習的簡單內核。
我最初遵循麻省理工學院的XV6。但是,當被問及時,人們告訴我,這太“天真/便宜”,可能不會幫助我IRL(他們真是太神奇了)。因此,我決定接受他們的建議,並進行微核設計。似乎更有趣的oo
警告!我的手工製作的微粒設計會觸發您。例如,我將設備驅動程序放在用戶空間和調度程序中,並在內核空間內(基本上不是真正遵循“適當/流行”設計)。
只是給我一些時間。我繼續學習>。 <
這是內核的總體概述。 (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的唯一方法是通過-kernel參數在QEMU的AARCH64 VIRD機器上。
負責啟動內核的部分(以及OS)稱為Shim。這是一小部分代碼,與內核圖像並駕齊驅,負責引導系統。
它可以在內核控制之前處理一些操作。
參考:SEL4 -Elfloader
在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內核遵循微粒設計。不同的人/組織對如何設計微粒有不同的解釋(例如,L4,minix)。在這裡,我使用Micro一詞來使內核盡可能簡單。這意味著:
以上所有內容都需要作為用戶空間應用程序實現。
內核將提供以下服務和功能:
mmap() )msgsend() , msgrecv() )thread_create() )intr_attach() )gettimeofday() )yield() )內核需要啟動加載程序的[初始]用戶圖像。該圖像應包含內核將啟動的第一個精靈可執行文件(可能是root task和process manager )。
可以將使用者圖像視為Linux系統中使用的啟動。
內核提供的所有內容的完整列表和內部工作的工作將在後面進行解釋。我還沒有實施它們。
至於參考,我高度使用了以下微粒和OS:
托多:一些有趣的東西。是什麼等待著他們推出操作系統的人?
將實施以下服務:
services.config )要構建並運行操作系統,您需要三件事: ARM GNU Toolchain , QEMU和一點Patience™。
可以在您喜歡的操作系統上構建所有內容。 ARM GNU Toolchain都可以在Windows , MacOS和GNU/Linux上使用。但是,我尚未測試Windows 。因此,您一個人在那個領域。對不起 :(
以下步驟是針對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
導航到ARM GNU工具鏈下載網頁。
選擇適當的Aarch64裸機目標要下載。版本不重要,因此請選擇最新的版本。但是,您下載的託管工具鏈確實很重要。選擇為自己的操作系統創建的一個。
例如,如果您的操作系統是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。修改Makefile中的TOOLCHAIN_PATH
TOOLCHAIN_PATH應該指向您新下載和提取的ARM GNU Toolchain 。由於您的主機OS和工具鏈版本可能與我的不同,因此您必須編輯路徑變量。
如果未正確設置, 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 Build
$ make all構建以消息構建完整結束。享受生活<3 。如果您看不到,請與我聯繫。我將嘗試解決問題>。 <
Westeros只能使用QEMU運行。我沒有計劃為現實世界硬件製作完整的圖像。最初,我的想法是模仿Pi 4b的Raspberrry Pi 4B ,但我意識到在測試和脫身時可能並不是“初學者友好的”。所以,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截至2023年7月9日,Westeros直接空了!因此,除了在終端上查看一些非常基本的內核消息外,您無能為力:/
再說一次,維斯特羅斯是一個業餘愛好者操作系統和學習過程。您應該真正嘗試探索其源代碼。我敢肯定,您在那裡會很開心。
TODO:將用戶導航到另一個基本上是文檔的讀數。