| Zeile 6: | Zeile 6: | ||
| Kernel = [[Monolithischer Kernel]] | | Kernel = [[Monolithischer Kernel]] | ||
| API = Int 0x80 | | API = Int 0x80 | ||
| − | | Binaerformat = [[ELF]] | + | | Binaerformat = [[ELF]], [[Shell]]-Scripts |
| IPC = Keine (bis jetzt) | | IPC = Keine (bis jetzt) | ||
| Sprache = [[C]] | | Sprache = [[C]] | ||
| Zeile 23: | Zeile 23: | ||
Herz des Systems sind das Mountsystem und das virtuelle Dateisystem. Dieses VFS läuft in einer zehn Megabyte großen RamDisk und sorgt für jegliche Kommunikation mit Geräten oder dem Kernel, wenn sie nicht über int 0x80 ablaufen muss. In ihm können hierzu virtuelle Dateien erstellt werden, die vom Mountsystem registriert werden. Solche Dateien können Geräte ("/dev/console", "/dev/pci/0-0-0", "/dev/audio"), Kommunikationskanäle zum Kernel ("/sys/mount") oder jegliche Art von Dateisystemen ("/proc", "/mnt/fda", "/mnt/addon", "/mnt/auto/hda1") sein. Ein Gerät wird im Kernel durch eine einfache Funktion repräsentiert, die ein paar Parameter bekommt (ID-Nummer, Position innerhalb der "Datei", Zugriffsart, Länge des Zugriffs, ...) und einen Wert zurückgeben kann. Eine Dateisystemfunktion erhält statt einer ID-Nummer das Handle der Datei, auf der sich das Dateisystem befindet. Daher kann man auch normale Dateien und nicht nur Gerätedateien mounten (z. B. "/dev/hda1" -> "/mnt/auto/hda1", "/mnt/auto/hda1/floppy.img" -> "/home", "/home/test.img" -> "/tmp"; also auch über mehrere Dateisysteme hinweg). | Herz des Systems sind das Mountsystem und das virtuelle Dateisystem. Dieses VFS läuft in einer zehn Megabyte großen RamDisk und sorgt für jegliche Kommunikation mit Geräten oder dem Kernel, wenn sie nicht über int 0x80 ablaufen muss. In ihm können hierzu virtuelle Dateien erstellt werden, die vom Mountsystem registriert werden. Solche Dateien können Geräte ("/dev/console", "/dev/pci/0-0-0", "/dev/audio"), Kommunikationskanäle zum Kernel ("/sys/mount") oder jegliche Art von Dateisystemen ("/proc", "/mnt/fda", "/mnt/addon", "/mnt/auto/hda1") sein. Ein Gerät wird im Kernel durch eine einfache Funktion repräsentiert, die ein paar Parameter bekommt (ID-Nummer, Position innerhalb der "Datei", Zugriffsart, Länge des Zugriffs, ...) und einen Wert zurückgeben kann. Eine Dateisystemfunktion erhält statt einer ID-Nummer das Handle der Datei, auf der sich das Dateisystem befindet. Daher kann man auch normale Dateien und nicht nur Gerätedateien mounten (z. B. "/dev/hda1" -> "/mnt/auto/hda1", "/mnt/auto/hda1/floppy.img" -> "/home", "/home/test.img" -> "/tmp"; also auch über mehrere Dateisysteme hinweg). | ||
Wichtig ist, dass ein Dateisystem natürlich nicht wirklich physisch vorhanden sein muss: Von Relevanz ist lediglich, was die Funktion an das Mountsystem zurückgibt. Daher sind auch virtuelle Dateisysteme wie das procfs ("/proc") oder das pipefs ("/sys/pipe", noch in Arbeit) möglich. Das ProcFS beispielsweise zeigt Informationen zu allen Prozessen im System an, wobei pro Prozess eine Datei existiert. Die Informationen können mit dem Programm "top" ausgelesen werden. | Wichtig ist, dass ein Dateisystem natürlich nicht wirklich physisch vorhanden sein muss: Von Relevanz ist lediglich, was die Funktion an das Mountsystem zurückgibt. Daher sind auch virtuelle Dateisysteme wie das procfs ("/proc") oder das pipefs ("/sys/pipe", noch in Arbeit) möglich. Das ProcFS beispielsweise zeigt Informationen zu allen Prozessen im System an, wobei pro Prozess eine Datei existiert. Die Informationen können mit dem Programm "top" ausgelesen werden. | ||
| + | |||
| + | === Zugriff auf Netzwerkfunktionen === | ||
| + | |||
| + | Noch gibt es kein offizielles Release mit Netzwerkfunktionalität, das soll im nächsten Release anders sein. Zugriff darauf erhält man dann mit den Spezialdateisystemen ipfs und tcpfs. Diese werden unter "/net/ip" bzw. "/net/tcp" eingehängt. | ||
| + | |||
| + | ==== /net/ip ==== | ||
| + | |||
| + | Um eine IP-"Verbindung" aufzubauen, öffnet man eine Datei mit Lese- und Schreibzugriff ("r+") in /net/ip. Der Dateiname lautet "interface:IP". Um eine Verbindung zu www.google.de (74.125.39.106) über das Interface "eth0" aufzubauen, geht man folgendermaßen vor: | ||
| + | |||
| + | <c>FILE *ipcon; | ||
| + | ipcon = fopen("/net/ip/eth0:74.125.39.106", "r+")</c> | ||
| + | |||
| + | Danach kann man einfach Daten empfangen ("fread") und senden ("fwrite") sowie die Verbindung wieder beenden ("fclose"). | ||
| + | |||
| + | ==== /net/tcp ==== | ||
| + | |||
| + | Bei TCP geht man ähnlich vor, nur dass man den Port an den Dateinamen anhängt. Eine Verbindung zum Webserver (Port 80) unter www.google.de (74.125.39.106) über eth0 sieht dann so aus: | ||
| + | |||
| + | <c>FILE *tcpcon; | ||
| + | tcpcon = fopen("/net/tcp/eth0:74.125.39.106:80", "r+")</c> | ||
| + | |||
| + | Hier kann man dann ebenso Daten empfangen ("fread") und senden ("fwrite") und natürlich auch die Verbindung beenden ("fclose"). | ||
== Aktuelle Features == | == Aktuelle Features == | ||
| Zeile 46: | Zeile 68: | ||
== TODO == | == TODO == | ||
| + | * Netzwerkfunktionen | ||
* HD-Audio-Treiber | * HD-Audio-Treiber | ||
* Bei "großen" Festplatten funktionierender Festplattentreiber | * Bei "großen" Festplatten funktionierender Festplattentreiber | ||