Koraos es un sistema operativo escrito y diseñado desde cero. Es desarrollado como un pasatiempo por un desarrollador de entusiastas.
Este repositorio contiene código para el núcleo del sistema KORA. Si desea construir todo el sistema, mire el repositorio de Koraos.
He estado tratando de construir mi propio núcleo desde algún tiempo. Después de muchos retrabajos, descansos y repensar, reinicio uno completamente con un cuidado meticuloso para el diseño. Mi objetivo siempre ha sido construir un programa que haga justo lo que se supone que deben hacer y nada más, ligero y rápido con una arquitectura fuertemente desacoplada.
Este software sigue siendo un cachorro joven, pero espero construir un sistema confiable pronto. Proporcionará todas las características básicas de un sistema moderno y será portátil en varias arquitecturas (objetivo: x86, x86_64, brazo).
INTEROPERABILIDAD : Mientras trato de entender cómo se hacen las cosas y por qué, a veces salgo de las estrictas especificaciones de Posix o Unix. Trato de ser lo más compatible como sea posible, con NT y Unix World, pero me autorizo a tomar diferentes decisiones.
Construir un núcleo no es como construir una aplicación regular, y podría ser necesario algún trabajo adicional.
El repositorio (como otro de Kora) contiene un Makefile cercano al estándar. Un script configure está disponible, pero solo para construir desde otro directorio y no es obligatorio. Este script solo se usa para buscar y persistir opciones de compilación.
Aquí una lista de comandos principales:
make # Build the kernel for the host architecture
make check # Build and run unit-tests
make coverage # Run tests and coppute coverage
make install # Build and update the kernel (not yet)
make install-headers # Copy and erase kernelheaders to $(prefix)/include
# For cross-compile using 'i386-kora-gcc' compiler
make target=i386-pc-kora CROSS=i386-kora- CC=gcc
# Simpler using configure
/path/to/sources/configure --target=i386
make # No need to set target or cross. Recuerde que para un núcleo casi siempre es una compilación cruzada . La trampa más común es tratar de construir un núcleo i386 en el host x86_64 .
Por defecto, usa un entorno independiente , pero los encabezados del host pueden causar algunos problemas.
En caso o errores, se prefiere usar un 'compilador cruzado'.
Nota : Asegúrese de tener todo el paquete instalado como binutilos, GCC, Make and Git, pero también el ensamblador de algo de arquitectura (como NASM para
i386yamd64. Para controles, agregue también Valgrind y LCov .
Aquí también alguna variable aceptada por Makefile para extender la configuración:
VERBOSE=y : comandos de compilación de impresiónQUIET=y : no imprima el paso de compilación detalladaCFLAGS : Agregue banderas adicionales al compilador CNODEPS=y : no incluya *.d archivos dependientes (predeterminado para limpieza o si el directorio 'obj' aún no existe)NOCOV=y : eliminar las opciones de cobertura para pruebas de unidadkname=? : Cambie el nombre del archivo de entrega del kernel Después de la construcción, si está aquí para ensuciarse, piense en qemu y gdb para la depuración e investigación.
scripts/toolchain.sh (no lleva tiempo, sin registros)koraos/make/build_toolchain.sh (lleva aún más tiempo). No es fácil describir las características del núcleo, ya que la mayoría de los componentes son necesarios y todos los núcleos proporcionan aproximadamente lo mismo, pero difiere en calidad y comportamiento para todas esas características.
Koraos'Kernel está utilizando la memoria virtual, con la asignación básica de la página. Utiliza el reciclaje adecuado de las páginas, pero no hay intercambio disponible. En la arquitectura Intel, se realiza la identificación de características de CPU adecuadas pero, sin embargo, está mal utilizada. El núcleo está listo para múltiples núcleos (a prueba de hilos), pero aún requiere que se utilice algún trabajo.
El núcleo es multiproceso, múltiples subprocesos pero no múltiples usuarios todavía. Las tareas se pueden crear para estar en el núcleo o en el espacio de usuarios. Se puede crear una nueva tarea desde la pizarra limpia (Window Way) o Bifured (Way Unix).
El núcleo proporciona numerosos tipos de archivos y dispositivos: dispositivos de bloque, dispositivos de char, tuberías, directorio (o volumen), archivos regulares, transmisiones de video (superficie, cámara o pantallas), dispositivos de red y enchufes. (Tenga en cuenta que los tipos de archivos son diferentes de UNIX).
Todos esos archivos y dispositivos pueden acceder a través de un VFS evolucionado (sistema de archivos virtuales) con buenas instalaciones de almacenamiento en caché.
La pila de red admite los protocolos: Ethernet, ARP, IPv4, ICMP, DHCP, UDP, TCP, DNS y NTP . El kernel proporcionó un cliente DHCP básico que permite la configuración de IP automática.
Sección incompleta
Como el sistema no es completamente funcional, la mayoría de mis pruebas se realizan utilizando el hilo del núcleo, pero aquí algunas llaman al sistema de trabajo, nada finalizado todavía:
/* --------
Tasks, Process & Sessions
--------- */
long sys_stop ( unsigned tid , int status );
long sys_sleep ( long timeout );
/* --------
Input & Output
--------- */
long sys_read ( int fd , char * buf , int len );
long sys_write ( int fd , const char * buf , int len );
long sys_open ( int fd , const char * path , int flags );
long sys_close ( int fd );
/* --------
File system
--------- */
int sys_pipe ( int * fds );
int sys_window ( int width , int height , unsigned features , unsigned evmask );
/* --------
Network
--------- */
int sys_socket ( int protocol , const char * address , int port );
/* --------
Memory
--------- */
void * sys_mmap ( void * address , size_t length , int fd , off_t off , unsigned flags );
long sys_munmap ( void * address , size_t length );
long sys_mprotect ( void * address , size_t length , unsigned flags );
/* --------
Signals
--------- */
/* --------
System
--------- */
long sys_ginfo ( unsigned info , void * buf , int len );
long sys_sinfo ( unsigned info , const void * buf , int len );
long sys_log ( const char * msg );Bit de destino no archivos actuales
kernel/types.h : referencia tipos básicos y declarar estructuras opacas.kernel/utils.h : Proporcione tiempo de ejecución básico como asignación, cadena y tiempo.kernel/core.h : Proporcione un acceso a las estructuras centrales kSYS y kCPU .kernel/syscalls.h : Lista de rutinas SYSCall como sys_* .kernel/io.h : interfaz para Ioport, MMIO y DMA.kernel/{...}.h : Proporcionar API de un módulo de núcleo de kernel (tareas, memoria, vfs ...).kernel/net/{...}.h : API para el protocolo de red (LO, ETH, IP4).kernel/bus/{...}.h : API para el proveedor de bus (PCI o USB). Planeé entregar la versión 0.1 Una vez que pueda ejecutar los programas básicos de inicio de sesión, escritorio, krish, carpeta y lua y tengo al menos un sistema de archivos de escritura con todas las funciones (como VFAT o Ext2).