Dennis_B: Userspace->Kernelspace/kernel->Hardware ..

Hallo liebe Community :)

seit ich mich Linux befasse komme ich in Bereiche von denen ich "vorher" nicht einmal den Namen kannte.
Ich möchte den Kernel eines System (hier jetzt Linux aber ich denke die Aufgabe eines OS ist überall gleich) besser verstehen und komme wohl auch auf oberster Ebene nicht um den Userspace und Kernelspace und deren Kommunikation herum.

Für mich ergibt sich aus dem gelesenen eine folgende Übersicht:

Userspace (Anwendungsprogramme) -> API (Syscalls) -> Kern/Kernelspace -> Hardware

Die Anwendungsprogramme stellen anfragen -über Syscalls- an den Kern, der Kern wiederum organisiert die Anfragen, vergibt Prozessorzeit usw. und kann das direkt an die CPU usw. angeben/abfragen oder wie man das auch immer nennen mag.

Ich hoffe im großen und ganzen stimmt die Aussage :)

Doch eine frage ich mich doch schon, in Linux gibt es ca. 300 Syscalls, wie können die denn für die ganzen Aufgaben reichen?
Was anderes was mir nicht in den Kopf gehen will, man sagt ja Linux sei Multitaksing fähig (es können mehrere Programme gleichzeitig laufen und organisiert werden) aber mal ernsthaft, das kann Windows 3.1 doch auch, es läuft das OS selbst und z.B. paintbrush, oder wie kann man sich das vorstellen?

Würde mich sehr über antworten freuen, danke :)

  1. Hallo,

    Doch eine frage ich mich doch schon, in Linux gibt es ca. 300 Syscalls, wie können die denn für die ganzen Aufgaben reichen?

    Tatsächlich beschränkt sich das, was ein Computer tut im wesentlichen auf

    • Einlesen
    • Rechnen
    • Ausgeben
    • Warten :)

    Du kannst Daten für ein Gerät "bereit legen"...und dem Gerät dann signalisieren, dass es damit nun etwas tun soll (Beispiel: Grafik, Druck, Netzwerk,...)

    Umgekehrt kann das Gerät dem OS mitteilen, dass es Daten vorliegen hat, die das Betriebssystem entgegen nehmen und an Prozesse verteilen muss, die damit weiter arbeiten sollen (z.b. Maus).

    Was das aber für ein Gerät ist, ist eigentlich egal.

    Dann braucht man noch ein paar Instruktionen für Speicherverwaltung, Prozess-Wechsel und ähnlichen Schnick-Schnack...und das wars.
    Deswegen kommt man mit sehr wenigen System Calls aus. Klar, für komplexere Funktionen gibt es dann Bibliotheken, die das ganze komfortabel machen, (du willst Dir nicht jedesmal, wenn Du ein Fenster öffnest, überlegen müssen, wie Du jetzt mit der Grafikkarte reden musst) aber das Betriebssystem selbst muss gar nicht sooo viel können.

    Was anderes was mir nicht in den Kopf gehen will, man sagt ja Linux sei Multitaksing fähig (es können mehrere Programme gleichzeitig laufen und organisiert werden) aber mal ernsthaft, das kann Windows 3.1 doch auch, es läuft das OS selbst und z.B. paintbrush, oder wie kann man sich das vorstellen?

    Richtig. Multitasking ist ja auch kein Alleinstellungsmerkmal von Linux, es ist dort nur sehr konsequent umgesetzt.

    Viele Grüße,
    Jörg

    1. Hallo Jörg,

      okay, so wie du es beschrieben hast macht es die Sache für mich schon einfacher :) Danke!

  2. Tach,

    Ich möchte den Kernel eines System (hier jetzt Linux aber ich denke die Aufgabe eines OS ist überall gleich)

    die folgende Definition ist nicht unumstritten, ich halte sie aber für sinnvoll: Linux ist ein Kernel und (zentraler) Teil eines Betriebssystems, der Rest des Betriebssystems dass häufig Linux genannt wird stammt wohl zum größten Teil aus dem GNU-Projekt, deshalb spricht man, wenn man das Betriebssystem meint auch von GNU/Linux.

    Userspace (Anwendungsprogramme) -> API (Syscalls) -> Kern/Kernelspace -> Hardware

    Das paßt so erstmal: als Bild

    Doch eine frage ich mich doch schon, in Linux gibt es ca. 300 Syscalls, wie können die denn für die ganzen Aufgaben reichen?

    Naja, so viele Aufgaben sind es ja gar nicht, schauen wir mal was so üblicherweise gemacht wird: http://en.wikipedia.org/wiki/System_call#Typical_implementations. Das sind 5 Gruppen von Dingen (etwas mit Prozessen anstellen, etwas mit Dateien anstellen, ein Gerät nutzen, Informationen nutzen/setzen und Kommunikation), mit jeweils etwa 5 expliziten Befehlen. Man muß hierbei bedenken, dass ein Prozeß nur dann Syscalls braucht, wenn er etwas tun will, dass er selber nicht darf, möchte er z.B. nur etwas berechnen, braucht er dafür keinen Call.

    Schaut man in die etwa 500 Systemcalls von FreeBSD, dann sieht man auch, dass die meisten davon gut in die obigen fünf Kategorien passen und viele im wesentlichen Komfortfunktionen bereitstellen.

    Was anderes was mir nicht in den Kopf gehen will, man sagt ja Linux sei Multitaksing fähig (es können mehrere Programme gleichzeitig laufen und organisiert werden) aber mal ernsthaft, das kann Windows 3.1 doch auch, es läuft das OS selbst und z.B. paintbrush, oder wie kann man sich das vorstellen?

    Richtig, das konnte auch schon DOS (s.u.), das war allerdings kooperatives Multitasking, d.h. ein Prozess konnte, wenn er denn wollte, Zeit freigeben für andere Prozesse, mußte aber nicht. Der Prozeß war in voller Kontrolle. Heutzutage ist eher präemptives Multitasking verbreitet, d.h. der Kernel verteilt die Timeslots und ist in Kontrolle.

    Windows 3.x war übrigens kein Betriebssystem sondern eher ein Windowmanager für DOS (und das mußte nicht zwangsweise MS DOS sein), erst Windows 95 war eigenständig lauffähig.

    mfg
    Woodfighter

    1. Hallo!,

      Man muß hierbei bedenken, dass ein Prozeß nur dann Syscalls braucht, wenn er etwas tun will, dass er selber nicht darf, möchte er z.B. nur etwas berechnen, braucht er dafür keinen Call.

      aber wie wird dann Prozessorzeit angefordert?
      Also zum berechnen wird CPU-Leistung gebraucht, ich dachte das wird auch über einen Syscall eingerichtet?

      Habe auch ein wenig über die allgemeine Arbeitsweise einer CPU gelesen und mir ist der begriff "Befehlsregister" aufgefallen. Habe mehrere Quellen über dieses Thema gelesen doch komme nicht auf den grünen Zweig:

      Was steht in diesen Registern, befehle -also etwas was ein Programm anfordert wie z.B. write("irgendwas")- die im Arbeitsspeicher liegen und über die Adresse im Speicherbereich aufgerufen werden oder befehle die nur der CPU etwas angehen?

      Hmmm komischer Satz... also liegt dort eine Adresse zum "befehl" oder ein direkter Befehl für die CPU? Und wenn für die CPU, welche ?

      Danke dir :=)

      1. Hi,

        Man muß hierbei bedenken, dass ein Prozeß nur dann Syscalls braucht, wenn er etwas tun will, dass er selber nicht darf, möchte er z.B. nur etwas berechnen, braucht er dafür keinen Call.
        aber wie wird dann Prozessorzeit angefordert?

        gar nicht - das Programm nimmt sie sich einfach.

        Also zum berechnen wird CPU-Leistung gebraucht, ich dachte das wird auch über einen Syscall eingerichtet?

        Nein. Die Anwendung rennt einfach los und macht ihr Ding. Irgendwann meint das Betriebssystem (hier: der Scheduler), dass es jetzt genug sei und nun ein anderer Prozess dran ist. Dann wird das laufende Programm quasi zwangsweise unterbrochen, für einige Millisekunden auf Eis gelegt und später an der Stelle fortgesetzt. Bei echtem (präemptivem) Multitasking kann sich die Anwendung dagegen nicht wehren, kann diese Unterbrechung nicht einmal zuverlässig feststellen.

        "Befehlsregister"
        Was steht in diesen Registern, befehle -also etwas was ein Programm anfordert wie z.B. write("irgendwas")- die im Arbeitsspeicher liegen und über die Adresse im Speicherbereich aufgerufen werden oder befehle die nur der CPU etwas angehen?

        Im Befehlsregister, das für das Anwendungsprogramm nicht direkt zugänglich ist, steht der Opcode für die Instruktion, die in der CPU im Augenblick gerade ausgeführt wird. Bearbeitet die CPU also gerade den Befehl
          ADD  EAX,[ESI+0430h]
        dann steht im Befehlsregister der Code für "Addiere durch ESI plus Offset indizierten Speicherinhalt zu EAX". Das sind bei einer x86-CPU AFAIK zwei Bytes, denn der Offset ist zwar Teil des Befehls, kommt aber nicht ins Befehlsregister; er hat eher die Rolle eines Operanden.

        So long,
         Martin

        --
        Man ist so alt, wie man sich fühlt.
        Aber niemals so wichtig.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      2. Tach,

        Man muß hierbei bedenken, dass ein Prozeß nur dann Syscalls braucht, wenn er etwas tun will, dass er selber nicht darf, möchte er z.B. nur etwas berechnen, braucht er dafür keinen Call.

        aber wie wird dann Prozessorzeit angefordert?
        Also zum berechnen wird CPU-Leistung gebraucht, ich dachte das wird auch über einen Syscall eingerichtet?

        du hast recht, der Prozeß meldet sich bei der Queue an und der Scheduler entscheidet dann, welcher Prozeß, wann, wie lange Zeit bekommt.

        Was steht in diesen Registern, befehle -also etwas was ein Programm anfordert wie z.B. write("irgendwas")- die im Arbeitsspeicher liegen und über die Adresse im Speicherbereich aufgerufen werden oder befehle die nur der CPU etwas angehen?

        Register sind die Datenspeicher der CPU, ich gehe jetzt mal von einem einfachen Prozessordesign aus, dann steht im Befehlregister der Befehl, den die CPU gerade ausführt (z.B. addiere Register A und B oder lies die Daten, die an der im Adressregister hinterlegten Adresse im RAM stehen ...). Moderne CPUs haben kompliziertere Befehle, die wieder in Teilschritte zerlegt werden können, so dass mehrere Teilschritte gleichzeitig abgearbeitet werden können.

        Und wenn für die CPU, welche ?

        Das hängt von der CPU ab, erwarten würde ich im allgemeinen einfache Arithmetik (z.B. addieren, multiplizieren, OR, XOR), Entscheidungen (if), Datenoperationen (z.B. Speicher lesen/schreiben); komplexe CPUs machen auch mal Dinge wie wurzelziehen, ganze Blöcke von Daten lesen/schreiben etc.

        mfg
        Woodfighter