JSIX是我从头开始构建的自定义多核X64操作系统。它尚未完成,甚至是可用的(请参阅下面的状态和路线图部分),但是目前所有计划的主要内核功能现在至少实现至至少可通过的水平。
该项目的设计目标是:
现代性 - 我对为旧系统设计或在所有硬件上运行不感兴趣。我的目标只有64位体系结构和现代商品硬件。目前,这意味着使用Nehalem或更新的CPU和UEFI固件的X64系统。 (有关当前所需的CPU功能,请参见此列表。)最终,我想在Aarch64端口上工作,部分是为了迫使自己分解代码库的体系结构依赖性部分。
模块化 - 我想以微锁定方式将系统的大部分拉入单独的过程中。这是一个子目标是探索现在这样的微核的瓶颈,以及避开旧版硬件是否会让我设计的系统不那么陷入传统的微粒问题而陷入困境。
探索 - 我真的主要是这样做是为了获得有趣的学习和探索现代的操作系统开发。最初的功能实现可能会暂时丢弃模块化设计,以探索相关的硬件。
名称的注释:此内核最初被称为爆米花,但是我从那以后发现,爆米花linux项目也在开发带有该名称的内核,与该项目的同一时间开始。因此,我将这个内核JSIX(总是以JSIX或j6的样式设计,从未大写)为对L4,XV6和我出色的妻子的敬意。
以下主要特征领域是JSIX开发的目标:
完毕。引导加载程序加载内核和初始用户空间程序,并设置有关内存映射和EFI GOP Framebuffer的必要内核参数。可能的未来想法:
虚拟内存:足够。内核用代表映射区域的多种vm_area对象管理虚拟内存,这些对象可以属于一个或多个代表整个虚拟内存空间的vm_space对象。 (每个过程都有一个vm_space ,内核本身也是如此。)
剩下的要做:
物理页面分配:足够。当前的物理页面分配器实现使用了一组块,该块代表引导加载程序定义的可用内存的最新区域。每个块都有一个三级位图,表示免费/二手页面。
未来的工作:
充足的。全局调度程序对象将每个核心的准备就绪/阻止列表保留。核心定期尝试通过偷窃工作来平衡负载。
用户空间任务能够创建线程以及其他过程。
syscalls:足够。用户空间任务能够通过快速的SYSCALL/SYSRET说明将SYSCALL用于内核。通过libj6制作的syscall可以像标准的sysv abi函数呼叫一样向callee和呼叫者看。该实现将包裹在生成的包装器功能中,这些功能在调用实现功能之前验证请求,检查功能并找到适当的内核对象或处理。
IPC:工作,需要优化。当前的IPC原语是:
JSIX使用忍者构建工具,并使用配置脚本为其configure构建文件。该构建还依赖于自定义工具链SYSROOT,该工具链可以使用JSIX-OS/工具链中的脚本下载或构建。
其他构建依赖性:
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如上所述,使用JSIX-OS/工具链构建或下载工具链SYSROOT,并在该项目的根源上列为sysroot的构建工具链目录。
# Example if both the toolchain and this project are cloned under ~/src
ln -s ~ /src/toolchain/toolchains/llvm-13 ~ /src/jsix/sysroot设置工具链后,运行./configure脚本(请参阅./configure --help以获取可用选项)将设置构建配置,而ninja -C build (或任何放置构建目录的何处)实际上运行构建。如果已安装了qemu-system-x86_64 ,则qemu.sh脚本将以QEMU -nographic模式运行JSIX。
我个人要么是从真正的Debian AMD64 Bullseye机器或Windows WSL Debian Bullseye安装中运行的。您的里程可能会随其他设置和发行版而异。
JSIX现在具有运行各种自动化测试的test_runner用户空间程序。它不包含在默认构建中,但是如果您使用test.yml清单,它将被构建,并且可以使用test.sh脚本或qemu.sh脚本运行。
./configure --manifest=assets/manifests/test.yml
if ./test.sh ; then echo " All tests passed! " ; else echo " Failed. " ; fi