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

Uhren

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();
	}
}

Mikrosekundenuhr

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).

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.



Erweiterung der Kernel Shell

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.





Erweiterung der Kernel SysCall API

Aufgabe 3. Jetzt wollen wir die Schnittstelle von Nutzerprogrammen zum Kernel mit eine micros() Funktion erweitern.


Created by the NoteBook Compiler Ver. 1.35.1 (c) Dr. Stefan Bosse (Tue Jan 21 2025 15:52:54 GMT+0100 (Central European Standard Time))