Autor Thema: Multitasking - Frage zum Stack  (Gelesen 6601 mal)

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« 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
« Letzte Änderung: 08. April 2007, 18:12 von Cheebi »
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

GhostCoder

  • Beiträge: 187
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 02. April 2007, 19:32 »
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
A man, a legend!

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #2 am: 02. April 2007, 20:58 »
hey thx..

Cheebi
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #3 am: 02. April 2007, 22:28 »
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();
  }
}

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #4 am: 08. April 2007, 20:23 »
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*
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
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 09. April 2007, 15:26 »
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.

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

Zitat
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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« Antwort #6 am: 09. April 2007, 19:29 »
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?)
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 09. April 2007, 19:47 »
also brauche ich zwangsläufig Paging?
Zwangsläufig nicht, aber paging macht definitiv sinn.

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

Zitat
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.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

 

Einloggen