2010-07-15 6 views
6

Ich wollte schon länger einen Kernel schreiben. Ich habe bereits ausreichende Kenntnisse über C und habe mich in x86 Assembler eingemischt. Sie sehen, ich wollte einen Kernel schreiben, der in C POSIX-konform ist, so dass * NIX-Anwendungen potentiell auf mein Betriebssystem portiert werden können, aber ich habe nicht viele Ressourcen für Standard-POSIX-Kernelfunktionen gefunden. Ich habe Ressourcen auf der Dateisystemstruktur, Umgebungsvariablen und mehr auf the Open Group's POSIX page gefunden.Einen POSIX-konformen Kernel schreiben

Leider habe ich nichts gefunden, das erklärt, welche Aufrufe und Kernel-Funktionen ein POSIX-konformer Kernel haben muss (mit anderen Worten, welche Art von interner Struktur muss ein Kernel mit POSIX erfüllen). Wenn jemand diese Informationen finden könnte, bitte sag es mir.

Antwort

11

POSIX definiert nicht die interne Struktur des Kernels, die Kernel-to-Userspace-Schnittstelle oder gar libc. In der Tat hat sogar Windows ein POSIX-kompatibles Subsystem. Stellen Sie nur sicher, dass die POSIX-Schnittstellen, die unter Ihrem Link dort definiert sind, irgendwie funktionieren. Beachten Sie jedoch, dass POSIX keine spezielle Implementierung im Kernel erfordert. Sie können Dinge in der C-Bibliothek implementieren, indem Sie nach Möglichkeit einfachere Kernel-Interfaces mit eigenem Design verwenden.

Es kommt einfach vor, dass viele der POSIX-kompatiblen Betriebssysteme (BSD, Linux usw.) eine ziemlich enge Beziehung zwischen vielen dieser Aufrufe und der Kernel-Schicht haben, aber es gibt Ausnahmen. Unter Linux beispielsweise ist ein Aufruf write() ein direkter Syscall, der eine sys_write()-Funktion im Kernel aufruft. Unter Windows ist write() jedoch in einer POSIX-Unterstützungs-DLL implementiert, die den Dateideskriptor in ein NT-Handle übersetzt und NtWriteFile() aufruft, um sie zu bedienen, was wiederum einen entsprechenden Systemaufruf in ntoskrnl.exe aufruft. So haben Sie eine Menge Freiheit in Sachen - was die Dinge schwieriger macht, wenn überhaupt :)

4

Die opengroup.org lässt die Entscheidungen über Kernel-SYSCALL für jede Implementierung.
write() muss zum Beispiel aussehen und sich wie angegeben verhalten, aber was darunter aufgerufen wird, ist nicht definiert. Viele Aufrufe wie schreiben, lesen, lseek sind frei, um den gewünschten Eingangspunkt im Kernel aufzurufen.

Also, es gibt wirklich nichts, das sagt, dass Sie einen bestimmten Funktionsnamen mit einem definierten Satz von Semantik im Kernel haben müssen. Es muss nur in der C-Laufzeitbibliothek verfügbar sein.

+0

OK, ich verstehe jetzt. Ich hoffe, ich kann den POSIX-Kernel korrekt schreiben. Danke, dass du das geklärt hast! –