diff options
author | zeldakatze <coffee@zeldakatze.de> | 2025-08-20 19:30:33 +0200 |
---|---|---|
committer | zeldakatze <coffee@zeldakatze.de> | 2025-08-20 19:30:33 +0200 |
commit | b48b5b9bbc8dbae6d5362e5bbf68985412cab5fc (patch) | |
tree | 9131e073bde0c4f212d9dbbc16b9e80e0e62f663 /in/smallunix.html | |
download | website-b48b5b9bbc8dbae6d5362e5bbf68985412cab5fc.tar.gz website-b48b5b9bbc8dbae6d5362e5bbf68985412cab5fc.zip |
Diffstat (limited to 'in/smallunix.html')
-rw-r--r-- | in/smallunix.html | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/in/smallunix.html b/in/smallunix.html new file mode 100644 index 0000000..5f9167a --- /dev/null +++ b/in/smallunix.html @@ -0,0 +1,49 @@ +<h2>Ein kleines Unix-artiges Betriebssystem</h2> +smallUnix ist ein kleines Betriebssystem, das komplett ohne Adressraumwechsel +auskommt und zum Ziel hat, Unix-ähnlich zu sein. Es ist eher als übungsprojekt +gedacht und nichts, was wirklich produktiv am ende eingesetzt werden sollte. + +<h3>Features:</h3> +<ul> + <li>Präemtives Multitasking</li> + <li>fork() / exec()</li> + <li>ELF-Binaries</li> + <li>Page-Basiertes Memory management ohne MMU</li> +</ul> + +<p>Das Software-Basierte Paging wird durch mehrere Systeme ermöglicht: +Alle Programme sind als Position-Independant-Executables kompiliert. +Daher können neue Programme an jeder beliebigen Stelle im Arbeitsspeicher +gestartet werden. </p> +<p>Schwieriger sind geforkte Programme. Ein Programm kann zur +laufzeit nicht einfach so im Arbeitsspeicher herumgeschoben werden. (Das könnte +mit einer Virtualisierung und JIT-Kompilern vielleicht realisiert werden, +jedoch nutzt smallUnix recht normale x86-Programme. Zudem können Pages nicht +geschützt werden, sodass Fehlerfälle abgefangen werden.</p> +<p>Mein Lösungsansatz kann als recht simpel, sowie als recht bescheuert +beschrieben werden: Wenn ein Programm geforkt wird, werden von diesem genutze +Pages und der Stack an freie Stellen kopiert. Diese werden in einer zusätzlichen +Tabelle Notiert. Wird das geforkte Programm jetzt ausgeführt, kopiert und +tauscht der Kernel die kopierten Seiten mit den Seiten auf der Ursprünglichen +Adresse. Vom Programm neu angeforderte Seiten werden davon nicht betroffen. +Natürlich ist dieser Ansatz ineffizient, jedoch leben die geforkten Programme +eh nicht besonders lang, sondern meistens bis zum nächsten exec().</p> +<p>Eine Nebenwirkung von diesen Ansatz ist, dass Kindprogramme nur so lange wie +ihr Elternprogramm leben. Das verletzt zwar Grundsätze von POSIX, jedoch macht +das Adresshandling einfacher. So kann der Kernel nicht Adressen nutzen,die nur +noch von einen Kindprogramm genutzt werden. Es erspart viel Tracking.</p> +<p>Sobald exec() aufgerufen wird, können alle durch fork() kopierten +Seiten gelöscht werden. Das Programm kann wie ein neues behandelt werden.</p> + +<p>Ironischer weise muss der 32-Bit Protected Mode eingeschaltet werden, um +den 32-Bit-Adressraum zu nutzen. Das macht das Memory-Management noch sinnloser +als es eigentlich ist. Jedoch könnte wer probieren, das System auf m68k-Systeme +ohne MMU zu portieren, die einen vollen 32-Bit Adressraum, jedoch kein Paging +haben.</p> + +<h2>Quellcode</h2> +<p>Der Quellcode kann auf meiner cgit-Instanz +(<a href='https://cgit.zeldakatze.de/smallUnix/'>Hier</a>) gefunden werden. +Zum Kompilieren gibt es ein eigenes Toolchain, das zunächst kompiliert werden +muss. Anschließend kann das System recht leicht mit ./build.sh kompiliert werden +</p> |