BS Übung 09 (Stefan Bosse) [20.01.2025] |
Punkte: | Total | /2 | 1. | /2 | 2. | /2 | 3. | /2 | 4. | /2 | 5. | /2 | 6. | /2 | 7. | /2 | 8. | /2 |
In dieser Übung sollen präzise Uhren im Basekernel implementiert werden.
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.
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()
. 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.
Aufgabe 2. Jetzt soll diese Funktion über die Kernel Shell als neue Funktion micros
zugänglich gemacht werden (und den aktuellen Wert auf dem Standardausgabekanal ausgibt). Dazu muss die Datei kshell.c
bearbeitet werden (wie in einer früheren Übung). 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.
Aufgabe 3. Jetzt wollen wir die Schnittstelle von Nutzerprogrammen zum Kernel mit eine micros()
Funktion erweitern.