JSIX es un sistema operativo X64 de múltiples núcleos personalizado que estoy construyendo desde cero. Está lejos de terminar, o incluso ser utilizable (ver la sección de estado y hoja de ruta , a continuación), pero todas las características principales del núcleo actualmente planificadas ahora se implementan al menos a un nivel pasable.
Los objetivos de diseño del proyecto son:
Modernidad: no estoy interesado en diseñar sistemas heredados, o ejecutar todo el hardware. Mi objetivo son solo arquitecturas de 64 bits y hardware moderno de productos básicos. Actualmente eso significa sistemas X64 con Nehalem o CPU más nuevas y firmware UEFI. (Vea esta lista para las funciones de CPU requeridas actualmente). Eventualmente me gustaría trabajar en un puerto AARCH64, en parte para obligarme a factorizar las piezas dependientes de la arquitectura de la base de código.
Modularidad: me gustaría sacar la mayor parte del sistema en procesos separados como sea posible, en la manera de Microkernel. Un sub-gol de esto es explorar dónde están ahora los cuellos de botella de tal microkernel, y si evitar el hardware heredado me permitirá diseñar un sistema menos empantanado por los problemas tradicionales de microkernel.
Exploración: realmente estoy haciendo esto para divertirme aprendiendo y explorando el desarrollo moderno del sistema operativo. Las implementaciones de características iniciales pueden eliminar temporalmente el diseño modular para permitir la exploración del hardware relacionado.
Una nota sobre el nombre: este núcleo se llamaba originalmente palomitas de maíz, pero desde entonces descubrí que el proyecto de palomitas de maíz Linux también está desarrollando un núcleo con ese nombre, que se inició al mismo tiempo que este proyecto. Así que he cambiado el nombre de este kernel JSIX (siempre con estilo JSIX o j6 , nunca capitalizado) como un homenaje a L4, XV6 y mi maravillosa esposa.
Las siguientes áreas principales de características son los objetivos para el desarrollo JSIX:
Hecho. El gestor de arranque carga el kernel y los programas iniciales del espacio de usuario, y establece los argumentos necesarios del núcleo sobre el mapa de memoria y el GOP FrameBuffer de EFI. Posibles ideas futuras:
Memoria virtual: suficiente. El kernel administra la memoria virtual con una serie de tipos de objetos vm_area que representan áreas mapeadas, que pueden pertenecer a uno o más objetos vm_space que representan todo un espacio de memoria virtual. (Cada proceso tiene un vm_space , y también lo hace el kernel en sí).
Restante para hacer:
Asignación de página física: suficiente. La implementación del asignador de página física actual utiliza un grupo de bloques que representan áreas de memoria utilizable Up-to-1GIB según lo definido por el cargador de arranque. Cada bloque tiene una mapa de bits de tres niveles que denota páginas gratuitas/usadas.
Trabajo futuro:
Suficiente. El objeto Global Scheduler mantiene las listas separadas listas/bloqueadas por núcleo. Los núcleos intentan equilibrar la carga a través del robo del trabajo.
Las tareas del espacio de usuario pueden crear subprocesos y otros procesos.
Syscalls: suficiente. Las tareas del espacio de usuario pueden hacer syscalls al núcleo a través de instrucciones rápidas de Syscall/Sysret. Syscalls realizados a través de libj6 mira tanto a la calentera como a la persona que llama como las llamadas de la función SYSV ABI estándar. Las implementaciones están envueltas en funciones de contenedor generadas que validan la solicitud, verifican las capacidades y encuentran los objetos o manijas del núcleo apropiados antes de llamar a las funciones de implementación.
IPC: Trabajar, necesita optimización. Las primitivas IPC actuales son:
JSIX usa la herramienta Ninja Build y genera los archivos de compilación con el script configure . La compilación también se basa en un sysroot de cadena de herramientas personalizado, que se puede descargar o construir utilizando los scripts en JSIX-OS/Toolchain.
Otras dependencias de compilación:
El script configure tiene algunas dependencias de Python: se pueden instalar a través de pip , aunque se recomienda hacerlo en un entorno virtual de Python. La instalación a través de pip también instalará ninja .
Se puede configurar un sistema Debian 11 (Bullseye) con las dependencias de compilación necesarias ejecutando los siguientes comandos desde la raíz del repositorio de 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 Construya o descargue el sysroot de la cadena de herramientas como se mencionó anteriormente con JSIX-OS/Toolchain, y simule el directorio de cadena de herramientas construida como sysroot en la raíz de este proyecto.
# Example if both the toolchain and this project are cloned under ~/src
ln -s ~ /src/toolchain/toolchains/llvm-13 ~ /src/jsix/sysroot Una vez que se haya configurado la cadena de herramientas, ejecutar el script ./configure (ver ./configure --help para opciones disponibles) configurará la configuración de compilación, y ninja -C build (o donde sea que coloque el directorio de compilación) realmente ejecutará la compilación. Si tiene instalado qemu-system-x86_64 , el script qemu.sh ejecutará JSIX en modo QEMU -nographic .
Personalmente, ejecuto esto desde una verdadera máquina de Bullseye de Debian AMD64 o una instalación de Bullseye de Bullse de Wins WSL WSL. Su kilometraje puede variar con otras configuraciones y distribuciones.
JSIX ahora tiene el programa test_runner UserSpace que ejecuta varias pruebas automatizadas. No está incluido en la compilación predeterminada, pero si usa el manifiesto test.yml , se construirá y se puede ejecutar con el script test.sh o el script qemu.sh
./configure --manifest=assets/manifests/test.yml
if ./test.sh ; then echo " All tests passed! " ; else echo " Failed. " ; fi