Koraos ist ein Betriebssystem, das von Grund auf neu geschrieben und entworfen wurde. Es wurde von einem Enthusiasten -Entwickler als Hobby entwickelt.
Dieses Repository enthält Code für den Kernel des Kora -Systems. Wenn Sie das gesamte System erstellen möchten, sehen Sie sich das Koraos -Repository an.
Ich habe von einiger Zeit versucht, meinen eigenen Kernel zu bauen. Nach vielen Nacharbeiten, Pausen und überdenken, starte ich einen komplett mit sorgfältiger Sorgfalt für das Design. Mein Ziel war es immer, ein Programm zu erstellen, das genau das tut, was sie tun sollen, und nichts mehr, leicht und schnell mit einer stark entkoppelten Architektur.
Diese Software ist immer noch ein junger Welpe, aber ich hoffe, bald ein zuverlässiges System aufzubauen. Es bietet alle Grundlagenfunktionen eines modernen Systems und ist auf mehreren Architekturen tragbar (Ziel: x86, x86_64, Arm).
Interoperabilität : Wenn ich versuche zu verstehen, wie Dinge gemacht werden und warum ich manchmal aus strengen POSIX- oder UNIX -Spezifikationen bin. Ich versuche, so konform wie möglich zu sein - sowohl mit NT als auch mit Unix World -, aber ich autorisiere mich, unterschiedliche Entscheidungen zu treffen.
Build a Kernel ist nicht so, als würde man eine regelmäßige Bewerbung bauen und zusätzliche Arbeiten erforderlich sein.
Das Repository (wie andere von Kora) enthält ein nahezu Standard Makefile . Ein configure ist verfügbar, aber nur um aus einem anderen Verzeichnis zu erstellen und nicht obligatorisch. Dieses Skript wird nur verwendet, um Build -Optionen zu durchsuchen und zu bestehen.
Hier eine Liste der Hauptbefehle:
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. Denken Sie daran, dass es für einen Kernel fast immer eine Kreuzverbesserung ist . Die häufigste Gefahr besteht darin, einen i386 -Kernel auf x86_64 -Host zu bauen.
Standardmäßig nutzt es eine freistehende Umgebung, aber die Host -Header könnten einige Probleme verursachen.
Bei Fall oder Fehlern wird es vorgezogen, einen „Cross-Compilor“ zu verwenden.
Hinweis : Achten Sie darauf, dass alle Pakete wie Binutils, GCC, Made und Git installiert sind, aber auch den Assembler für eine Architektur (wie NASM für
i386undamd64. Für Schecks auch Valgrind und LCOV hinzufügen.
Hier auch einige Variable, die von der Makefile für die Erweiterung der Konfiguration akzeptiert werden:
VERBOSE=y : Kompilierungsbefehle druckenQUIET=y : Drucken Sie den ausführlichen Kompilierungsschritt nichtCFLAGS : Fügen Sie dem C -Compiler zusätzliche Flags hinzuNODEPS=y : Nicht *.d Abhängigkeiten Dateien (Standard für sauberes oder wenn 'obj' Verzeichnis noch nicht vorhanden ist)NOCOV=y : Deckungsoptionen für Einheitstests entfernenkname=? : Ändern Sie den Namen der Kernel -Lieferdatei Wenn Sie hier nach dem Build sind, um schmutzig zu werden, denken Sie an qemu und gdb zum Debuggen und Untersuchungen.
scripts/toolchain.sh an (es dauert Zeit, keine Protokolle)koraos/make/build_toolchain.sh (es dauert noch mehr Zeit). Es ist nicht einfach, Kernelfunktionen zu beschreiben, da die meisten Komponenten erforderlich sind und alle Kerne ungefähr gleich sind, sich jedoch in Bezug auf Qualität und Verhalten für all diese Funktionen unterscheiden.
Koraos'kernel verwendet virtuelles Speicher mit grundlegender Seitenzuweisung. Es verwendet das richtige Recycling von Seiten, es ist jedoch kein Swap verfügbar. Bei Intel Architecture wird die Identifizierung von ordnungsgemäßen CPUs -Merkmalen erstellt, aber dennoch schlecht verwendet. Der Kernel ist Multi-Core-Bereit (Thread-Safe), erfordert jedoch noch einige Arbeiten, um sie zu verwenden.
Der Kernel ist Multi-Process, Multi-Thread, aber noch kein Multi-Benutzer. Aufgaben können so erstellt werden, dass sie entweder auf Kernel oder im UserSpace sind. Neue Aufgabe kann entweder aus sauberer Schiefer (Fensterway) oder Forked (Unix Way) erstellt werden.
Der Kernel stellt zahlreiche Arten von Dateien und Geräten bereit: Blockergeräte, Zeichenvorrichtungen, Rohre, Verzeichnisse (oder Volumen), reguläre Dateien, Videoströme (Oberfläche, Kamera oder Bildschirme), Netzwerkgeräte und Sockel. (Beachten Sie, dass die Dateitypen sich von UNIX unterscheiden).
Alle diese Dateien und Geräte können über ein entwickeltes VFS (virtuelles Dateisystem) mit guten Caching -Einrichtungen zugreifen.
Der Netzwerkstapel unterstützt die Protokolle: Ethernet, ARP, IPv4, ICMP, DHCP, UDP, TCP, DNS und NTP . Der Kernel stellte einen grundlegenden DHCP -Client zur Verfügung, der eine automatische IP -Konfiguration ermöglicht.
Unvollständiger Abschnitt
Da das System nicht voll funktionsfähig ist, werden die meisten meiner Tests mit einem Kernel -Thread durchgeführt, aber hier einige Arbeitssystemaufrufe - noch nichts endgültig:
/* --------
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 );Zielbit keine aktuellen Dateien
kernel/types.h : Referenz grundlegende Typen und deklarieren und undurchsichtige Strukturen.kernel/utils.h : Geben Sie grundlegende Laufzeit wie Zuweisung, String und Zeit an.kernel/core.h : Bieten Sie einen Zugriff auf Kernstrukturen kSYS & kCPU .kernel/syscalls.h : Liste der Syskallroutinen als sys_* .kernel/io.h : Schnittstelle für IOPORT, MMIO und DMA.kernel/{...}.h : Geben Sie eine API eines Kernel -Kernmoduls an (Aufgaben, Speicher, VFS ...).kernel/net/{...}.h : API für Netzwerkprotokoll (lo, eth, ip4).kernel/bus/{...}.h : API für Busanbieter (PCI oder USB). Ich hatte vor, Version 0.1 zu liefern, sobald ich Basics-Programme anmeldung, Desktop, Krish, Ordner und Lua ausführen kann und mindestens ein beschreibbares Dateisystem mit vollem Einfachen (wie VFAT oder Ext2) habe.