Du befindest dich hier: FSI Informatik » Prüfungsfragen und Altklausuren » Hauptstudiumsprüfungen » Lehrstuhl 4 » Verlauf

Prüfer: Wosch
Beisitzer: Andreas
ECTS: 7,5

Die Atmosphäre war entspannt und Wosch hat selbst viel erklärt. Skizzieren musste ich nichts.

Verlauf

P: In Stubsmi wurden (im Hinblick auf Adressraumtrennung) als allererstes Systemcalls eingebaut, warum?
S: Privilegientrennung → privilegierte Befehle nur von Kernel ausführbar machen. Z.B. Adressraumwechsel.

P: Ihr habt Syscalls auf zwei Arten implementiert, eine langsame und eine schnelle. Welche waren das?
S: Langsam: Interrupts/Traps. Schnell: Spezialbefehle sysenter/sysexit

P: Was war da der Unterschied?
S: Spezialbefehle sichern keinen Kontext.

P: Wie können bei Syscalls die Parameter übergeben werdem?
S: Über Register, über Stack (Primitivbefehle) und im Befehlstrom kodiert (Komplexbefehl). Betriebsystem entscheidet über Registerreihenfolge

P: Warum werden im Dispatcher (bei Parametern in Registern) alle Register gespeichert, auch wenn sie keine Parameter enthalten?
S: Um Kerneldaten nicht in den Userspace zu leaken.

P: Braucht man das auch bei Parameterübergabe aufm Stack? Bzw welche Vorteile gibt es hier?
S: (hier hab ich etwas gebraucht bis ich darauf gekommen bin) Speicherzugriff, nurnoch ein Register notwendig für SYSNUM. Man spart Kopiervorgänge, theoretisch beliebig viele Parameter möglich (nicht durch Registeranzahl begrenzt).

P: Warum macht man das eig nicht öfter? Immerhin wollten Betriebsystementwickler ja auch sysenter/sysexit weil es schneller ist?
S: Man muss bei komplett privaten Adressräumen den Stack im Kernel mappen → kostet auch Zeit.

P: Wie sieht so ein Komplexbefehl aus?
S: Befehlsatzebene: Opcode + Argumente → Im Endeffekt wie ein normaler Befehl auch, muss aber von CPU unterstützt werden.

P: Welche Vor-/Nachteile haben den Komplexbefehle bzw. Primitivbefehle?
S: Komplexbefehle brauchen keine Register/keinen Stack zur Parameterübergabe.

P: Was ist denn der Unterschied zwischen partiell und vollständig privaten Adressräumen?
S: Kernel im Userspace gemappt. Jedoch nur zugreifbar von Kernel (Ring 0). (mehr wollte er hier nicht)

P: Wo stehen diese Unterschiede?
S: Im Seitendeskriptor wenn man Paging verwendet.

P: Ok gut, aber braucht man das überhaupt? Also geht das nicht auch ohne dem „privilege“-Eintrag im Seitendeskriptor?
S: (wurde hier etwas verwirrt weil er sich selbst auch verwirrt hat, aber im Endeffekt wollte er folgendes:) Ja, ohne kann man nämlich nicht zwischen Kernel- und Userspaceadressbereichen unterscheiden und unsere Privilegientrennung ist nutzlos.

P: Was will man denn tun wenn man Syscalls bekommt die einen Pointer enthalten? Z.B. bei read/write
S: Man muss überprüfen, ob der Pointer auf den Userspace zeigt.

P: Warum? Ist das sonst iwie kritisch? Was würde passieren, wenn man das nicht tut?
S: Bei read: Man könnte eine Kerneladresse übergeben und hier das System die Pagetables gezielt kaputtschreiben lassen → Zugriff auf alles.
Bei write: Man könnte Daten aus dem Kernel extrahieren.

P: Es gibt auch noch Einadressraumsysteme. Was benötigen die? Wieso geht das mit mpstubs aus BS nicht?
S: mpstubs: 32bit-System → Adressraum ist deutlich zu klein. Man benötigt ein ausreichend großen Adressraum (min. 64bit!), zufällige Verteilung von Speicher.

P: Was bringt das dann?
S: Anwendungen finden sich gegenseitig nur sehr unwahrscheinlich. Security by Obscurity. Adressraum durchsuchen dauert zu lange!

P: Braucht man für die Absicherung sonst noch was?
S: Hab erstmal was von MMU gesagt, da meinte er aber die braucht man sowieso (man hat ja weniger Speicher als der Adressraum groß ist). Hab dann Capabilities/Befähigungen genannt. Beispiel: Adresse weitergeben.

Es wurde teilweise noch etwas mehr gefragt, aber ich kann mich leider nicht mehr daran erinnern. Note war sehr gut.