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移植驱动程序的人的驱动器移植指南。