O JSIX é um sistema operacional X64 de vários núcleos personalizado que estou construindo do zero. Está longe de terminar, ou mesmo ser utilizável (consulte a seção de status e roteiro , abaixo), mas todos os principais recursos do kernel atualmente planejados agora são implementados para pelo menos um nível aceitável.
Os objetivos de design do projeto são:
MODERNIDADE - Não estou interessado em projetar sistemas herdados ou executar todo o hardware por aí. Meu alvo é apenas arquiteturas de 64 bits e hardware moderno de commodities. Atualmente, isso significa sistemas X64 com o firmware Nehalem ou CPUs mais recentes e UEFI. (Consulte esta lista para os recursos da CPU atualmente necessária.) Eventualmente, eu gostaria de trabalhar em uma porta AARCH64, em parte para me forçar a levar em consideração as peças dependentes da arquitetura da base de código.
Modularidade - Eu gostaria de puxar o máximo possível do sistema para processos separados, da maneira microokernel. Um sub-gol disso é explorar onde estão os gargalos de um microkernel agora e se a evitação de hardware legado me permitirá projetar um sistema que seja menos atolado pelos problemas tradicionais de microkernel.
Exploração - Estou realmente fazendo isso para me divertir aprendendo e explorando o desenvolvimento moderno do sistema operacional. As implementações iniciais de recursos podem jogar temporariamente o design modular para permitir a exploração do hardware relacionado.
Uma nota sobre o nome: este kernel foi originalmente chamado de pipoca, mas desde então descobri que o projeto Linux de pipoca também está desenvolvendo um kernel com esse nome, iniciado na mesma época que este projeto. Então, eu renomeei esse kernel JSIX (sempre denominado JSIX ou j6 , nunca capitalizado) como uma homenagem a L4, XV6 e minha maravilhosa esposa.
As seguintes áreas principais de características são metas para o desenvolvimento do JSIX:
Feito. O carregador de inicialização carrega os programas do kernel e dos usuários iniciais e configura os argumentos necessários do kernel sobre o mapa de memória e o EFI GOP Framebuffer. Possíveis idéias futuras:
Memória virtual: suficiente. O kernel gerencia a memória virtual com vários tipos de objetos vm_area que representam áreas mapeadas, que podem pertencer a um ou mais objetos vm_space que representam todo um espaço de memória virtual. (Cada processo tem um vm_space , e o próprio kernel.)
Permanecendo para fazer:
Alocação de página física: suficiente. A implementação atual do alocador de página física usa um grupo de blocos que representam áreas atualizadas da memória utilizável, conforme definido pelo carregador de inicialização. Cada bloco possui um bitmap de três níveis que denota páginas gratuitas/usadas.
Trabalho futuro:
Suficiente. O objeto Global Scheduler mantém listas prontas/bloqueadas separadas por núcleo. Os núcleos tentam periodicamente equilibrar a carga via roubo de trabalho.
As tarefas do espaço do usuário podem criar threads e outros processos.
Syscalls: suficiente. As tarefas do espaço do usuário podem fazer syscalls no kernel por meio de instruções rápidas do SySCall/Sysret. Os syscalls fabricados via libj6 procuram o Callee e o chamador como chamadas de função SYSV ABI padrão. As implementações são envolvidas em funções de wrapper geradas que validam a solicitação, verifiquem os recursos e encontram os objetos ou lida com o kernel apropriado antes de chamar as funções de implementação.
IPC: funcionando, precisa de otimização. As primitivas atuais do IPC são:
O JSIX usa a ferramenta Ninja Build e gera os arquivos de construção com o script configure . A compilação também se baseia em um sysroot de cadeia de ferramentas personalizado, que pode ser baixado ou construído usando os scripts em JSIX-OS/Toolchain.
Outras dependências de construção:
O script configure possui algumas dependências do Python - elas podem ser instaladas via pip , embora seja recomendado fazê -lo em um ambiente virtual do Python. A instalação do pip também instalará ninja .
Um sistema Debian 11 (Bullseye) pode ser configurado com as dependências de construção necessárias executando os seguintes comandos da raiz do repositório 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 Crie ou faça o download da Sysroot da Chain Tool, conforme mencionado acima com o JSIX-OS/Toolchain e simplifique o diretório de ferramentas construídas como sysroot na raiz deste projeto.
# Example if both the toolchain and this project are cloned under ~/src
ln -s ~ /src/toolchain/toolchains/llvm-13 ~ /src/jsix/sysroot Depois que a cadeia de ferramentas tiver sido configurada, executando o script ./configure (consulte ./configure --help para opções disponíveis) configurará a configuração de compilação e ninja -C build (ou onde quer que você coloque o diretório de compilação) executará a compilação. Se você tiver instalado qemu-system-x86_64 , o script qemu.sh será executado JSIX no modo NEMU -nographic .
Pessoalmente, executei isso a partir de uma verdadeira máquina Bullseye AMD64 Debian ou de uma instalação Windows WSL Debian Bullseye. Sua milhagem pode variar com outras configurações e distritos.
O JSIX agora possui o programa test_runner Userspace que executa vários testes automatizados. Ele não está incluído na compilação padrão, mas se você usar o manifesto test.yml , ele será construído e poderá ser executado com o script test.sh ou o script qemu.sh
./configure --manifest=assets/manifests/test.yml
if ./test.sh ; then echo " All tests passed! " ; else echo " Failed. " ; fi