Autor Thema: Frage zum Multitasking  (Gelesen 8971 mal)

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« am: 05. January 2007, 16:33 »
Ich hab Multitasking im mein OS eingebaut. Taskwechsel macht er auch, aber nur einmalt und zwar, weil keine Hardware Interrups mehr aufgerufen werden. Ich frag mich nämlich wie der Taskwechsel funktionieren soll, denn der Timer Interrup lauft nicht bis zum ende durch so kann ja auch nicht sti und die Daten vom Stack geholt werden, ich weis nicht, wie das zu lösen ist und noch eine andere Frage was muss im TSS für das EFlag stehen, da muss ja auch das IF (Interrup Enable Flag) gesetzt sein.
 :?

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. January 2007, 17:02 »
stell das sti einfach weiter vor und räum die daten vom stack

...
sti
add esp, 12          ; hier bin ich mir nicht ganz sicher
                     ; pusht ein int wirklich 32-bit für CS ?

jmp nextTask
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

FreakyPenguin

  • Administrator
  • Beiträge: 301
    • Profil anzeigen
    • toni.famkaufmann.info
Gespeichert
« Antwort #2 am: 05. January 2007, 17:06 »
Ja, ein Interrupt pusht ein dword, oder eher ein ausgerichtetes word.

Hier eine Beschreibung zum EFLAGS-Register: http://www.sandpile.org/ia32/eflags.htm

Soweit ich das sehe, musst du Bit9(bei 0 mit zählen beginnen) setzten

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 05. January 2007, 17:43 »
Mich irritiert aber, dass der Beispiel Code im Multitasking Tutorial die Daten nach dem Taskwechsel vom Stack holt. :?

; Daten des zu ladenden Tasks
MOV ESI,[tasking_current] ; Offset laden
ADD ESI,0x00000002 ; zur Deskriptornummer navigieren
LODSW ; Nummer in AX laden
POP ESI
PUSH EDI
MOV EDI, tss_switch_label ; Offset laden
ADD EDI,0x00000005 ; zum Operanten navigieren
STOSW ; neuen Wert eintragen
tss_switch_label:
JMP DWORD 0x1234:0x12345678 ; springen!
POP EDI
POP EAX

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 05. January 2007, 17:49 »
Ist das das Tutorial von Joachim Neu? Wenn ja, dann vergiss es.

Äh, dumme Frage aber hast du auch am EOI gedacht?

mov al,20h
out 20h,al

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

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 05. January 2007, 18:18 »
EOI hab ich gemacht.
Ist das Tutorial dann irgendwie falsch? :?

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 05. January 2007, 18:20 »
das mit dem pop nach dem jmp aufjedenfall (kann ja garnicht gehen  :roll:)
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #7 am: 05. January 2007, 18:25 »
@Hauke: Ja, und das habe ich Joachim Neu früher schon mal gesagt. Aber er meint bei ihm funktionierts und dann sei es richtig obwohl er es selber nicht ganz versteht. Hat mich beim Beginn vom Multitasking auch ganz schön iritiert. Vergess das Tutorial am besten.

Das behandelt meine ich Hardwaremultitasking, oder? Ich würde aber Softwaremultitasking nehmen, da z.B. der Longmode Hardwaremultitasking gar nicht mehr unterstützt.

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

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 05. January 2007, 19:07 »
Eine Frage was ist der Longmode? Und beim Hardware Multitasking braucht man doch nicht so viel machen und noch eine letzte Frage was muss ich ESP zuaddieren (um den Interrup Aufruf auszubügeln) 10 (0xA) oder 12?
EIP + CS + EFLAG = 10 bei mir. :?

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 05. January 2007, 19:21 »
Der Longmode ist der neuste Mode und mit dem PM zu vergleichen. Anstatt nur 32Bit kann man im Longmode jedoch 64-Bit adressieren und so grosse Register benutzen.

SoftwareMT ist dennoch einfacher. Dann musst du nicht mehr für jeden Task ein Eintrag in der GDT machen, dich nicht um die lästigen TSS kümmern und brauchst somit weniger Speicher. (Wobei das egal ist wenn du mit C proggst).

Du musst 12 nehmen. CS ist auch 32 Bit gross.

Doch M.Nemo, das mit dem POP geht. Die Register werden halt erst wieder zurückgesichert, wenn der Task nächstes Mal wieder dran kommt...Aber ansonsten ist das Tut wirklich blöd...Habs damit auch nicht hingekriegt...


Gruss
Nooooooooooooos

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #10 am: 05. January 2007, 21:36 »
@nooooooooos: Nja, der Longmode ist schon anders als der ProtectedMode und eher nicht zu vergleichen. Der Longmode erfordert Paging, die Basis von cs und ds sind immer Null und das Limit aller Segmente steht auf max. Das heißt also man kann nur mit Pagging einteilen. usw.

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

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 05. January 2007, 21:39 »
OK schlechter Vergleich...Allerdings haben hier sowiso alle schlauen OS einen flachen Adressraum mit Paging (weils sonst auch einfach zu unflexibel ist...)

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 06. January 2007, 15:10 »
Doch M.Nemo, das mit dem POP geht. Die Register werden halt erst wieder zurückgesichert, wenn der Task nächstes Mal wieder dran kommt...Aber ansonsten ist das Tut wirklich blöd...Habs damit auch nicht hingekriegt...

 :oops: ja hab nicht dran gedacht das der jmp befehl ja kein normales jmp ist sondern ein Taskswitch  :oops:
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 06. January 2007, 19:37 »
Allerdings haben hier sowiso alle schlauen OS einen flachen Adressraum mit Paging (weils sonst auch einfach zu unflexibel ist...)
OS/2 hatte keinen.
In meinem Buch (Modern Operating Systems) wird das auch beschrieben, Segmentierung ist gut, wenn man den Adressraum "sauber" halten will. Mit Paging alleine wachsen gewisse Teile (Data+Stack) u.U. "ineinander" und überschreiben sich dabei. Mit getrennten Segmenten passiert das nicht.

Paging selbst hilft da nicht, weil du ja trotzdem nur einen Adressraum hast und dementsprechend vorher wissen musst, wie sich die einzelnen dynamisch wachsenden Teile des Codes in etwa verhalten. Die Segmente selbst kannst du natürlich auch pagen und hast dann keine Probleme mit dem physikalischen Adressraum. Aber wie gesagt - eins von beidem reicht auch aus (Seg -> OS/1.x ; Seg+Pag -> OS/2 2.x+ ; Pag -> Win/Lin).

Gruß,
Sebastian

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #14 am: 06. January 2007, 19:53 »
Mit Paging alleine wachsen gewisse Teile (Data+Stack) u.U. "ineinander" und überschreiben sich dabei. Mit getrennten Segmenten passiert das nicht.
Wenn Daten und Stack ineinanderwachsen, dann ist wohl eher der Adressraum zu klein und da hilft dann auch Segmentierung nicht. btw. bei Segmentierung muss der Speicher eines Segments kontinuierlich im Adressraum liegen, dass dürfte wohl der größte Nachteil sein.
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

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 06. January 2007, 20:13 »
Wenn Daten und Stack ineinanderwachsen, dann ist wohl eher der Adressraum zu klein und da hilft dann auch Segmentierung nicht.
Es hängt davon ab, wie du den Adressraum eines Prozesses verwaltest. Wenn du von "klein" ausgehst und ihn dynamisch wachsen lässt, hast du ohne Segmente bei speicherintensiven Prozessen ein Problem. Wenn du von "groß" ausgehst, kommst du ohne Paging nicht aus.

Zitat
btw. bei Segmentierung muss der Speicher eines Segments kontinuierlich im Adressraum liegen, dass dürfte wohl der größte Nachteil sein.
Wenn du Segmente pagest, braucht auch nicht das gesamte Segment im Speicher sein, auch nicht kontinuierlich, weil du ja dann auch die Segmente in Pages aufteilst und dort wieder virtuelle Adressen entstehen.

Gruß,
Svenska

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #16 am: 06. January 2007, 20:34 »
Wenn du Segmente pagest, braucht auch nicht das gesamte Segment im Speicher sein, auch nicht kontinuierlich, weil du ja dann auch die Segmente in Pages aufteilst und dort wieder virtuelle Adressen entstehen.
Achso, du hast von Segmentation + Paging gesprochen :wink: Das ist natürlich was anderes. Aber Segmentation alleine ist Blödsinn.
btw. der kernel kann auch ohne Segmentation feststellen, dass stack & heap ineinanderwachsen ;) und portabler ist es sowieso ohne Segmentation
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

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 06. January 2007, 20:48 »
Mit Segmentierung können stack & heap nicht ineinanderwachsen. :) Die Feststellung brauchst du nur ohne Segmentierung. Der 286er konnte noch kein Paging (sollte aber inzwischen nicht mehr relevant sein, zudem bei meinem Laptop das Display durchgebrannt ist).

Was ich damit sagen wollte: Segmentierung hat Vorteile (eben verschiedene virtuelle Adressräume innerhalb eines Prozesses) und wurde benutzt. Auch, wenn es inzwischen nicht mehr verwendet wird.

Naja, meine eigene CPU wird ohnehin Bankswitching betreiben, da brauch ich mich nicht darum kümmern. Die Architektur nimmt langsam Züge an. :)

Gruß,
Svenska

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 08. January 2007, 16:32 »
Es funktionier jetzt da war nur eine dumme keine blöde Adresse falsch, er hat immer denselben Task geladen, geht ja nicht. Und das mit dem Stack ist egal, weil ESP und SS beim Taskstart und Taskwechsel neu geladen werden.
Trotzdem Danke. :-)

 

Einloggen