Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: nooooooooos am 28. November 2005, 17:01
-
Hallo zusammen,
ich hätte da mal ein paar Fragen bezüglich dem Aufbau eines (Timer-)IRQs:
1.) Die Reihenfolge vom Senden des EOI-Signals dem STI und CLI und dem Pushen und Poppen?
2.) Wenn ich ja mitten im Timer-IRQ einen JMP ausführe (z.B Taskwechsel) , dann werden ja die nachfolgenden Anweisungen nicht mehr ausgeführt (z.B kein EOI gesendet). Oder wenn das "sti" nach dem "jmp" kommt, dann werden keine IRQs zugelassen ... ???
3.) Bei pusha werden ja "ss" und "sp" auch mit gesichert, was bedeuten würde, dass ich im IRQ den Stack erstmal definieren müsste oder einen anderen Befehl als pusha ?
4.) Macht es Sinn dem Timer-IRQ ein eigenes TSS zu geben ???
Vielen Dank
Noooooooooooos
-
1. Ein IRQ wird durch den PIC ausgelöst, welche dann solange wartet(keinen weiteren IRQs sendet) bis man ihm ein EOI sendet.
2. Anstelle eines direkten JMPs benutzt man die IRET funktion. Denn alle Daten die IRET benutzt (Adresse der Unterbrechung) liegen auf dem Stack und können verändert werden. Normalerweise Speichert man dann die aktuelle Adresse des aktiven Tasks, der vor dem IRQ lief, und setzt dann die Adresse des neuen Tasks ein, der ausgeführd werden soll.
3. Das mit dem Stack ist jetzt nicht ganz so einfach. Das kann ich dir leider auch nicht so genau sagen, aber wenn du einen Task über das TSS laufen lässt, hat jede Privilegstuffe eigenen Stackpointer.
4. ???
-
Nun, natürlich könnte man nen Task Gate einsetzen, aber dann kommste nicht wirklich dazu das auszutauschen wenn es in ne User App reingeht. Von daher eher nein! ;)
-
Hallo
1.) Also das EOI vor allem.
2.) Im Multitasking-Tut von JN steht aber eine Methode mit dem jmp.
3.) Also verwende ich für mein Timer IRQ besser pusha nicht. (er läuft im Ring 0)
4.) Es ist also nicht schlau dem Timer ein TSS zu geben.
Jetzt ist mir aber ne neue Frage aufgetaucht:
A) Wie geht das denn mit den Stacks. Im TSS kann man ja für alle Stufen einen definieren. Kann ich da jetzt für jeden Task und Ring einen Stack definieren. Kann ich auch alle Stacks (also 0,1,2,3) von einem Task mit der gleichen Adresse beladen ? Oder sogar alle Stacks von allen Tasks... ???
-
3.) Bei pusha werden ja "ss" und "sp" auch mit gesichert, was bedeuten würde, dass ich im IRQ den Stack erstmal definieren müsste oder einen anderen Befehl als pusha?
Warum erstmal definieren? Der Stack ist doch schon zu diesem Zeitpunkt definiert. Was meinst du damit?
-
Ja wenn ich ja mit pusha die Register sichere, dann bekommen doch die den Wert 0, oder nicht? Die Stackregister werden mit pusha mitgesichert.
Aber vielmehr begehre ich nach einer Antwort zu dieser Frage:
A)Wie geht das denn mit den Stacks. Im TSS kann man ja für alle Stufen einen definieren. Kann ich da jetzt für jeden Task und Ring einen Stack definieren. Kann ich auch alle Stacks (also 0,1,2,3) von einem Task mit der gleichen Adresse beladen ? Oder sogar alle Stacks von allen Tasks... ???
-
Ja wenn ich ja mit pusha die Register sichere, dann bekommen doch die den Wert 0, oder nicht? Die Stackregister werden mit pusha mitgesichert.
Was redest du denn für einen misst? Die Register werden gesichert aber nicht auf Null gesetzt. Nach dem popa sind sie wieder genauso wie vor dem pusha. pusha und popa verändern die Register nicht (außer sp, aber dieses wird nach dem popa wieder so wie vor dem pusha).
-
(außer sp, aber dieses wird nach dem popa wieder so wie vor dem pusha).
sp wird doch einfach um 16 (bzw. 32 im 32 bit modus) erhöht. es ist doch gerade so, dass sp eben nicht geladen wird, oder?
-
Ach, dann ist ja gut aber immer noch meine andere (und viel wichtigere) Frage:
Wie geht das denn mit den Stacks. Im TSS kann man ja für alle Stufen einen definieren. Kann ich da jetzt für jeden Task und Ring einen Stack definieren. Kann ich auch alle Stacks (also 0,1,2,3) von einem Task mit der gleichen Adresse beladen ? Oder sogar alle Stacks von allen Tasks... ???
-
Klar kannst du das. Ring 1 und 2 werden aber normalerweise nicht genutzt. Ausserdem solltest du beachten, das bei einem preemptiven Kernel die Stacks dann überschrieben werden könnten, wenn in zwei verschiedenen Tasks gleichzeitig ein Systemcall oder eine andere Kerneltätigkeit ausgeführt wird.
-
Aber zu was ist denn die definierung verschiedener Stacks pro Task denn nütze, denn in Task läuft ja nur in einer Privilegstufe.
Gruss Noooooos
-
Ein Task kann ja über ein Gate in Ring 0, 1 und 2 eintreten, und für jeden dieser Rings wird dann wenn in das Gate gesprungen wird ein anderer Stack benutzt.
-
Es wäre unsicher den Stack von der Applikation vorgeben zu lassen.
-
Also, wie geht das, wenn im Gate zum Task z.B Ring 2 angegeben wird, wird der Task im Ring 2 ausgeführt ????
-
hmmm... taüsch ich mich etwa da? Muss das EOI nich nach behandeln des IRQ gesendet werden ?
-
Das ist egal, du kannst es auch sofort senden, musst aber beachten, das neue IRQs generiert werden können, nachdem das EOI gesendet wurde.
-
Vieviele Befehle mögen etwa noch herein, bis der nächste Timer generiert wird ?
-
Also eben, stimmt diese Aussage:
Jeder Task kann in unterschiedlichen Ringen ausgeführt werden. Also Task1 einmal im Ring 0 und dann im Ring 3 ?????
-
Klar, die Privilegstufe kann sich ändern, das ist ja auch notwendig, wenn der Task auf die Hardware zugreifen soll usw.
-
Ach gut. Danke
Ne andere Frage:
Wie macht ihr das Multitasking mit der IRET (neuer Task zuerst auf den Stack) oder der JMP neuer_task Methode. Welche findet ihr besser, schneller, einfacher .....
Und, zum die IRET Methode laufen zu lassen braucht der Timer-IRQ selbst ein TSS.
Gruss
Nooooooos
-
Ich würde eher einfach die jump-Methode benutzen, für mein OS benutze ich aber Softwaremultitasking, da das viel leichter und schneller ist.
-
Oder Software-Multitasking geht so:
1.)Alle Register auf den Stack
2.)cs und ip in eine Tabelle
3.)sprung zu cs und ip im nächsten Eintrag der Tabelle
-
Du musst auch ESP sichern. Ansonsten wäre es natürlich auch so möglich, ich mache es so:
1) Register sichern
2) ESP in ne globale Variable
3) Scheduler aufrufen
4) Der Scheduler sichert die globale Variable und schreibt den gesicherten ESP des nächsten Stacks rein
5) Alle Register wiederherstellen.
-
Ach ja. Aber ip und cs müsste man gar nicht sichern, weil ja sp gesichert wird. Oder ?
-
Genau.