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