Autor Thema: Task-Wechsel und die FPU  (Gelesen 15648 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« am: 24. December 2006, 19:03 »
Hi,

ich möchte jetzt endlich mal FPU-Programmierung in meinem OS ermöglichen. Aber dazu müssen ja die FPU-Register bei einem Task-Wechsel gespeichert und geladen werden. Wie genau macht ihr das in eurem OS? Ach ja, die xmms Register müssen ja auch gespeichert werden. Aber wie genau sollte man das realisieren bzw. wie habt ihr das gemacht?

thx

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

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 24. December 2006, 20:27 »
Jo, gibt nen Bit, dass die CPU dazu veranlasst, einen Interrupt bei der nächsten Benutzung eines FPU/MMX oder was auch immer die Register nutzt auszuführen. Da kannst du dann die Register speichern.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #2 am: 25. December 2006, 00:39 »
Wenn du nur den 64bit modus unterstützt brauchst du die fpu register nicht speichern, da es iirc im richtigen 64bit longmode nur die SSE Befehle gibt (und nichtmehr die alten FPU Befehle und Register).
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

bbl

  • Beiträge: 13
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 25. December 2006, 09:03 »
Ich glaub das stimmt so nicht bluecode.

Die FPU Befehle sind im Longmode vorhanden, wenn bit 29 in CPUID Funktion 0x80000001 gesetzt ist (AMD Prozessoren - AMD Manual rev 3.07 volume 7 page 211) - Intel weiß ich grad nicht.
Außerdem, da greifen MMX und SSE Befehle teilweise auf auf die FPU Register zu.
Weiterhin gäbe es keine Möglichkeit mehr mit direkter Prozessorunterstützung sinus, cosinus, tangens, ... berechnen. Jeder müsste dann dazu den Taylor Algorithmus (ich glaub so heißt der) implementieren um die zu berechnen.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 25. December 2006, 12:43 »
übrigens was mir gerade so einfällt du könntest auch bei jedem Task Switch die FPU Register (und ev. auch XMM Register) am Stack speichern  :wink:

lg,

Toaster
jo, aber wie?

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

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #5 am: 25. December 2006, 16:03 »
@T0ast3r: Oh, cool. Ich wusste gat nicht das es dafüt Befehle gibt.

thx

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

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 25. December 2006, 16:07 »
Das ist aber extrem langsam da nur sehr wenige Threads/Tasks gleichzeitig FPU Befehle nutzen. Setzen des Bits und Sichern im Interrupt Handler ist wesentlich schneller.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #7 am: 26. December 2006, 22:24 »
@Korona: OK, aber wann genau wird der Interrupt aufgerufen?

thx

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

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 26. December 2006, 22:59 »
Ich habe jetzt meine Implementierung nicht mehr im Kopf und gerade keinen Zugriff auf die Intel Manuals, aber im PM Mode Tutorial steht folgendes:

Zitat
TS = Task Switched
Dieses Bit wird von Prozessor automatisch bei jedem Taskwechsel gesetzt. Dadurch soll ermöglich werden,
das MMX- und SSE-Register erst dann gesichert werden müssen, sofern der neue Task auch Befehle benutzt, die
diese Register verändert. Sobald ein solcher Befehl ausgeführt wird, prüft der Prozessor ob das Bit gesetzt ist.
Wenn das der Fall ist, wird eine Exception ausgelöst, die es dem Betriebssystem dann ermöglicht die Register zu
sichern.
Demnach musst du das Bit beim Taskswitch setzen (ich gehe davon aus, dass du Software Tasking benutzt, beim Hardware Tasking sollte das automatisch passieren) und dann im Interrupt Handler #16 die Register mit fsave bzw. fxsave sichern.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #9 am: 26. December 2006, 23:17 »
Also ich verwende Softwaremultitasking (Hardwaremultitasking gibt es im 64 Bit mode nicht mehr).

Aber das mit dem TS habe ich noch nicht kapiert. Also ich setze bei jedem Taskwechsel das TS Bit. Und was habe ich dann davon? Wann wird es gelöscht und wenn ich bei jedem Taskwechsel das TS Bit setze, woher weiß ich dann ob die FPU benutzt wurde?  :?

thx

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

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 26. December 2006, 23:30 »
Disclaimer: Ich hab das noch nie benutzt, aber ich interpretiere einfach mal die obigen Posts für dich. ;)

wenn ich bei jedem Taskwechsel das TS Bit setze, woher weiß ich dann ob die FPU benutzt wurde?  :?
Wenn du eine Exception bekommen hast, wurde die FPU benutzt.

Zitat
Wann wird es gelöscht
Ich hätte jetzt gesagt, am sinnvollsten im Exception Handler, nachdem du die alten Werte gesichert hast. Zusammen mit dem Setzen beim Taskwechsel bekommst du dann genau beim ersten FPU-Aufruf nach einem Taskwechsel eine Exception, in der du den alten Inhalt sichern und die richtigen Werte laden kannst.

So klingt das für mich jedenfalls schlüssig, aber vielleicht hab ich auch was falsch verstanden.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #11 am: 27. December 2006, 12:39 »
Das heißt wenn ich das TS Bit setze wird nach einem FPU Befehl ein IRQ ausgelöst? Und was ist wenn mehr als 1 FPU Befehl aufgerufen wird? Wird bei jedem FPU Befehl ein IRQ aufgerufen?

thx

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

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 27. December 2006, 16:51 »
Nachdem die Register gesichert sind kannst du das Bit ja einfach wieder auf 0 setzen.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #13 am: 27. December 2006, 17:36 »
Also dann verstehe ich den Sinn des TS Bit nicht ganz.

Also wann genau wird der FPU IRQ aufgerufen? Wann muss ich das TS setzten, wann löschen und wann den Inhalt der Register speichern?

*verwirrt*

bitmaster


EDIT: Vielleicht hat jemand von euch ein gutes Tutorial über FPU (google hilft mir irgendwie nicht)???
« Letzte Änderung: 27. December 2006, 17:47 von bitmaster »
In the Future everyone will need OS-64!!!

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 27. December 2006, 19:08 »
Bei jedem Taskswitch setzt du das Bit. Wenn das Bit gesetzt ist, wird immer wenn du einen FPU Befehl nutzt die Exception (Nummer 7) ausgelöst. Wenn diese Exception ausgelöst wird, löschst du das Bit wieder. Falls ein anderer Task/Thread als der aktuelle die FPU Register zuletzt benutzt hat, musst du jetzt die FPU Register speichern und die FPU Register des aktuellen Tasks wieder laden.

Also:
Bei jedem Taskwechsel: Bit setzen
Wenn die Exception 7 ausgelöst wird: Bit löschen.
-> Wenn FPU_REGISTER_TASK != AKTUELLER_TASK
----> Aktueller Inhalt der FPU gehört zu nem anderen Task ergo: Register für den anderen Task speichern, Register für den aktuellen Task laden
----> FPU_REGISTER_TASK = AKTUELLER_TASK

EDIT: Hm, ich habe mal mein OS wieder rausgekramt und mir die Implementierung angeguckt. Ich könnte dir C Beispielcode dafür geben, eigentlich ist das aber sauleicht und das kannst du auch ohne Beispielcode schaffen denke ich :D.
« Letzte Änderung: 27. December 2006, 19:11 von Korona »

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #15 am: 27. December 2006, 19:32 »
@Korona: OK, vielen dank.

Zitat
Ich könnte dir C Beispielcode dafür geben
Nee lass mal, C verwirt mich nur.

Ich hab jetzt auch was gefunden:

Zitat
Performance Considerations. When system software supports multitasking,
it must be able to save the processor state for one task
and load the state for another. For performance reasons, the
media and/or x87 processor state is usually saved and loaded
only when necessary. System software can save and load this
state at the time a task switch occurs. However, if the new task
does not use the state, loading the state is unnecessary and
reduces performance.
The task-switch bit (CR0.TS) is provided as a lazy contextswitch
mechanism that allows system software to save and load
the processor state only when necessary. When CR0.TS=1, a
device-not-available exception (#NM) occurs when an attempt
is made to execute a 128-bit media, 64-bit media, or x87
instruction. System software can use the #NM exception
handler to save the state of the previous task, and restore the
state of the current task. Before returning from the exception
handler to the media or x87 instruction, system software must
clear CR0.TS to 0 to allow the instruction to be executed. Using
this approach, the processor state is saved only when the
registers are used.
In legacy mode, the hardware task-switch mechanism sets
CR0.TS=1 during a task switch (see “Task Switched (TS) Bit” on
page 54 for more information). In long mode, the hardware taskswitching
is not supported, and the CR0.TS bit is not set by the
processor. Instead, the architecture assumes that system
software handles all task-switching and state-saving functions.
If CR0.TS is to be used in long mode for controlling the save and
restore of media or x87 state, system software must set and
clear it explicitly.

Aber ich habe noch eine blöde Frage. Was ist der Unterschied zwischen ST0 - ST7 und FPR0 - FPR7?

Wenn ich FXSAVE und FXRSTOR benutze dann brauch ich doch die anderen fblablasave fblablastor nicht, oder?

thx

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

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 27. December 2006, 19:40 »
FXSAVE und FXRSTOR speichern auch die SSE Register mit, sie speichern also mehr Daten als FNSAVE. (und brauchen daher AFAIK auch 512 Byte) Auf älteren Prozessoren sind sie nicht verfügbar, da es damals kein SSE gab, das dürfte für dein x64 OS aber egal sein xD.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #17 am: 27. December 2006, 20:44 »
Moment mal, habe ich wirklich alles richtig verstanden *selbstfrag* ? Wann genau wird der IRQ ausgelöst? Bevor der erste FPU Befehl ausgeführt wird oder danach?

thx

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

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 27. December 2006, 22:07 »
Bevor :D
Das ist kein IRQ sondern eine Exception ^^.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #19 am: 27. December 2006, 22:21 »
Bevor :D
Das ist kein IRQ sondern eine Exception ^^.
:oops:,

thx

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

 

Einloggen