Logo
Logo-Icon Sitemap Print-Icon Print-Version Contact-Icon Contact
  • Home
  • About IAIK
    • People
    • News
    • Events
    • How To Reach Us
    • Jobs
    • Privacy Policy
  • Research
    • Publications
    • E-Government
    • Formal Methods for Design & Verification
    • Implementation Attacks
    • Java-Security
    • Krypto
    • Secure & Correct Systems
    • Secure Entities for Smart Environments
    • Secure RFID
    • Trusted Computing
    • VLSI
  • Teaching
    • Bachelor Courses
    • Master Courses
    • Master Theses
    • Microsoft Academic Alliance
    • PhD
    • E-Exam
  • Partnerships
    • A-SIT
    • Stiftung SIC
Left Logo
Betriebssysteme
Downloads Practicals - Assignment 1 - Assignment 2 - Downloads - FAQ - Regeln - Statistiken - Timetable - Tutoren Timetable
Right Logo
You are here: Start » Teaching » Bachelor Courses » Betriebssysteme » Practicals » FAQ

FAQs

Bekomme Event type: PANIC Device: [MEM0 ] Message: ROM: couldn't open ROM image file '/usr/share/bochs/VGABIOS-lgpl-latest'

Bochs kann das VGA Bios nicht finden. Kopiere das vgabios nach '/usr/share/bochs/VGABIOS-lgpl-latest' also z.B. cp /usr/share/vgabios/vgabios.bin /usr/share/bochs/VGABIOS-lgpl-latest

Bekomme: Event type: PANIC Device: [MEMO] Message: ROM: System BIOS must end at 0xfffff

Ändere bitte in utils/bochs/bochsrc:
von romimage: file=$BXSHARE/BIOS-bochs-latest, address=0xf0000
auf romimage: file=$BXSHARE/BIOS-bochs-latest

Ich bekomme beim ausführen von make bochs folgende PANIC Meldung: Device: [HD ] Message: ata0-0 could not open hard drive image file SWEB-flat.vmdk

Hast du das Sweb-Klonen und -Bauen auch als normaler User (also nicht als root) gemacht?

Ich bekomme unter Ubuntu 7.04 und unter Debian (Version von der BS-HP) beim Befehl make bochs folgenden Fehler: Event type: PANIC Message: dlopen failed for module 'x': file not found

Hast du das Paket bochs-x installiert?

Wenn ich Assembler Code in das Projekt einfüge, bzw. vorhandenen bearbeite, werden diese Dateien dann mit make automatisch kompiliert oder muß man das manuell machen? Wie sieht das mit C++ Dateien aus?

Sofern du deine neuen Dateien in bereits vorhandenen Verzeichnissen (mit Makefile) einfügst und dann einmal 'cmake .' laufen lässt, werden sie mitübersetzt. Die Erkennung der Source-Dateien findet über die Dateiendung statt: .cpp entspricht C++, .c entspricht C, .s entspricht Assembler mit Intelsyntax (nasm) und .S ist Assembler mit AT&T-ähnlicher Syntax (GNU assembler

Jede Instanz der Klasse Thread hat ja eine Membervariable stack_, die dem Thread einen Stack von 8 KB zur verfügung stellt. In einem vorherigen Posting wurde geschrieben dass sich der Stack eines Threads auf einer Page befindet. Wenn sich der Stack eines Threads auf einer Page befindet, was hat es dann mit dieser Membervariable stack_ auf sich bzw. wie sieht der Zusammenhang zwischen dieser Stack-Page und dieser Variable aus!?!?!

Es gibt bei einem Prozess mit nur einem Thread jeweils zwei Stacks in Sweb:

  • Ein Stack für den Usermodus, für den extra eine Page eingebunden wird
  • Ein Stack für den Kernelmodus, der irgendwo im Kernelspeicherbereich allokiert wird.

Die stack_-Membervariable der Klasse Thread hat einfach nur den Zweck, Speicher für das Stackframe des Threads im Kernelmodus bereitzustellen.

Wenn ein Userprogramm einen Syscall aufruft, und ich mich dann im SyscallHandler im Kernel befinde und dort ein Yield() aufrufe, wo wacht das Userprogramm das nächste mal, wenn es vom Scheduler aufgerufen wird, wieder auf?

Im Kernel, und zwar nach dem Yield().

Wenn ein Programm am Ende seines Codes angelangt ist, dann wird dieses ja ohne den Syscall Exit beendet.

exit wird in jedem Fall aufgerufen: Wenn du dir das File start.s ansiehst, bemerkst du, dass er zuerst deine main-funktion, und danach immer syscall exit aufruft.

In der Posix-Norm wird für Zeiger void* verwendet. Dürfen (Sollen) wir stattdessen den Typ "pointer" verwenden, der in SWEB definiert wurde.

arch/x86/include/types.h wird in der Userspace-libc an sich nicht, sondern mehr im Kernel verwendet. Am Einfachsten ist es sicherlich, wenn man im libc-Teil (Interface für die Userprogramme) die gegebenen Typen verwendet und sich hier an POSIX hält. Auf der Kernelseite könnt ihr natürlich gern die vordefinierten Typen bzw. eigene verwenden, solange das mit der libc-Seite zusammenpasst und dokumentiert wird.

Multithreading: Wie bekomme ich eine neue Adresse für einen neuen UserStack und wie kann ich dafür Speicher anfordern?

Sie "bekommen" von selbst mal gar nichts. Da sich alle Threads denselben virtuellen Adressraum teilen (müssen), müssen alle Stacks aller threads da drinnen Platz haben. Wo die Stacks der neuen Thread zu liegen kommen, ist Ihre Design-Entscheidung und Sie müssen dieses Design dann an geeigneter Stelle in den Code einbauen.

Welche arten von Threads sollen von uns geforkt werden? Sollen nur UserThreads unterstützt werden oder sollen alle Arten von Threads fork unterstützen?

Was sollte ein thread, der kein userThread ist, bei einem fork tun? -> nur bei UserThreads sinnvoll!

Wo erfolgt im MemoryManagement die Unterteilung in Data, Text, Stack und Heap? Ich hab mir den PageManager genau durchgeschaut - aber finde da nirgends eine Unterscheidung

Der PageManager macht nur eines: Er verwaltet die freien physikalischen Seiten. Das hat erstmal nichts mit den Sections eines Executables bzw dem ELF Format zu tun. Im Executable steht dann welche Section (Data, Text, BSS) an welche linearen Adressen kommen soll. Der Loader liest diese Infos aus, holt sich vom PageManager eine freie physikalische Seite, erstellt ein Mapping von der gewünschten linearen Page auf die gerade geholte physikalische Page und schreibt den ByteCode dann auf auf den spezifizierten linearen Adressebereich

Die MMU übernimmt ja die Adress-Übersetzung. Dazu braucht sie ja diese Seitentabelle. Wo diese ist weiß sie, indem man die Startadresse von der Tabelle in das Register schreibt. Aber woher kennt sie die Struktur?

Stimmt, das Register heißt CR3. Dieses verweist allerdings nicht sofort auf die pageTABLE sondern zuerst auf das pageDIRECTORY, dessen Einträge wiederum erst auf pageTABLEs verweisen. Die Struktur gibt die CPU vor, daher kennt sie sie auch. Das Betriebssystem muss die Struktur einhalten, welche die CPU vorgibt. ein paar structs für diese Strukturen findest du in der paging-definitions.h in arch/x86/include/...

Kann man im Userspace keine Klassen anlegen?

Nein, es gibt momentan nur reines C im Userspace!

Wo finde ich Manuals zur X86-Architektur?

Die Intel-Manuals sind direkt bei Intel als Download erhältlich.

Müssen für den erstellten Code debug oder kprintfd ausgaben erstellt werden? Oder reicht es, den Code (gut) kommentiert abzugeben?

Beachtet im Assignment den Punkt "Erforderlicher Output". Verwendet bitte die Funktion debug(...), um den debug-output mittels debug flags zu steuern. Kommentare im code sind natuerlich auch notwendig, aber ein gut lesbarer Output wird durch keinen Kommentar ersetzt.

make submit GEHT NICHT! Es wird dauernd das selbe file erstellt welches nicht unsere versionen der dateien und schon gar keine neuen Dateien enthält obwohl diese bei hg commit und hg add aufgelistet werden.

make submit packt den tip, wenn ihr nicht gemereg't habt, habt ihr vielleicht zwei davon, schaut euch mal mit 'hg status' und 'hg diff -r tip' an was hg glaubt daß der Status eures Repositories ist.

Ihr müsst btw natürlich nicht mit make submit packen, das ist nur eine Hilfestellung. Wenn ihr die Regeln beachtet (Kein Sondermüll, keine binaries, keine Images, nix vergessen, etc) könnt ihr auch einfach so packen

wir benötigen eine systemzeit!

IRQ0 wird peridisch ausgelöst. Am besten du zählst einfach die Ticks mit und leitest daraus eine Systemzeit ab. Die Periode kannst du afair in der bochsrc einstellen, ist aber nicht speziell wichtig da die Ticks ja nur relativ zueinander verglichen werden.

wo ist die Größe des Blockdevices, das wir zum swapen verwenden sollen einzustellen? Ist es möglich die Devicegröße eines Blockdevices in sweb abzufragen?

Dazu gibt es die beiden BDRequest Typen BD_GET_BLK_SIZE und BD_GET_NUM_BLOCKS. Wenn du diese Requests an das Device schickst und die Ergebnisse multiplizierst hast du die Groesse des Devices in Bytes.

Wir brauchen so viel Kernel Memory, was sollen wir tun?

Ihr habt nach dem booten circa <3MiB dynamischen Kernel Speicher zur Verfügung. Was tut ihr bitte um den aufzubrauchen? :)
1. Empfehlung: Effizienter mit Speicher umgehen
2. Empfehlung: im main.cpp, oberhalb von startup gibt es einen Example Hack (und ich meine Hack !!!) wie man evtl seinen Kernel Memory vergrößern könnte.

Dürfen wir am Page Manager was ändern, bzw wie erweitern wir die Klasse um neue Members ohne daß uns was um die Ohren fliegt ?

Im Prinzip könnt ihr ganz normal neue Members adden. Allerdings ist es imho besser, swap-Management, PageTable, Inverse PageTable usw in eine eigene oder mehrere eigene Klassen zu packen. So müsst ihr im PM nur ein wenig Code hinzufügen/ändern was problemlos möglich ist. (bei den meisten wird das heißen 1-2 Zeilen hinzufügen)

Ich habe mittlerweile verstanden, dass der vierte GB des virtuellen Speichers ein 1:1 Mapping des physikalischen Speichers ist. Man verwendet also 'get3GBAddress', um direkt auf den physikalischen Speicher zuzugreifen. Aber: Bietet die MMU dieses Mapping von Haus aus an?

die umsetzung der linearen adressen in physikalische adressen macht narürlich schon der prozessor. sweb kümmert sich nur darum, dass alle neuen page directories so initialisiert werden, dass der bereich zwischen 3 und 4 GB auf die physikalischen seiten zwischen 0 und 1 GB zeigen.

Fehler: KERNEL PANIC: Assertion Failed in File: home/user/workspace/sweb_a2/common/source/mm/KernelMemoryManager.cpp on Line: 135

Das ist der klassische Fehler wenn irgendwo der Heap korrupiert wurde. z.b. über das Ende eines Arrays hinausgeschrieben, pointer mit normaler arithmetik verwechselt, oder generell auf die falsche speicheradresse geschrieben wurde.

Angenommen 5 prozesse verwenden eine gemeinsame physical page. sobald diese page modifiziert wird, wird das dirty flag im PTE des aktiven prozesses gesetzt, richtig? die anderen 4 kriegen also nichts von der modifikation mit.

genau!

Wie wird festgestellt, dass es sich um einen PageFault handelt?

Alle Speicherzugriffe werden über die MMU abgewickelt, die im PD und im PT die physikalische Adresse der Seite raussucht. Wenn im PDE (page-dir-entry) schon das present-Bit 0 ist, dann ist die PT nicht im physikalischen Speicher vorhanden. Wenn die PT aber vorhanden ist, dann wird erst im PTE nachgeschaut, ob das present-Bit gesetzt ist. Für das Auslösen eines PageFaults ist es egal, ob im PDE oder im PTE das present-Bit 0 ist.

Kann die PageTable der ausgelagerten Seite auch ausgelagert sein? (bei Behandlung im PageFaultHandler)

Die PT auszulagern macht sowieso nur Sinn, wenn alle PageFrames dahinter auch ausgelagert sind (du greifst auf die PT mindestens genauso oft zu wie auf die dahinterliegenden PageFrames). Also ja, sie KANN ausgelagert sein, wenn ihr das Auslagern von PageTables implementiert habt. Dann müsst ihr halt PT UND PageFrame einlagern.

Wo wird auf eine Page zugegriffen, die bereits geladen ist? Und wird genau dort dann das Accessed Bit gesetzt?

Bei jedem Zugriff (read or write) wird das accessed bit in der zugehörigen PTE automatisch von der HardWare (CPU/MMU) gesetzt.

© 1990 - 2012 IAIK TU Graz
Contact | Jobs | Sitemap | Impressum