Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: nooooooooos am 28. November 2005, 17:01

Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag 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
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: Osbios am 28. November 2005, 17:39
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. ???
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: Legend am 28. November 2005, 17:42
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! ;)
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 28. November 2005, 18:56
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... ???
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: bitmaster am 28. November 2005, 22:56
Zitat
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?
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 29. November 2005, 12:15
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... ???
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: bitmaster am 29. November 2005, 14:37
Zitat von: nooooooooos
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).
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: Jidder am 29. November 2005, 14:43
Zitat von: bitmaster
(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?
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 29. November 2005, 18:02
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... ???
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: SSJ7Gohan am 29. November 2005, 19:00
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.
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 29. November 2005, 19:47
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
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: SSJ7Gohan am 29. November 2005, 20:03
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.
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: Legend am 29. November 2005, 21:20
Es wäre unsicher den Stack von der Applikation vorgeben zu lassen.
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 29. November 2005, 21:44
Also, wie geht das, wenn im Gate zum Task z.B Ring 2 angegeben wird, wird der Task im Ring 2 ausgeführt ????
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: lobmann am 30. November 2005, 11:23
hmmm... taüsch ich mich etwa da? Muss das EOI nich nach behandeln des IRQ gesendet werden ?
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: SSJ7Gohan am 30. November 2005, 13:09
Das ist egal, du kannst es auch sofort senden, musst aber beachten, das neue IRQs generiert werden können, nachdem das EOI gesendet wurde.
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 30. November 2005, 14:20
Vieviele Befehle mögen etwa noch herein, bis der nächste Timer generiert wird ?
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 30. November 2005, 18:54
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 ?????
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: SSJ7Gohan am 30. November 2005, 19:02
Klar, die Privilegstufe kann sich ändern, das ist ja auch notwendig, wenn der Task auf die Hardware zugreifen soll usw.
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 30. November 2005, 19:09
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
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: SSJ7Gohan am 30. November 2005, 20:44
Ich würde eher einfach die jump-Methode benutzen, für mein OS benutze ich aber Softwaremultitasking, da das viel leichter und schneller ist.
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 30. November 2005, 20:50
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
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: SSJ7Gohan am 30. November 2005, 21:29
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.
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: nooooooooos am 01. December 2005, 12:13
Ach ja. Aber ip und cs müsste man gar nicht sichern, weil ja sp gesichert wird. Oder ?
Titel: Fragen zum Aufbau eines (Timer-) IRQs
Beitrag von: SSJ7Gohan am 01. December 2005, 13:24
Genau.