Trennung zwischen Kernel und User Space ...



  • Hallo!

    Ich beschäftige mich gerade mit Betriebssystemen. Dabei taucht immer wieder ein Sachverhalt auf, den ich einfach nicht verstehe: Es geht um die Trennung von Kernel und User Space. Nun ist mir schon klar wo da der Unterschied ist (glaube ich zumindest) und was bei einem BS wo implementiert werden kann. Meine Frage ist jetzt:

    WIE sind Kernel und User Space nun eigentlich genau getrennt ?

    In der Literatur findet man immer nur diese tollen Bildchen, wo Kerner und User Space getrennt dargestellt werden, aber keiner sagt wie das eigentlich gemacht wird. Wird das eher softwaretechnisch gemacht oder gibt es irgendeine Kontrolle durch die Hardware, oder habe ich einfach irgendetwas nicht richtig verstanden, dass ich jetzt so ein Brett vorm Kopf habe ?

    Für Hinweise wär' ich sehr dankbar...:(



  • Moin,

    Kernelseitig: http://ezs.kr.hsnr.de/TreiberBuch/html/sec.datentransfer.html
    Von der anderen Seite hilft 'man 2 syscall'.

    Gruss, Beule



  • Danke für die Antwort!

    Eigentlich hatte ich es etwas allgemeiner gemeint, also: Wie werden generell Kernel und User Space getrennt... 🙂

    Habe aber noch ne Frage: Wenn ich in C++ von thread ableite, ist das dann n Kernel oder n User Level thread ?



  • Greenhorn2006 schrieb:

    Eigentlich hatte ich es etwas allgemeiner gemeint, also: Wie werden generell Kernel und User Space getrennt... 🙂

    Grob kann man sagen die Hardware bietet einige Features an um diese Trennung zu vollbringen, die Software (das Betriebssystem) trennt aber letztenendes selbst. Für mehr kannst Du fast schon ne Vorlesung belegen 😉

    [/quote]Habe aber noch ne Frage: Wenn ich in C++ von thread ableite, ist das dann n Kernel oder n User Level thread ?[/quote]

    Wenn ich in C++ von thread ableite bekomme ich den Fehler dass es die Klasse thread nicht gibt.



  • @LordJaxom:

    Ähm...stimmt (das mit dem Ableiten von Thread), wie komm ich nur darauf. Naja, dann formulier ich meine Frage mal um:

    Wenn ich unter Windows (bitte nich hauen!, ich weiss das das die Linux Sparte ist, aber jetzt noch nen Thread eröffnen wäre doch Blödsinn), createThread(...) aufrufe, was erzeuge ich dann für einen Thread ? Kernel oder User Level ?



  • Der wichtige Unterschied ist der Adressraum eines Prozesses. Schreibe Code als Unterfunktion direkt in die Kernelsourcen, oder Funktionen die bei driver_open() einsteigen (und mit modprobe oder insmod initialisiert werden-> Kernelmodul) und du hast Kernelcode. Schreibe Code dessen Startmarke bei main() liegt und vom Elfloader initialisiert wird, und du hast Userspacecode mit autarkem Adressraum und anderen *separaten* Privilegien. Die Trennung ist "nur" ein theoretisches Modell. Die saubere Umsetzung wird das Speichermanagement des Kerns erzwungen.
    Stark vereinfacht, die versuchte Erklärung. 😉 Ein anderer kann sich vielleicht besser ausdrücken.
    Wenn du die Schnittstelle suchst, die der imäginären Linie in den von dir erwähnten Zeichnungen entspricht, das ist zum Beispiel das /dev- oder /proc-Filesystem. Von der einen Seite greifst du aus dem Adressraum des Userspace zu (FILE *fp = fopen ("/proc/uptime", "r")[1]), von der anderen Seite liefert dir der Kern den Wert der uptime, den er in seinem Adressraum errechnet durch die Pseudodatei hindurch.

    Greenhorn2006 schrieb:

    Wenn ich in C++ von thread ableite, ist das dann n Kernel oder n User Level thread ?

    Ein Thread ist während der Initialisierung erstmal nichts weiter als jede andere Funktion: eine Funktion. 😉 Im Speicher werden die Register der CPU gesichert und die Funktion bekommt einen eigenen Stackrahmen. Die präzise Frage würde also lauten: Aus welchem Adressraum heraus wird meine hier und jetzt benutzte Funktion aufgerufen?

    Ich will mich noch mal wiederholen: Ein anderer kann sich vielleicht besser ausdrücken.
    Wie überall in der Softwareentwicklung gilt auch hier: Mit Theorie allein ist kein Blumentopf zu gewinnen. Das Meiste lernt man beim Programmieren selbst.

    Gruss, Beule

    [1] Mach mal "strace cat /proc/uptime", dann siehst du deine imaginäre Linie.



  • Berichtigung:
    Die saubere Umsetzung wird durch das Speichermanagement des Kerns erzwungen.
    ps. Ich weiss, registrieren und so... :-&


Anmelden zum Antworten