Autor Thema: Hardware-Multitasking-wie?  (Gelesen 5444 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« am: 01. December 2005, 17:39 »
Hi,

ich bin gerade dabei Multitasking in meinem OS zu integrieren. Aber irgenwie habe ich das nicht so richtig verstanden. Ich möchte als Test einfach nur drei verschiedene Tasks verwenden. Diese sollen halt gleichzeitig bzw. nebeneinander (halt Multitasking) laufen. Aber ich verstehe das mit dem IRQ0, Tss, usw. nicht. Also ich habe drei TS-Deskritoren in der GDT. Diese zeigen auf ein TSS-Segement. Dann habe ich eine Tabelle von 3*6 Byte. Dort steht die Task-ID, TSS-Deskritprnummer in der GDT, und der Status des Task. Aber weiter komme ich nicht. Mit ltr muss ich ja den aktuellen Task laden. Als parameter muss ich ein Selektor angeben der auf einen TS-Deskriptor zeigt der auf ein TSS-Segment zeigt. In diesem TSS-Segment steht der aktuelle CS. Aber auf was muss ich IP setzten? Auf der adresse unter dem ltr Befehl? DS und ES habe ich auf das aktuelle Datensegment gesetzt. Dann setzte ich die Adresse für den IRQ0. Dort muss doch dann der Code stehen der die Task wechselt oder? Mit jump muss ich dann auf ein TS-Deskriptor springen. Aber wie komme ich dann nach der ausführen das Task zurück unter dem jump? Ich muss dann ja ein EOI senden (mov al,20h out 20h,al). Also ich verstehe das nicht so ganz. Im IRQ0 Muss Code stehen der den Task-Wechsel ausführt oder nicht? Aber wie komme ich nach dem jump wieder zurück. Und wie lange wird der Task auf dem jump zeigt dann ausgeführt? Ich grübbele schon so lange. Ich verstehe das nicht. Hoffentlich kann einer von euch mir helfen. Bitte.

Danke!!!
In the Future everyone will need OS-64!!!

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. December 2005, 17:46 »
joachim_neu hat für Lowlevel 7 ein Tutorial über Hardware Multitasking geschrieben. Das scheint relativ brauchbar zu sein und enrhält eigentlich alles was man für einen Task-Wechsel braucht.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #2 am: 01. December 2005, 17:50 »
Zitat von: DarkThing
joachim_neu hat für Lowlevel 7 ein Tutorial über Hardware Multitasking geschrieben. Das scheint relativ brauchbar zu sein und enrhält eigentlich alles was man für einen Task-Wechsel braucht.
Ja, aber das doofe ist ja das ich dies nicht verstehe. Ich verstehe nicht wie man unter dem jump kommt der ein Task aufruft. Dann wird ja der Code des Tasks aufgerufen. Ja und weiter? Woher weis das OS das es irgenwann unter dem jump muss. Hiiiiillllfffeee!!!
In the Future everyone will need OS-64!!!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 01. December 2005, 17:56 »
Dieses Problem hatte ich grad gestern auch und JN hat ein kleines Bild füt mich gezeichnet:



Denn wenn das Multitasking einmal alle Tasks durch hat, dann springt es ja zu der Adresse unter dem "jmp neuer_task" im Timer-Interrupt, dann wird das EOI gesendet und mittels IRET wieder zum "richtigen" Task gewechselt, bis dann wieder der Timer-Interrupt aufgerufen wird.

Gruss
Noooooooos

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 01. December 2005, 18:00 »
Ja, das Bild habe ich auch bekommen. Wie wenn es alle Task durch hat? Mit jump wird doch zu einem Task gesprungen. Der wird dann ausgeführt. Und weiter?
In the Future everyone will need OS-64!!!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 01. December 2005, 18:06 »
Also, wir sind im Task1, dann wird der Timer-Interrupt aufgerufen, der springt zum TSS des zweiten Tasks. Durch einen solchen jmp wird die jetztige Position (die ist ein Befehl nach dem jmp) automatisch mitgespeichert. Wenn der jmp gemacht ist wird Task2 ausgeführt. Dort wird gearbeitet bis der Timer-Interrupt unterbricht und zu Task3 springt. Wenn nun der Timer-Interrupt von Task3 wieder zu Task1 springt, dann lädt der Computer die Adresse aus dem TaskSegment, welche wir ja agespeichert haben und unmittelbar nach dem ersten Task-Jump (also im Interrupt) liegt. Dort wird dann das EOI gesendet.

Allerdings funzt bei mir das ganze auch noch nicht, aber es gibt einige die sagen, dass Software-Multitasking einfacher und schneller sei.

Gruss
Nooooooos

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 am: 01. December 2005, 18:11 »
Aber dann würde der IRQ0 3-mal aufgerufen und nur 1mal ein EOI gesendet oder nicht?
In the Future everyone will need OS-64!!!

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 01. December 2005, 18:18 »
Ja eben genau diesen Punkt check ich auch nicht ganz, muss mal JN fragen oder Software-MT ausprobieren.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 01. December 2005, 18:24 »
Schade, also ich möchte auf jeden Fall Hardwaremultitasking verwenden, da es viel sicherer ist und alles nutzen kann. Aber danke für deine Hilfe.

Wisst ihr anderen mehr?

Danke!!!
In the Future everyone will need OS-64!!!

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 01. December 2005, 19:16 »
Zitat von: bitmaster
Schade, also ich möchte auf jeden Fall Hardwaremultitasking verwenden, da es viel sicherer ist und alles nutzen kann. Aber danke für deine Hilfe.

Wisst ihr anderen mehr?

Also, das vermutlich am meisten benutzte Tasking, ist das mittels eines TSS. Dabei wird das TSS benötigt um in den Ring 3 zu gelangen und Ports, sowie Speicherbereiche zu sperren. Bei einer Unterbrechung des Timer-IRQs müssen dann alle relevanten Taskdaten (Register...) vom Programmierer selber gespeichert und die des neuen Task geladen werden. Bei Hardwaretasking übernimmt die Hardware diese Arbeit des speichern und ladens. Aber das HT hatte ein paar Nachteile, weiß nur nicht mehr welche.

Und ich weiß jetzt nicht was man in der Software Variante mit TSS nicht machen könnte was man im HT macht.
db 0x55AA

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 01. December 2005, 19:53 »
Software Multitasking ist genauso sicher wie das TSS und bietet auch alle Möglichkeiten, die mir grad einfallen, wie Ring3 Tasks, Blocken einzelner Ports usw.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #11 am: 01. December 2005, 19:58 »
Zitat von: SSJ7Gohan
Software Multitasking ist genauso sicher wie das TSS und bietet auch alle Möglichkeiten, die mir grad einfallen, wie Ring3 Tasks, Blocken einzelner Ports usw.
Okay, okay, aber ich möchte trotzdem Hardwaremultitasking benutzen.
In the Future everyone will need OS-64!!!

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #12 am: 27. December 2005, 22:35 »
Zitat von: bitmaster
Aber dann würde der IRQ0 3-mal aufgerufen und nur 1mal ein EOI gesendet oder nicht?


Wieso das? Das ist doch ein perfekter Kreislauf zwischen den Programmcodes, die durch IRQs unterbrochen werden, die dann zu der Stelle des anderen Tasks springen, wo sie das letzte Mal unterbrochen wurden (vor dem EOI) und dort dann den EOI senden und dann gehts wieder zum Programmcode. Bei mir funktioniert das. Ich kann auch während des MultiTaskings Eingaben der Tastatur und den FDC bearbeiten.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #13 am: 28. December 2005, 02:39 »
Zitat von: joachim_neu
Zitat von: bitmaster
Aber dann würde der IRQ0 3-mal aufgerufen und nur 1mal ein EOI gesendet oder nicht?


Wieso das? Das ist doch ein perfekter Kreislauf zwischen den Programmcodes, die durch IRQs unterbrochen werden, die dann zu der Stelle des anderen Tasks springen, wo sie das letzte Mal unterbrochen wurden (vor dem EOI) und dort dann den EOI senden und dann gehts wieder zum Programmcode. Bei mir funktioniert das. Ich kann auch während des MultiTaskings Eingaben der Tastatur und den FDC bearbeiten.
Das ist komisch das es funktioniert. Denn wenn du mal an den Anfang denkst. Du weisst ja das du jetzt im Kernel bist. Dann übergibst du dem tr mit ltr das aktuelle taskstateselektor (blöd ausgedrükt aber ihr wisst was ich mein). Dann wird der IRQ0 aufgerufen der aber bei dir kein eigener Task ist. Du befindest dich also immer noch im ersten (Kernel) Task. Jetzt springst du auf ein anderes Task. Der andere Task wird jetzt eine gewisse Zeit ausgeführt. Dann wird wieder der IRQ0 aufgerufen. Jetzt wird erst das EOI aufgerufen. Also hast du den IRQ0 einmal aufgerufen ohne einen EOI gesendet zu haben. Das verstehe ich nicht ganz. Deswegen habe ich es auch anders gemacht (IRQ0 eigener Task und ptl manipulieren). Ich möchte meinen Code nämlich verstehen. ;) Ich weiß wirklich nicht warum das funktioniert. Aber OK wenns klappt. War für mich halt nur verwirrent als ich mit Multitasking angefangen habe.

bitmaster
In the Future everyone will need OS-64!!!

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #14 am: 28. December 2005, 10:54 »
Verstehe, was du meinst. Du könntest auch einfach vor den eigendlichen Task einen Code zum EOI schreiben und etwas weiter vorne anfangen. Das müsste auch gehen.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

 

Einloggen