Autor Thema: Fragen zum Aufbau eines (Timer-) IRQs  (Gelesen 13476 mal)

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« 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

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #1 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. ???
db 0x55AA

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #2 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! ;)
*post*

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #3 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... ???

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 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?
In the Future everyone will need OS-64!!!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #5 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... ???

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 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).
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 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?
Dieser Text wird unter jedem Beitrag angezeigt.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #8 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... ???

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #9 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.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #10 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

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #11 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.

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #12 am: 29. November 2005, 21:20 »
Es wäre unsicher den Stack von der Applikation vorgeben zu lassen.
*post*

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #13 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 ????

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #14 am: 30. November 2005, 11:23 »
hmmm... taüsch ich mich etwa da? Muss das EOI nich nach behandeln des IRQ gesendet werden ?
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #15 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.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 30. November 2005, 14:20 »
Vieviele Befehle mögen etwa noch herein, bis der nächste Timer generiert wird ?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #17 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 ?????

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #18 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.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #19 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

 

Einloggen