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.