Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: sp am 17. January 2005, 15:09
-
Hallo
ich taste mich gerade ein bisschen an MT ran und wollte mal wissen wie eigentlich IPC funktioniert.
sp
-
Hiho,
IPC funktioniert am besten mit einem Messaging System, d.h. ein Prozess kann Daten empfangen und senden, genau wie z.B. sockets nur das ein Header mitgesendet wird, der Sender und Empänger angibt, einen MessageCode usw.
Wie du das realisierst, kommt auf deinen Kernel an. Ich mach es folgendermaßen:
1. Prozess ruft Systemcall zum erstellen einer Message mit bestimmter maximaler Datengröße auf
2. Der Kernel mappt physische Pages in den Addressraum des Prozesses, und gleichzeitig mappt er die Pages in seinen privaten Addressraum(bei mir 0-16mb).
3. Will ein Prozess nun eine Message empfangen oder senden, gibt er die Message an, die die Daten empfangen oder senden soll und ruft einen Syscall auf.
4 (Senden). Der Kernel kopiert die Message aus dem Addressraum des Prozesses in den MessageQueue des Empfängers. Klappt weil der Kernel noch im Context des Senders ist, und der Qeueue auch im Kernelspace liegt.
4 (Empfangen). Die erste Nachricht aus dem Queue wird einfach in Message kopiert.
Das System setzt aber voraus, das der Kernel in den Addressraum von jedem Prozess gemappt ist. Außerdem kann nur eine begrenzte Anzahl an Messages im ganzen System erstellt werden (So groß wie der Kernelspace ist...)
Alternativ kannst du auch einen globalen Messaging Addressram einrichten, der z.B. bei 0xF0000000 liegt, und ausgelagert werden kann, das würde alles schon um einiges dynamischer machen, ist aber viel aufwendiger...
Hoffe du verstehst was ich meine, isn bisschen scheiße erklärt :)
MfG GhostCoder
-
mal ne frage nebenbei, was is IPC ?
-
Inter Process Communication
Das heisst das austauschen von Daten unter verschiedenen Prozessen (tasks)
-
Bei mir funktioniert das alles über eine zentrale Stelle, beim Programmstart (oder auch später), muss jedes Programm die ID's von den Programmen anfragen mit denen es reden will. Dazu stellt es eine Anfrage in einem bestimmten Format (4Byte Befehlscode, 4 Byte Pointer auf Programmnamen, der einzigartig sein muss, also mehrere Instanzen müssen etwas komplizierter in einem 2. Layer verwaltet werden) in die ProcessWorkQue(PWQ), die bei jedem Taskwechsel abgearbeitet wird, und die Ergebnisse dann in den speziellen "Antwortbereich" jedes Tasks stellt. So hat es dann, wenn alles gut geht, die ID's der Programme, um dann mit einem Programm zu reden, benutzt es diese ID um über die PWQ wieder eine Nachricht an das Programm zu senden, wieder über den Antwortbereich, diesmal des anderen Programmes.
Auch wenn ein Programm ne Datei haben will: Befehlscode-"Datei lesen"+Dateiname etc in die PWQ, beim abarbeiten dann geht diese Message an das VFS Modul, welches dann weiter zuständig ist, bis die Datei dann letztlich beim Programm landet.
Sämtliche Kommunikation also muss über die PWQ erfolgen.
Vorteil: Zentrale Kontrolle
Nachteil: nicht die schnellste Variante, und muss sehr sicher programmiert sein