BS Übung 06 (Stefan Bosse) [17.12.2024] |
Punkte: | Total | /2 | 1. | /2 | 2. | /2 | 3. | /2 | 4. | /2 | 5. | /2 | 6. | /2 |
In dieser Übung soll der Kernel des Basekernel OS näher untersucht werden und einige Änderungen an der Kernel Shell vorgenommen werden.
Folgende Dateien im basekernel Verzeichnis sollen untersucht werden:
kernel/kmalloc.c
und kernel/kmalloc.h
library/malloc.c
und library/malloc.h
Aufgabe 1. Was sind die wesentlichen Unterschiede bei der Speicherverwaltung im Kernel (vor allem kmalloc
und kfree
) zu der Userspace Implementierung? Vergleiche Datenstrukturen und Algorithmen. Die Userspace Implementierung beinhaltet viele Informationen und weiterführende Links, die oberflächlich gelesen werden sollten. Welche Belegungsalgorithmus wird jeweils verwendet? Wie sehen die Datenstrukuren aus (d.h. welche Klasse, Liste, Baum, Tabelle usw.)?
Folgende Dateien im basekernel Verzeichnis werden betrachtet:
kernel/main.c
kernel/kshell.c
kernel/kmalloc.c
Jetzt geht es in den Kernel. Die Zugriff über die VM86 Oberfläche via serielle Schnittstelle wird derzeit nicht benutzt (d.h. // #define KSHELL_SERIAL
muss undefiniert bleiben).
Die Datenstruktur von kmalloc ist eine verkettete Liste:
struct kmalloc_chunk {
int state;
int length;
struct kmalloc_chunk *next;
struct kmalloc_chunk *prev;
};
Aufgabe 2. Die Struktur implementiert?
Der Status (state) ist einer von den beiden folgenden Werten:
#define KMALLOC_STATE_FREE 0xa1a1a1a1
#define KMALLOC_STATE_USED 0xbfbfbfbf
Aufgabe 3. Warum werden für den Status eines Blocks folgende seltsamen Werte verwendet?
Aufgabe 4. Ist im Kernel Speichereallokation möglich und welche Funktion wird dafür benötigt und wartum?
Aufgabe 5. In der kernel/kmalloc.c
und kernel/kmalloc.h
soll der Kopf der obigen Liste global gemacht werden. Da die Variable head benannt ist sollte man diese konsistent in kmalloc_head
umbennen. Teste die Veränderung so dass der Kernel noch funktioniert. Desweiteren muss die Datenstruktur kmalloc_chunk
in den Header verschoben werden.
▸
ℙ
[] |
✗
≡
|
ZXh0ZXJuIHN0cnVjdCBrbWFsbG9jX2NodW5rICprbWFsbG9jX2hlYWQ7IC8vIEgKc3RydWN0IGttYWxsb2NfY2h1bmsgKmttYWxsb2NfaGVhZCA9IDA7ICAgIC8vIEM=
Aufgabe 6. Jetzt soll der kshell_execute
(kshell.c) Funktion eine weiteres Kommando hinzugefügt werden: memstats
. Dieses soll die Belegung anhand der verketteten Blockliste des Speichers ausgeben. Dabei soll die Liste als Tabelle ausgegeben werden (Addresse des Datenbereichs, Status, Länge). Teste die Funktion 1. Nach dem Kernelstart, 2. nachdem via kshell und automount
das Dateisystem eingeunden wurde, und 3. nachdem run bin/shell.exe
ausgeführt wurde. Notiere grob die Ausgabe.
kshell_execute
eintragen.
▸
ℙ
[] |
✗
≡
|
dm9pZCBrbWFsbG9jX3N0YXRzKCkgewogIHN0cnVjdCBrbWFsbG9jX2NodW5rICpjPWttYWxsb2NfaGVhZDsKICBwcmludGYoIj09PT09PSBLTUFMTE9DID09PT09PVxuIik7CiAgcHJpbnRmKCIlcyAlcyAlc1xuIiwiU1RBVCIsIkFERFJFU1MgIiwiTEVOR1RIIik7CiAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoJZm9yKGMgPSBrbWFsbG9jX2hlYWQ7IGM7IGMgPSBjLT5uZXh0KSB7CiAgICBwcmludGYoIiVzICV4ICVkXG4iLGMtPnN0YXRlPT1LTUFMTE9DX1NUQVRFX0ZSRUU/IkZSRUUiOiJVU0VEIixjKzEsYy0+bGVuZ3RoKTsKCX0KICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cn0KCmtzaGVsbF9leGVjdXRlIC4uLgppZighc3RyY21wKGNtZCwgInN0YXJ0IikpIHsKfSAuLi4uCi8qCiAgRXh0ZW5zaW9uIG9mIHRoZSBrc2hlbGwgaW50ZXJwcmV0ZXIKKi8KLi4uLgp9IGVsc2UgaWYoIXN0cmNtcChjbWQsIm1lbXN0YXRzIikpIHsKICAga21hbGxvY19zdGF0cygpOwp9IAllbHNlIHsKICAgcHJpbnRmKCIlczogY29tbWFuZCBub3QgZm91bmRcbiIsIGFyZ3ZbMF0pOwp9Cg==