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

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« am: 29. June 2006, 16:12 »
Also ich muss mein OS kräftig umschreiben sonst ist es bald nicht mehr existens fähig. Die neueren CPUs (und der 64-bit Modus) unterstützen nämlich kein Hardwaremultitasking mehr. Jetzt steh ich doof da. Ich muss also zu Softwaremultitasking wechseln. Aber davon habe ich überhaubt keine Ahnung. Hat man dann kein TSS oder wie? Wie speichert man die Register und wo? Please help me!!!

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

scales of justice

  • Beiträge: 228
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 29. June 2006, 16:26 »
hmm? ich dachte immer der Prozessor emuliert das von alleine.
Sicher das der OS-Programmierer das machen muss?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 am: 29. June 2006, 17:20 »
Zitat von: scales of justice
hmm? ich dachte immer der Prozessor emuliert das von alleine.
Sicher das der OS-Programmierer das machen muss?

ROFLMAO  :lol:

Ne mal im ernst, du hast schon noch ein TSS benutzt es aber nichtmehr zum speichern der Register sondern nur noch, um SS0 und ESP0 bei Interupts zu bekommen. Evtl. hilf dir das tutorial von beyond infinity. Wenn nicht dann einfach fragen, was du nicht verstehst :)
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 #3 am: 29. June 2006, 17:23 »
Zitat von: scales of justice
hmm? ich dachte immer der Prozessor emuliert das von alleine.
Sicher das der OS-Programmierer das machen muss?
Ja, ich bin mir da ganz sicher. Im Intel Manual steht sogar drin, dass im 64-Bit Modus kein Hardwaremultitasking mehr möglich ist. Und der AMD64 kann das sogar im 32-Bit Modus nicht mehr (soweit ich weiß). Deswegen muss ich zu Softwaremultitasking wechseln, sonst ist mein OS nicht zufunftssicher. Hat einer 'ne Ahnung wie das mit Softwaremultitasking funktioniert?

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #4 am: 29. June 2006, 17:30 »
Zitat von: bitmaster
Hat einer 'ne Ahnung wie das mit Softwaremultitasking funktioniert?

Siehe mein Post, welches du mit Sicherheit überlesen hast :)
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

n3Ro

  • Beiträge: 288
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 29. June 2006, 17:36 »
Da die 64 Bit CPUs von AMD 100% abwärtskompatibel zu allen 32bit x86ern ist geht da natürlich auch noch Hardwaremultitasking in den "alten" Modi.
Softwaremultitasking funktioniert im Prinzip ganz einfach. Du rufst ja in Regelmäßigen Zeitabständen den Timerinterupt auf. Bei diesem wird im Stack CS:EIP,SS:ESP und eFlags abgelegt die beim IRET wieder ausgelesen werden. Wenn du nun vor dem IRET deine alten Register von Task A abgespeichert hast und die von Task B lädst und dabei auf deine Stackwerte umänderst, springst du beim IRET in deine Task B ;)
Agieren statt Konsumieren!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 am: 29. June 2006, 20:27 »
Aso, danke für die vielen Antworten. Also ich lade einmal mit ltr ein TSS und mehr habe ich dann auch nicht, oder wie? Und mein IRQ0 macht dann das oder wie? :

pusha
push ds
push es
push fs
push gs

kA was dann

pop gs
pop fs
pop es
pop ds
popa
iret


Aber dann habe ich doch die vorherigen Register wieder? Und wieso überhaubt dann ein TSS? Hmm... blick da nicht so ganz durch.

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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 29. June 2006, 20:32 »
Zitat von: bitmaster
Aber dann habe ich doch die vorherigen Register wieder?
Nicht, wenn du bei "kA was dann" den Stack wechselst. Das ist der Trick beim Softwaremultitasking.

Zitat
Und wieso überhaubt dann ein TSS? Hmm... blick da nicht so ganz durch.

Das TSS brauchst du für einen Privilegwechsel von Ring 3 nach Ring 0. (Die Schwierigkeit ist SS und CS gleichzeitig zu ändern.) Anders kommst du nicht in den Kernel.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 29. June 2006, 20:41 »
OK, also das mit den anderen Werten durch den anderen Stack verstehe ich jetzt. Aber wie wechsle ich denn den Stack? Und wie bekomme ich dann das neue CS?

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

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 29. June 2006, 20:49 »
Stack wechseln:
mov [alter_stack], esp
mov esp, [neuer_stack]


Das neue CS bekommst entweder durch einen far-jump oder bei einem Privilegwechsel durch ein iret.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #10 am: 29. June 2006, 20:53 »
Zitat von: PorkChicken
Stack wechseln:
mov [alter_stack], esp
mov esp, [neuer_stack]


Das neue CS bekommst entweder durch einen far-jump oder bei einem Privilegwechsel durch ein iret.
Hmm.. Also brauche ich nur sp und nicht ss ändern? Hä? Und muss also eine Zeichenkette voller Stackwerte von jedem Task haben? Und wenn ich einen Task starte muss ich auf seinem Stack vorher alle Werte für die Register draufpushen um nacher auch durch iret z.B. den cs und eip an der richtig Position zu haben?
In the Future everyone will need OS-64!!!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 29. June 2006, 20:57 »
Zitat von: bitmaster
Hmm.. Also brauche ich nur sp und nicht ss ändern? Hä?

Doch. Wenn du nicht sicherstellen kannst, dass deine Programme mit ss irgendwelchen Unfug machen, dann solltest du ss auch jedes mal ändern.

Zitat
Und muss also eine Zeichenkette voller Stackwerte von jedem Task haben?

Korrekt. Ich würds nicht Zeichenkette nennen, sondern Speicherbereich. Und das ist ja eigentlich nix besonderes, denn ich gehe mal davon aus, dass all deine Tasks irgendwie irgendwo eigenen Speicher haben.  ;)

Zitat
Und wenn ich einen Task starte muss ich auf seinem Stack vorher alle Werte für die Register draufpushen um nacher auch durch iret z.B. den cs und eip an der richtig Position zu haben?

Jupp, genau so geht es.
Dieser Text wird unter jedem Beitrag angezeigt.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #12 am: 29. June 2006, 21:05 »
Gut, das habe ich jetzt kapiert. Aber was meintest du mit schwer wenn der Ring gewechselt wird? In den Deskritoren der Segmente steht doch der Ring, das hat doch dann nichts mit dem Taskwechsel zu tun?

EDIT: Also so habe ich es bis jetzt verstanden:

;Task wechsel:
IRQ0:
cli
pusha
push ds
push es
push fs
push gs
mov eax,ss
mov [mem],eax
mov [mem],sp

mov eax,[mem]
mov ss,eax
mov sp,[mem]
mov al,20h
out 20h,al
pop fs
pop es
pop ds
popa
sti
iret

;[mem] ist jeweils ein anderer Speicherbereich!!!


Aber wenn ich jetzt einen Task zum aller ersten mal starte, dann holt der IRQ0 Werte vom Stack die ich aber noch nie gespeichert habe??? komisch, scheck gerade gar nichts mehr...
In the Future everyone will need OS-64!!!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #13 am: 29. June 2006, 21:41 »
So, ich speichere im IRQ0 die aktuellen Register. Wechsle dann den Stack. Hole dann vom Stack Werte zu Register. Nee, halt stop. In diesem Stack habe ich ja noch gar keine Register Werte. Was jetzt?
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #14 am: 29. June 2006, 21:57 »
Du musst beim erstellen eines neues Tasks den Stack so aufsetzten, dass es halt stimmt :) Eigentlich alles wie in dem tutorial das ich gepostet hab beschrieben.
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 #15 am: 29. June 2006, 22:43 »
Zitat von: bluecode
Du musst beim erstellen eines neues Tasks den Stack so aufsetzten, dass es halt stimmt :) Eigentlich alles wie in dem tutorial das ich gepostet hab beschrieben.
Aso, gut dann habe ich das jetzt glaube ich verstanden. Nur verstehe ich immer noch nicht wieso wir überhaubt ein TSS brauchen. Das ganze kann ich doch auch ohne TSS machen. Was meinst du mit ss0 und esp0?

Ach ja, und so tu ich einen Task für den ersten Start vorbereiten:

cli ;IRQ0 nicht aufrufen

push ss
push esp

mov eax,neuer Stack Selector
mov ss,eax
mov esp,neuer Stackpointer

push 0000001000000010b ;eflags
push 1 << 3 ;cs
push task1  ;eip
push 0 ;eax
push 0 ;ecx
push 0 ;edx
push 0 ;ebx
push ? ;esp was muss hier hin?
push 0 ;ebp
push 0 ;esi
push 0 ;edi
push 2 << 3 ;ds
push 2 << 3 ;es
push 2 << 3 ;fs
push 2 << 3 ;gs

pop esp
pop ss

sti ;jetzt kann der IRQ0 wieder aufgerufen werden



So, was muss ich bei push ? ;esp was muss hier hin? schreiben? Was muss bei dem ? hin? Weil da muss ja ein gültiger Wert hin, sonst ist esp ja kaput.

Ist das bis jetzt alles richtig?

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #16 am: 29. June 2006, 22:58 »
Zitat von: bitmaster
Nur verstehe ich immer noch nicht wieso wir überhaubt ein TSS brauchen. Das ganze kann ich doch auch ohne TSS machen. Was meinst du mit ss0 und esp0?

esp0/ss0 sind nur beim software-taskswitching mit änderung des Priviledgelevels wichtig, da soe dort aus dem TSS entnommen werden und eben als neues SS/ESP genommen werden (des is dann der ich nenns mal "kernel-level task stack"). Auf dem Stack werden dann des alte SS/ESP, die EFlags, CS/EIP gesichert, welche beim iret widerhergestellt werden.
Beim softwaretaskswitching ohne änderung des Priviledgelevels wird der Stack nicht gewechselt, sondern nur EFlags/CS/EIP auf dem Stack gesichert, welche auch beim iret wiederhergestellt werden.
Zusätzlich zu den bereits gesicherten Regs musst dann halt noch die Generalpurpose regs sichern.

Zitat von: bitmaster
So, was muss ich bei push ? ;esp was muss hier hin? schreiben? Was muss bei dem ? hin? Weil da muss ja ein gültiger Wert hin, sonst ist esp ja kaput.

Du musst das push esp weglassen, da bei pusha/popa esp nicht gesichert/wiederhergestellt wird (Das scheint in dem Tutorial falsch zu 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

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #17 am: 29. June 2006, 23:05 »
@bluecode: danke

aber:

Zitat
esp0/ss0 sind nur beim software-taskswitching mit änderung des Priviledgelevels wichtig, da soe dort aus dem TSS entnommen werden und eben als neues SS/ESP genommen werden (des is dann der ich nenns mal "kernel-level task stack").
Und woher weiß ich, wann ich die esp0/ss0 auslesen muss und wann nicht.

Zitat
Auf dem Stack werden dann des alte SS/ESP, die EFlags, CS/EIP gesichert, welche beim iret widerhergestellt werden.
iret läd aber ss und esp nicht. Sondern nur die EFlags, cs/eip.

Zitat
Zusätzlich zu den bereits gesicherten Regs musst dann halt noch die Generalpurpose regs sichern.
Was ist das?

Zitat
Du musst das push esp weglassen, da bei pusha/popa esp nicht gesichert/wiederhergestellt wird (Das scheint in dem Tutorial falsch zu sein...).
Doch, pusha und popa verändern auch das esp.

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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #18 am: 29. June 2006, 23:09 »
Zitat von: bitmaster
iret läd aber ss und esp nicht. Sondern nur die EFlags, cs/eip.

Doch genau das macht iret, wenn in den EFlags das PL != das PL von CS ist ;) Damit hat sich wohl auch die erste Frage erledigt

Zitat von: bitmaster
Zitat
Zusätzlich zu den bereits gesicherten Regs musst dann halt noch die Generalpurpose regs sichern.
Was ist das?

halt eax, ebx, ecx, edx (esi, edi, ebp)

Zitat von: bitmaster
Zitat
Du musst das push esp weglassen, da bei pusha/popa esp nicht gesichert/wiederhergestellt wird (Das scheint in dem Tutorial falsch zu sein...).
Doch, pusha und popa verändern auch das esp.

sry, habs grad auch nochma nachgeschaut. pusha sichert zwar esp, aber popa ignoriert den gepushten wert einfach => 0 setzten.
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 #19 am: 29. June 2006, 23:29 »
Zitat
sry, habs grad auch nochma nachgeschaut. pusha sichert zwar esp, aber popa ignoriert den gepushten wert einfach => 0 setzten.
Wie kommst du denn darauf?
In the Future everyone will need OS-64!!!

 

Einloggen