BS Übung 06 (Stefan Bosse) [17.12.2024]
Gruppe und Namen der Mitglieder
Punkte:Total/21./22./23./24./25./26./2

Basekernel OS (Praktische Übung)

In dieser Übung soll der Kernel des Basekernel OS näher untersucht werden und einige Änderungen an der Kernel Shell vorgenommen werden.

Speichermanagement

Folgende Dateien im basekernel Verzeichnis sollen untersucht werden:

  1. kernel/kmalloc.c und kernel/kmalloc.h
  2. 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.)?


Kernel Debugging

Folgende Dateien im basekernel Verzeichnis werden betrachtet:

  1. kernel/main.c
  2. kernel/kshell.c
  3. 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.


Hier die globale Definition (kmalloc.c) und Deklaration (kmalloc.h) eintragen

 ▸ 
 ℙ 
[]
 ✗ 
 ≡ 

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.


Hier die Erweiterung von kshell_execute eintragen.

 ▸ 
 ℙ 
[]
 ✗ 
 ≡ 

dm9pZCBrbWFsbG9jX3N0YXRzKCkgewogIHN0cnVjdCBrbWFsbG9jX2NodW5rICpjPWttYWxsb2NfaGVhZDsKICBwcmludGYoIj09PT09PSBLTUFMTE9DID09PT09PVxuIik7CiAgcHJpbnRmKCIlcyAlcyAlc1xuIiwiU1RBVCIsIkFERFJFU1MgIiwiTEVOR1RIIik7CiAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoJZm9yKGMgPSBrbWFsbG9jX2hlYWQ7IGM7IGMgPSBjLT5uZXh0KSB7CiAgICBwcmludGYoIiVzICV4ICVkXG4iLGMtPnN0YXRlPT1LTUFMTE9DX1NUQVRFX0ZSRUU/IkZSRUUiOiJVU0VEIixjKzEsYy0+bGVuZ3RoKTsKCX0KICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cn0KCmtzaGVsbF9leGVjdXRlIC4uLgppZighc3RyY21wKGNtZCwgInN0YXJ0IikpIHsKfSAuLi4uCi8qCiAgRXh0ZW5zaW9uIG9mIHRoZSBrc2hlbGwgaW50ZXJwcmV0ZXIKKi8KLi4uLgp9IGVsc2UgaWYoIXN0cmNtcChjbWQsIm1lbXN0YXRzIikpIHsKICAga21hbGxvY19zdGF0cygpOwp9IAllbHNlIHsKICAgcHJpbnRmKCIlczogY29tbWFuZCBub3QgZm91bmRcbiIsIGFyZ3ZbMF0pOwp9Cg==


Created by the NoteBook Compiler Ver. 1.32.5 (c) Dr. Stefan Bosse (Tue Dec 17 2024 13:55:24 GMT+0100 (Central European Standard Time))