Neptune OS是SEL4 Microkernel的Windows NT個性。它將Microsoft稱為“ NT Execudeion”(Windows內核NTOSKRNL.EXE )的“ NT Execudeion”作為SEL4 Microkernel下的用戶過程。 NT高管實現了所謂的NT本機API,即構建更熟悉的Win32 API的Windows的本機系統調用接口。這些通過NTDLL.DLL中的存根函數接觸到用戶模式,並帶有NtCreateProcess之類的名稱。 NT主管還負責將編程接口公開到設備驅動程序。所述界麵包含諸如IoConnectInterrupt和IoCallDriver類的功能。我們的體系結構使設備驅動程序能夠在單獨的用戶空間流程中運行,並通過標準SEL4 IPC原語與NT執行過程進行通信。
Neptune OS項目的最終目標是實施足夠的NT語義,以便可以在Neptune OS以及大多數ReactOS內核驅動程序下移植ReactOS用戶土地。從理論上講,我們應該能夠與本機窗口可執行文件實現二進制兼容性,前提是我們對NT本機API的實施足夠忠實。我們還應該能夠使用Windows設備驅動程序和文件系統驅動程序實現高度的源代碼可移植性,儘管由於與Windows/ReactOS的架構差異,我們的目標差異使該目標是非現實的,但我們的目標不是完整的,線路的源代碼兼容性。請參閱文檔部分以獲取更多信息。
該項目的當前狀態是,我們已經實施了足夠的NT執行組件,以支持具有讀取和寫下的緩存支持合理完整的文件系統堆棧,其中包括FAT12/16/32文件系統驅動程序fatfs.sys和Floppy Controller驅動程序驅動程序驅動程序fdc.sys 。我們還有一個基本的鍵盤驅動程序堆棧,其中包括鍵盤類驅動程序kbdclass.sys和PS/2端口驅動程序i8042prt.sys 。這些使我們能夠從ReactOS項目中運行一個基本命令提示ntcmd.exe ,該項目支持大多數常見的外殼命令,例如pwd , cd ,COPY, copy , move ,MOVE,MOVE, del , mount和umount 。我們還包括一個beep.sys驅動程序,該驅動程序在PC揚聲器上發出令人討厭的聲音。
整個系統適合軟盤,可以從版本v0.2.0002中下載。您可以在YouTube上觀看簡短的演示。您也可以自己構建。請參閱建築物的部分。
對於下一個版本,我們計劃將ReactOS的ATA/AHCI驅動程序堆棧移植,以便我們可以支持大多數PATA/SATA硬盤。我們還計劃編寫/端口磁盤基準套件,以便我們可以證明微粒設計不會導致無法接受的性能懲罰。
對於i386系統(可能稱為i686):
sel4/src/arch/x86/32/head.S中的彙編例程enable_paging )。對於AMD64系統:
fsgsbase指令的情況下構建的。這僅在常春藤橋和後來的支持下得到支持。要運行AMD64在較早的CPU上構建,您可以在private/ntos/cmake/sel4.cmake中禁用FSGSBase指令。另外,我們需要以來自Nehalem以來可用的CMPXCHG16B,並且很有可能(早期的Core 2處理器可能需要Microcode更新)。對於amd64機器,ThinkPad X230已進行了測試。
您需要在Linux下構建(SEL4在任何其他操作系統下都不構建)。您將需要以下python依賴性,甚至更多。
jinja2
future
ply
setuptools
six
lxml
您還需要cmake , clang , llvm和lld作為基本工具鏈。 clang是一種本地交叉編譯器,可以同時生成精靈和PE目標。不支持海灣合作委員會,但從理論上講可以使工作。如果您想使GCC工作,您將同時需要精靈工具鍊和PE工具鏈(可能還有很多耐心)。您還需要windmc ,即mingw的PE消息資源編譯器。請查看build.sh的構建腳本。首選的叮噹版本為15,但最近的版本都應該使用。您還需要cpio實用程序來構建Initcpio。最後,對於啟動軟盤和啟動ISO,您將需要以下工具: syslinux (用於啟動軟盤), grub和xorriso (用於啟動ISO)和mtools (兩者)。
建議使用啟用語言服務器的IDE瀏覽源代碼。經過測試的設置是用clangd作為語言服務器的emacs上的lsp-mode軟件包。 build.sh腳本將生成clangd的compile_commands.json文件。為此,您需要安裝JQ。
首先克隆項目(請確保您使用git clone --recurse-submodules因為我們將SEL4內核作為subsodule),然後運行
./build.sh [amd64] [release]
如果您不指定amd64 ,則是i686構建。如果您不指定release ,則是調試構建。要創建啟動訴訟,請輸入
./mkfloopy.sh [amd64] [release]
要創建啟動ISO,請輸入
./mkiso.sh [amd64] [release]
要使用QEMU模擬,請運行
./run.sh [direct|iso|uefi] [amd64] [release] [extra-qemu-args]
如果指定direct ,則QEMU將直接加載SEL4內核和NTOS映像(使用-kernel和-initrd )。如果指定iso或uefi ,它將加載mkiso.sh構建的啟動ISO。 uefi選項還將配置QEMU以加載UEFI固件,該固件提供了一個不錯的高清框架擋板控制台。否則,使用mkfloppy.sh創建的靴子軟盤。額外的爭論傳遞給Qemu。例如,要在QEMU中啟用PC揚聲器的i386發行版構建,您可以通過以下內容(假設您使用的是最近的QEMU版本,並且具有pulseaudio)
./run.sh release -machine pcspk-audiodev=snd0 -audiodev pa,id=snd0
調試構建可能會緩慢運行,特別是如果您打開串行端口記錄。您可以通過修改NT Execution Project的主標頭(請參閱private/ntos/inc/ntos.h )來關閉日誌記錄。
我們使用LLVM工具鏈,因此理論上的交叉編譯應該簡單地工作而無需任何特殊處理。實際上,在i386 / amd64上,最終SEL4內核可執行文件的鏈接腳本依賴於只有GNU LD鏈接器支持的功能,因此我們不能使用LLVM Linker(LLD)來鏈接SEL4內核。這意味著您將需要在通常的位置( /usr/bin )中安裝的目標三元組i686-pc-linux-gnu和x86_64-pc-linux-gnu的GNU LD交聯鍊鍊接器,以便clang可以找到它們並在鏈接SEL4 kernel時找到並正確調用它們。工具鏈的PE部分是完全獨立的,並且在交叉編譯時不需要特殊的處理(它已經是交叉鏈,因為我們將窗戶定位在Linux主機上)。
在llvm-14上運行的Archlinux(loongson 3A5000處理器)上對Archlinux進行了交叉編譯,並似乎生成了正確的代碼。如果您遇到任何問題,請打開問題。
請注意,如果您的grub是為本機平台而不是i686/amd64構建的,則mkiso.sh生成的啟動ISO將不起作用,因為grub-mkrescue將嘗試將本機平台的啟動文件複製到ISO。要解決此問題,請跨構建I686/AMD64的GRUB軟件包(或在I686/AMD64系統上運行最終ISO生成)。
文檔位於docs目錄下。對於開發人員和有興趣了解Neptune OS的內部運作的人,請閱讀Developer-Guide.md guide.md,該MD從操作系統的架構概述開始,並繼續解釋單個OS組件的各種設計決策。它還包含有興趣從ReactOS移植驅動程序的人的驅動器移植指南。