Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 02. April 2007, 17:46
-
Hi Leute,
im Moment sind Ferien, da kann man sich so richtig dem OS widmen (wär da net noch so ne doofe Facharbeit zu machen) ... naja, deswegen bin ich zur zeit ziemlich häufig am Fragen-stellen ...
In unserem OS ist der Timer so initialisiert, dass er mit einer Frequenz von etwa 1000 Hz den IRQ0 auslöst. Nun wollen wir Multitasking implementieren, das Problem ist nur, dass im Diskettentreiber der Timer zum Warten einer bestimmten Zeit benötigt wird. Wie kann ich denn den IRQ0 zum Timen von Millisekunden und gleichzeitg noch zum Timen von Taskswitches nutzen, ohne dass 1000 Taskswitches pro Sekunde ablaufen ?
Gruß,
Cheebi
-
Hallo,
du kannst doch einfach nur z.B. alle 10 Aufrufe vom Timer Interrupt nen Taskswitch vornehmen und trotzdem bei jedem Call den Counter hochzählen.
Sowas ala ...
void timer_irq()
{
static int i = 0;
counter++;
if(++i == 10)
{
i = 0;
scheduler();
}
}
MfG
-
hey thx..
Cheebi
-
Das stücklein Code lässt sich noch ein wenig optimieren ;-). (Vorallem Placebo :-D)
void timer_irq()
{
static int i = 0;
counter++;
if((++i % 16) == 0)
{
scheduler();
}
}
-
Hi,
ich hab' jetzt aber noch ne Frage zum Stack... Also ich versteh, warum ich den Stackpointer vom User-Prozess speichern muss, aber wozu denn esp0 (kernel-stack) irgendwie hat das doch damit zu tun, dass Kernelfunktionen von Prozessen aus ausgeführt werden können? *nix_blick* (http://cheebi.ch.ohost.de/forum2/smilies/kotz.gif)
Und warum nutze ich das TSS vom Hardwaremultitasking? Das brauche ich für das Blocken von Befehlen, ja, aber das dürfte dann im Longmode (in dem kein Hardwaremultitasking mehr möglich ist) genauso wenig funktionieren, oder?
Was mich auch noch total überfordert ist, dass ja jeder Task den Stack an einer anderen Adresse unterbringen muss, wie habt ihr das geregelt? (also, ich meine, nach welchem Prinzip ihr aussucht, wo der Adressraum für den Stack ist)
Cheebi
-
aber wozu denn esp0 (kernel-stack) irgendwie hat das doch damit zu tun, dass Kernelfunktionen von Prozessen aus ausgeführt werden können? Und warum nutze ich das TSS vom Hardwaremultitasking?
Esp0 wird im momentan geladenen TSS gespeichert, damit die CPU weiß, welchen Stack sie bei einem Interrupt verwenden soll. Da kann man nicht den normalen Userstack hernehmen, da ja im Userstack selber auch Probleme auftreten können, zB ein Stacküberlauf oder auch ein Pagefault, wenn der stack nicht ausreicht.
...aber das dürfte dann im Longmode (in dem kein Hardwaremultitasking mehr möglich ist) genauso wenig funktionieren, oder?
Der longmode hat auch ein TSS. Das schaut aber um einiges magerer aus.
Was mich auch noch total überfordert ist, dass ja jeder Task den Stack an einer anderen Adresse unterbringen muss, wie habt ihr das geregelt? (also, ich meine, nach welchem Prinzip ihr aussucht, wo der Adressraum für den Stack ist)
Jeder Prozess hat ja seinen eigenen virtuellen Adressraum dank Paging, deswegen kannst du virtuell den stack in jedem Prozess an die gleiche Adresse setzten. Musst halt nur eine Page allozieren und dann an diese Stelle mappen.
-
Hi,
danke bluecode... also brauche ich zwangsläufig Paging? Weil im Moment habe ich einfach nur ein flaches Speichermodell... Brauche ich aus dem gleichen Grund wie für den Stack dann auch Paging für Programme? Wenn ich Programme schreibe, will der Linker im letzten Schritt vor der Erstellung eines Binary-Formats ja auch eine Adresse, an der das Programm ausgeführt wird. In einem flachen Speichermodell ist jedes Programm an einer anderen Adresse untergebracht... Das ist ein Problem. Löst man das dann auch durch Paging?
In dem Zuge: hat jemand ein eigenes Dateiformat entwickelt (ähnlich dem MenuetOS) nur eben für C-Compiler? (Oder muss ich dazu dann auch noch einen eigenen Compiler schreiben?)
-
also brauche ich zwangsläufig Paging?
Zwangsläufig nicht, aber paging macht definitiv sinn.
Wenn ich Programme schreibe, will der Linker im letzten Schritt vor der Erstellung eines Binary-Formats ja auch eine Adresse, an der das Programm ausgeführt wird. In einem flachen Speichermodell ist jedes Programm an einer anderen Adresse untergebracht... Das ist ein Problem. Löst man das dann auch durch Paging?
Das wird normalerweise durch Paging gelöst, da ja alle Programme in ihrem virtuellen Adressraum auch an der selben Adresse sein können/sind. Man kann es auch über Segmentation machen oder aber den Code relozieren (dazu braucht man aber ein Dateiformat, dass das unterstützt).
hat jemand ein eigenes Dateiformat entwickelt (ähnlich dem MenuetOS) nur eben für C-Compiler? (Oder muss ich dazu dann auch noch einen eigenen Compiler schreiben?)
Dazu musst du keinen eigenen Compiler schreiben, sondern nur das Dateiformat, welches dein Linker ausspuckt in das umwandeln, was du dir vorstellst. Aber ich sage mal, dass das den aufwand eher nicht wert ist. Ich verwende zB einfach gleich elf.