Koraos est un système d'exploitation écrit et conçu à partir de zéro. Il est développé comme un passe-temps par un développeur passionné.
Ce référentiel contient du code pour le noyau du système KORA. Si vous souhaitez construire l'intégralité du système, regardez le référentiel Koraos.
J'ai essayé de construire mon propre noyau depuis un certain temps. Après de nombreux retravailleurs, brise et repenser, je redémarre entièrement avec des soins méticuleux pour la conception. Mon objectif a toujours été de créer un programme qui fait exactement ce qu'ils censés faire et rien de plus, léger et rapide avec une architecture fortement découplée.
Ce logiciel est encore un jeune chiot, mais j'espère construire bientôt un système fiable. Il fournira toutes les fonctionnalités de base d'un système moderne et sera portable sur plusieurs architectures (objectif: x86, x86_64, ARM).
Interopérabilité : Alors que j'essaie de comprendre comment les choses sont faites et pourquoi, je sorte parfois des spécifications strictes de Posix ou Unix. J'essaie d'être aussi conforme que possible - avec NT et Unix World - mais je m'autorise à faire des choix différents.
Construire un noyau n'est pas comme construire une application régulière et un travail supplémentaire pourrait être nécessaire.
Le référentiel (comme d'autres de Kora) contient un Makefile proche de standard. Un script configure est disponible mais uniquement pour construire à partir d'un autre répertoire et n'est pas obligatoire. Ce script est uniquement utilisé pour rechercher et persister des options de construction.
Ici, une liste de commandes 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. N'oubliez pas que pour un noyau , c'est presque toujours une compilation croisée . Le piège le plus courant consiste à construire un noyau i386 sur l'hôte x86_64 .
Par défaut, il utilise un environnement indépendant , mais les en-têtes hôtes peuvent causer certains problèmes.
Dans le cas ou les erreurs, il est préféré utiliser un «compilor transversal».
Remarque : Assurez-vous que tout le package soit installé comme des binutilles, GCC, Make et Git, mais aussi l'assembleur pour une architecture (comme NASM pour
i386etamd64. Pour les chèques, ajoutez également Valgrind et LCOV .
Ici également, une variable acceptée par le Makefile pour la configuration de l'extension:
VERBOSE=y : Commandes de compilation d'impressionQUIET=y : n'imprime pas l'étape de compilation verbaleCFLAGS : Ajoutez des drapeaux supplémentaires au compilateur CNODEPS=y : n'incluez pas les fichiers de dépendances *.NOCOV=y : supprimer les options de couverture pour les tests unitaireskname=? : Modifiez le nom du fichier de livraison du noyau Après la construction, si vous êtes ici pour vous salir, pensez à qemu et gdb pour le débogage et l'enquête.
scripts/toolchain.sh (il faut du temps, pas de journaux)koraos/make/build_toolchain.sh (cela prend encore plus de temps). Il n'est pas facile de décrire les caractéristiques du noyau, car la plupart des composants sont nécessaires et tous les noyaux fournissent à peu près les mêmes, mais diffèrent par la qualité et le comportement de toutes ces fonctionnalités.
Koraos'kernel utilise la mémoire virtuelle, avec une allocation de page de base. Il utilise un recyclage approprié des pages, mais aucun échange n'est disponible. Sur l'architecture Intel, l'identification des fonctionnalités CPU appropriées est faite mais mal utilisée. Le noyau est prêt à plusieurs cœurs (filetage) mais nécessite toujours un travail pour être utilisé.
Le noyau est encore multi-processus, multi-thread mais pas multi-utilisateurs. Des tâches peuvent être créées pour être sur le noyau ou dans l'espace utilisateur. La nouvelle tâche peut être créée à partir de l'ardoise propre (Window Way) ou Fork (Unix Way).
Le noyau fournit de nombreux types de fichiers et d'appareils: périphériques de bloc, appareils char, tuyaux, répertoire (ou volume), fichiers réguliers, flux vidéo (surface, appareil photo ou écrans), périphériques réseau et prises. (Notez que les types de fichiers sont différents d'Unix).
Tous ces fichiers et périphériques peuvent être accès via un VFS évolué (système de fichiers virtuel) avec de bonnes installations de mise en cache.
La pile réseau prend en charge les protocoles: Ethernet, ARP, IPv4, ICMP, DHCP, UDP, TCP, DNS et NTP . Le noyau a fourni un client DHCP de base qui permette une configuration IP automatique.
Section incomplète
Comme le système n'est pas entièrement fonctionnel, la plupart de mes tests sont effectués en utilisant du thread de noyau, mais ici quelques appels de système de travail - rien de finalisé: encore:
/* --------
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 cible non les fichiers actuels
kernel/types.h : référence aux types de base et déclarez les structures opaques.kernel/utils.h : Fournissez de l'exécution de base comme l'allocation, la chaîne et le temps.kernel/core.h : Fournir un accès aux structures de base kSYS & kCPU .kernel/syscalls.h : liste des routines syscall comme sys_* .kernel/io.h : Interface pour ioport, mmio et dma.kernel/{...}.h : Fournir une API d'un module de noyau de noyau (tâches, mémoire, VFS ...).kernel/net/{...}.h : API pour le protocole réseau (LO, ETH, IP4).kernel/bus/{...}.h : API pour le fournisseur de bus (PCI ou USB). J'ai prévu de livrer la version 0.1 une fois que je peux exécuter la connexion des programmes de base, le bureau, le krish, le dossier et Lua et j'ai au moins un système de fichiers écrite complet (comme VFAT ou EXT2).