BS Übung 09 (Stefan Bosse) [22.01.2025] |
Punkte: | Total | /2 | 1. | /2 | 2. | /2 | 3. | /2 | 4. | /2 | 5. | /2 | 6. | /2 | 7. | /2 |
In dieser Übung sollen:
Benötigt wird die aktuelle Version des Basekernel OS:
http://git.edu-9.de/sbosse/basekernel
Folgende Dateien aus dem Kernel sind für diese Übung relevant:
kernel/clock.c
kernel/clock.h
kernel/kshell.c
kernel/kshell.h
kernel/syscall_handler.c
kernel/syscall_handler.h
include/kernel/syscall.h
include/kernel/config.h
In der Konfigurationsdatei kann KSHELL_SERIAL
definiert werden um die bidirektionale serielle Kommunikation mit der VMM Konsole einzuschalten.
Motivation: Die bisherige Zeitmessung (wie in vielen Betriebssystemen( basiert auf einer künstlichen diskreten Zeiteint, dem Tick (oder hier Click). Dieser wird von einem Hardwaregerät (Timer) periodisch ausgelöst und ruft einen Interrupthandler im Kernel auf:
#define CLICKS_PER_SECOND 20
static void clock_interrupt(int i, int code)
{
clicks++;
process_wakeup_all(&queue);
if(clicks >= CLICKS_PER_SECOND) {
clicks = 0;
seconds++;
process_preempt();
}
}
clicks
und seconds
Variablen. D.h. die Zeitauflösung ist 50 ms.Weiter Informationen zum PIT und dessen Programmierung findet sich hier: https://wiki.osdev.org/Programmable_Interval_Timer
Wir wollen nun eine neue Kernelfunktion unsigned long clock_micros()
implementieren die den Zeitzähler nutzt um eine Auflösung im Mikrosekundenbereich ermöglicht (d.h. Systemzeit in Mikrosekunden).
unsigned long read_pit_counter()
Funktion ausgelesen werden.Lese das Modul T und schaue das Einführungsvideo.
#define TIMER_FREQ 1193182
#define TIMER_COUNT (((unsigned)TIMER_FREQ)/CLICKS_PER_SECOND)
static unsigned long read_pit_counter(void);
Aufgabe 1. Erweitere die clock.c
Datei mit einer neuen Funktion unsigned long clock_micros()
und trage die Funktionsdeklaration in clock.h
ein. Diese muss neben den clicks
und seconds
Variablen den aktullen Zählerwert mit unsigned long counter=read_pit_counter()
auslesen. Aber zunächst überlege die Berechnung der aktuellen Mikrosekundenzeit aus diesen drei Variablen plus den obigen Definitionen TIMER_COUNT
und CLICKS_PER_SECOND
. Füge die Gleichung in das Eingabefeld ein und nachfolgend den Code für die neue Funktion.
clock_micros
dW5zaWduZWQgbG9uZyBjbG9ja19taWNyb3MoKSB7CiAgdW5zaWduZWQgbG9uZyBjb3VudGVyPXJlYWRfcGl0X2NvdW50ZXIoKTsKICByZXR1cm4gKChjbGlja3MqMTAwMDAwMCkvQ0xJQ0tTX1BFUl9TRUNPTkQpKwogICAgICAgICAoc2Vjb25kcyoxMDAwMDAwKSsKICAgICAgICAgKFRJTUVSX0NPVU5ULWNvdW50ZXIpKjEwMDAwMDAvQ0xJQ0tTX1BFUl9TRUNPTkQvVElNRVJfQ09VTlQ7Cn0=
Aufgabe 2. Jetzt soll diese Funktion über die Kernel Shell als neue Funktion micros
zugänglich gemacht werden, die bei Aufruf den aktuellen Wert auf dem Standardausgabekanal ausgibt (mittels printf
). Dazu muss die Datei kshell.c
bearbeitet werden und (wie in einer früheren Übung) und ein Eintrag in kshell_execute
für den micros
Befehl hinzugeügt werden. Teste die Funktion über die Konsole (entweder die native Kernelkonsole oder über die serielle Schnittstelle des VMM). Trage die Änderungen in kshell.c
unten ein.
kshell_execute
ZWxzZSBpZighc3RyY21wKGNtZCwibWljcm9zIikpIHsKICAgcHJpbnRmKCIldSB1c1xuIixjbG9ja19taWNyb3MoKSk7Cn0=
Aufgabe 3. Jetzt wollen wir die Schnittstelle von Nutzerprogrammen zum Kernel mit einer micros()
Funktion erweitern.
Wie benötigen folgende Dateien im Kernelcode:
kernel/syscall_handler.c
kernel/syscall_handler.h
include/kernel/syscall.h
Was ist ingesamt zu tun damit Nutzerprogramme die neue clock_micros
Funktion nutzen können?
Aufgabe 4. Erweitere zunächst die Header Datei kernel/syscall.h
und füge eine neue Syscall ID SYSCALL_MICROS
(am Ende der Enumeration einfügen). Dann füge eine neue Syscall Handler Funtion int syscall_micros()
in kernel/syscall_handler.c
ein, sowie dort auch eine Erweiterung in der switch-Anweisung in der syscall_handler()
Funktion (am Ende einfügen). Wichtig: Alle Syscall Handler Funktionen geben int
als Datentyp zurück, d.h. die Mikrosekundenzeit muss nach int
umgewandelt werden (proforma).
kernel/syscall.h
und kernel/syscall_handler.c
Kompiliere den Kernel und teste ihn noch einmal. Noch können wir aber die erweiterte Syscall Schnittstelle nicht in Nutzerprogrammen verwenden.
dHlwZWRlZiBlbnVtIHsKICAuLi4KICBTWVNDQUxMX0RFVklDRV9EUklWRVJfU1RBVFMsCiAgU1lTQ0FMTF9NSUNST1MsCglNQVhfU1lTQ0FMTAkJLy8gbXVzdCBiZSB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBlbnVtCn0gc3lzY2FsbF90OwoKaW50IHN5c2NhbGxfbWljcm9zKCkgewogIHJldHVybiAoaW50KWNsb2NrX21pY3JvcygpOwp9
Für die Standard-C Bibliothek müssen folgende Dateien geändert werden:
include/library/syscalls.h
library/syscalls.c
library/stdlib.h
library/stdlib.c
Wir werden den Wrapper für die Syscall Funktion dann in einer neuen Standard Funktion unsigned long micros()
nutzen und die Typwandlung von int
nach unsigned long
durchführen..
Aufgabe 5. Erweitere zunächst die Header Datei library/syscalls.h
und füge eine neue Syscall Wrapper Funktion syscall_micros
hinzu. Dann füge eine neue Syscall Handler Funktion int syscall_micros()
in library/syscallc.c
ein.
library/syscalls.h
und library/syscalls.c
aW50IHN5c2NhbGxfbWljcm9zKCk7CmludCBzeXNjYWxsX21pY3JvcygpewogIHJldHVybiBzeXNjYWxsKFNZU0NBTExfTUlDUk9TLCAwLCAwLCAwLCAwLCAwKTsKfTs=
Jetzt muss noch die Standardbibliothek erweitert werden.
Aufgabe 6. Erweitere die Header Datei library/stdlib.h
und füge eine neue Funktion unsigned long micros()
hinzu. Dann füge die neue Funktion unsigned long micros()
in library/stdlib.c
ein.
library/stdlib.h
und library/stdlib.c
dW5zaWduZWQgbG9uZyBtaWNyb3MoKTsKdW5zaWduZWQgbG9uZyBtaWNyb3MoKSB7CiAgcmV0dXJuICh1bnNpZ25lZCBsb25nKXN5c2NhbGxfbWljcm9zKCk7Cn0=
Schließlich soll die neue Funktion in dem bereits vorhandenen Programm sysstat eingebaut werden (ist schon enthalten):
Ergänzungen inuser/sysstat
` Aufgabe 7. Kompiliere alles und teste in der VM. Um das Nutzerprogramm sysstat
ausführen zu können muss das Dateisystem mit automount
eingebunden werden. Dann kann mittels run bin/sysstat.exe
das modifizierte Programm ausgeführt werden. Welche Aufrufzeiten hat der Syscall durchschnittlich (siehe Ausgabe des Delta Wertes in der printf Anweisung) in der WebVM86? Ist eine "Auflösung" erkennbar, d.h. gibt es bei wiederholter Ausführungen nur bestimmte Messwerte oder schwanken diese?