Autor Thema: Softwaremultitasking, aber wie?  (Gelesen 14267 mal)

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #20 am: 29. June 2006, 23:36 »
Intel Manual #2 unter popa (bei mir Seite 633):
Zitat
The value on the stack for the ESP or SP register is ignored. Instead, the ESP or SP register is incremented after each register is loaded.
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

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #21 am: 30. June 2006, 00:53 »
Zitat von: bluecode
Intel Manual #2 unter popa (bei mir Seite 633):
Zitat
The value on the stack for the ESP or SP register is ignored. Instead, the ESP or SP register is incremented after each register is loaded.
ou, stimmt
bei mir stehts im Assemblerbuch von Addison-Wesley auf Seite 97 auch:

popa mach folgendes:

pop (e)di
pop (e)si
pop (e)bp
add (e)sp, (4)2
pop (e)bx
pop (e)dx
pop (e)cx
pop (e)ax


Hmm... ich habe das zwar die ganze Zeit gelesen, aber wohl irgendwie nicht wahr genommen. ^^

Ich habs jetzt mit dem Softwaremultitasking geschaft. Der Kernel wird ausgeführt, dann wird zum IRQ0 gesprungen, der Führt dann zum Task, dann wird wieder der IRQ0 aufgerufen, der Führt wieder zum Kernel, dann wird wieder der IRQ0 aufgerufen, der Führt wieder zum Task usw.

Juhu, ich habs jetzt entlich kapiert und es funktioniert. Jetzt kommt aber wieder mein berühmtes - aber - ^^

Aber ich kapiere das nicht mit den: esp0, ss0, esp1, ss1, esp2 und ss2. Wozu sind die da? Jeder Task (auch der Kernel) hat bei mir einen neuen Stack. Brauchen die jetzt auch noch jeder 3 Stacks? Und wann soll ich die 0, 1 und 3 sachen denn nutzen?

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #22 am: 30. June 2006, 04:03 »
Zitat von: bitmaster
Aber ich kapiere das nicht mit den: esp0, ss0, esp1, ss1, esp2 und ss2. Wozu sind die da? Jeder Task (auch der Kernel) hat bei mir einen neuen Stack. Brauchen die jetzt auch noch jeder 3 Stacks? Und wann soll ich die 0, 1 und 3 sachen denn nutzen?

Ok stell dir vor, du würdest den Inahlt der Register auf dem normalen Stack einer App speichern, was könnte die dann ganz leicht machen? Genau, in den EFlags zB das PL ändern, oder das CS ändern. Das wären alles keine so tollen Sachen ;) Deshalb wechselt die CPU beim taskswitchen von CPL3 nach CPL0 automatisch den Stack und pusht da die alten Register (bei denen man nun SS3 und ESP3 sagt) SS3, ESP3, EFlags, CS, EIP.

Aber eigentlich ist das beim Hardware taskswitching auch nicht anders :wink:
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

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #23 am: 30. June 2006, 14:19 »
Zitat
Aber eigentlich ist das beim Hardware taskswitching auch nicht anders
Jo, da macht die CPU das ja alles von selbst (weshalb ich Hardwaretasking eigentlich auch inteligenter finde). Aber ich habe bis jetzt sowieso alles nur Privilegstufe Null. Ich muss mich da in der Materie noch mal einarbeiten.

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

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 30. June 2006, 14:39 »
Zitat von: bluecode
Ok stell dir vor, du würdest den Inahlt der Register auf dem normalen Stack einer App speichern, was könnte die dann ganz leicht machen? Genau, in den EFlags zB das PL ändern, oder das CS ändern. Das wären alles keine so tollen Sachen ;) Deshalb wechselt die CPU beim taskswitchen von CPL3 nach CPL0 automatisch den Stack und pusht da die alten Register (bei denen man nun SS3 und ESP3 sagt) SS3, ESP3, EFlags, CS, EIP.

Aber eigentlich ist das beim Hardware taskswitching auch nicht anders :wink:


Da kann ich nicht ganz zustimmen.

Wenn man den Stack des Programmes zum Speichern der Register benutzt dann passiert das alles in dieser Reihenfolge:

- Task läuft
- Task wird unterbrochen
- Register werden auf Taskstack gesichert
jetzt mach das OS was es will (z.B. Taskwechsel oder Bluescreen) ...
- Register werden vom Stack zurückgesichert
- Task wird fortgesetzt

Der Task hat also keine Möglichkeit die EFlags oder etwas andere zu verändern, weil er niemals ausgeführt wird wenn sich die Register auf dem Stack befinden.

ABER:
Ein voller Stack würde die Registersicherung eines Interruptaufrufes natürlich nicht mehr aufnehmen können.
Ungültige werte im SS oder ESP Register des Tasks sind auch möglich.

Deshalb besitzt jeder Ring einen eigenen Stack.
db 0x55AA

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #25 am: 30. June 2006, 18:08 »
Zitat von: Osbios
Der Task hat also keine Möglichkeit die EFlags oder etwas andere zu verändern, weil er niemals ausgeführt wird wenn sich die Register auf dem Stack befinden.

Da kann ich wiederum nicht zustimmen :-D Schonmal an Multithreading gedacht? Da könnte dann ein Thread die EFlags,etc. des anderen verändern.
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

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #26 am: 30. June 2006, 23:52 »
Zitat
Deshalb besitzt jeder Ring einen eigenen Stack.
Also was jetzt genau? Jeder Ring nur einen Stack? Also 3 Stacks, oder jeder Task 3 Stacks?

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #27 am: 01. July 2006, 03:15 »
Zitat von: bitmaster
Zitat
Deshalb besitzt jeder Ring einen eigenen Stack.

Also was jetzt genau? Jeder Ring nur einen Stack? Also 3 Stacks, oder jeder Task 3 Stacks?

Lass dich nicht unnötig verwirren: Benutz nur Ring 0 (Kernel) und Ring 3 (User). Dann brauchst du nen normalen User-Stack, nen Stack auf dem die Register gespeichert werden und evtl. (falls dein kernel viel stack verbraucht) auch noch nen eigenen kernel-stack. Das macht 2 stacks pro task + evtl. einen für den kernel (pro prozessor, falls du mehrere Prozessoren unterstützen willst)..
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

 

Einloggen