Autor Thema: Multitasking in meinem OS einbauen.  (Gelesen 25123 mal)

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« am: 03. December 2005, 19:23 »
Also ich habe demnächst vor, in meinem OS Multitasking einzubauen. Da gibt es je Kooperatives und präemptives. Kooperatives schließe ich schon mal aus, weil es unsicher ist und vieles nicht kann. Also werde ich präemptives Multitasking benutzen. Aber da gibt es so weit ich weis auch wieder zwei unterschiede. Einer nennt sich Softwaremultitasking und der andere Hardwaremultitasking. Ich glaube die Namen heißen so, weil ich beim Softwaremultitasking die ganzen Register selber (also meine Software) sichern muss. Beim Hardwaremultitasking wird dies automatisch gemacht. Also jetzt würde ich von euch gerne wissen was ihr mir empfehlen würden und warum. Welche Vor-/ oder Nachteile hat jeweils das andere gegenüber dem anderen. Aus Joachim Neumanns Tutorial werde ich ehrlich gesagt nicht so schlau. Also was würdet ihr mir empfehlen. Ich wäre auch dankbar für Links, Tutorials, Downloads etc.

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

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. December 2005, 19:39 »
Meiner Meinung nach ist Software Multitasking in allen Anwendungsbereichen besser als Hardwaretasking.

Vorteile:
-> Es ist schneller (Der Taskwechsel selber ist 3mal so schnell wie beim Hardwaretasking)
-> Man hat eine größere Kontrolle über den Taskswitch, man kann bestimmen, welche Register gespeichert werden usw. (Es ist z.B. unsinnig ss, es, ds, fs und gs zu speichern, wenn sie in einem flachen Speichermodell eh alle die selben Werte haben.)
-> Man kann es leichter erweitern. Speichern der FPU Register usw. lässt sich leicht einbauen.
-> Es ist leichter einzubauen. Man muss nicht an den TSS und Descriptor rumwerkeln, man braucht zwar immernoch ein TSS, das muss man aber nur einmal initialisieren und dann beim jedem Taskswitch den ESP im TSS ändern, das wars aber schon. Über dieses TSS kann man z.B. auch die IO Permission Bitmap nutzen, um einzelne Ports zu sperren usw.
-> Es ist portabler (x86-64 unterstützt z.B. kein Hardwaretasking mehr, andere Prozessoren enthalten es überhaupt nicht.)

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 03. December 2005, 19:55 »
Zitat von: SSJ7Gohan
-> Man hat eine größere Kontrolle über den Taskswitch, man kann bestimmen, welche Register gespeichert werden usw. (Es ist z.B. unsinnig ss, es, ds, fs und gs zu speichern, wenn sie in einem flachen Speichermodell eh alle die selben Werte haben.)

und ein prozess lädt dann ds mit 0 und freut sich wie die anderen prozesse abstürzen? die segmentregister sollte man schon speichern, oder zumindest bei jedem taskwechsel wieder auf einen gültigen wert setzen. dann kann man sie aber auch gleich sichern und neu laden ...

Zitat von: SSJ7Gohan
-> Man kann es leichter erweitern. Speichern der FPU Register usw. lässt sich leicht einbauen.

das speichern der fpu, sse, mmx, etc register ist beim software- und hardwaretaskswitching gleich, wenn ich mich nicht irre.

das killerargument ist aber die geschwindigkeit. software multitasking soll schneller sein. ob das stimmt weiss ich nicht und ich habe auch nie konkrete messergebnisse gesehen, aber plausibel klingts.
Dieser Text wird unter jedem Beitrag angezeigt.

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 03. December 2005, 21:27 »
Ja, man muss natürlich die Segmentregister wieder auf einen gültigen Wert setzen, aber warum auf den Speicher zugreifen, wenns auch schneller geht? Man muss ausserdem beachten, dass die Segmentregister in Ring0 anders sind usw. Trotzdem kann man mit Softwaretasking mehr beeinflussen, was man sicher und was nicht, man könnte etwa die Debugregister speichern usw.

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 03. December 2005, 21:29 »
Zitat von: PorkChicken
und ein prozess lädt dann ds mit 0 und freut sich wie die anderen prozesse abstürzen? die segmentregister sollte man schon speichern, oder zumindest bei jedem taskwechsel wieder auf einen gültigen wert setzen. dann kann man sie aber auch gleich sichern und neu laden ...

Wenn man ein Flatmodel benutzt sind die Register immer gleich! Egal welcher Task gerade läuft. Und um mögliche Veränderungen eines Tasks nicht mit in einen anderen zu übernehmen (z. B. gs=0) kann man sie, wie du ja selber sagst, jedesmal auf den Standardwert setzen.

Zitat von: PorkChicken
Zitat von: SSJ7Gohan
-> Man kann es leichter erweitern. Speichern der FPU Register usw. lässt sich leicht einbauen.

das speichern der fpu, sse, mmx, etc register ist beim software- und hardwaretaskswitching gleich, wenn ich mich nicht irre.

Stimmt! Wenn man es wie vorgesehen über IRQs macht ist das kein Unterschied.

Zitat von: PorkChicken
das killerargument ist aber die geschwindigkeit. software multitasking soll schneller sein. ob das stimmt weiss ich nicht und ich habe auch nie konkrete messergebnisse gesehen, aber plausibel klingts.

Da muss ich auch nicht ganz unrecht geben, jedoch hat es seine Gründe weshalb HT im Longmode nicht mehr unterstützt wird. Eine meiner Vermutungen ist die größere Freiheit für die Programmierer bei ST weshalb HT fast nicht genutzt wird.

PS: Kann mal jemand gute Beispiele für ein schnelleres ST posten? Also was für Optimierungen durch ST alle möglich sind.
db 0x55AA

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 03. December 2005, 21:38 »
Grundsätzlich ist (ich selbst habs noch nicht getestet) ein einfach Softwaretasking der Art:
pusha
mov [taskstack], esp
call scheduler
mov esp, [taskstack]
popa
iret

schon schneller als Hardwaretasking.

Man kann es aber noch optimieren, indem man nur benötigte Register pusht. Von pusha wird auch ESP und SS gepusht, was man aber nicht braucht, da es schon vom Interruptgate gesichert wird usw.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 am: 03. December 2005, 21:46 »
Also ihr meint das ich Softwaremultitasking benutzen soll. Gibt es keinen nachteil gegenüber dem Hardwaremultitasking? Weis man welches Windows/Linux benutzt? Also gut dann werde ich warscheinlich Softwaremultitasking benutzen. Kennt ihr noch Dokumente, Referenzen, Tutorials etc. wo so etwas - eventuell sogar mit Code - erklärt wird?

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

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 03. December 2005, 21:50 »
Linux und Windows nutzen beide Softwaremultitasking.
Legend hat mal ein Tutorial geschrieben, benutz mal die Suchfunktion^^

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #8 am: 03. December 2005, 22:16 »
Zitat von: SSJ7Gohan
Legend hat mal ein Tutorial geschrieben, benutz mal die Suchfunktion^^
Meinst du das hier? http://legendos.codingworld.net/tutorials/software_task_switching.html Es funktioniert leider nicht.
In the Future everyone will need OS-64!!!

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #9 am: 03. December 2005, 22:32 »
Zitat von: SSJ7Gohan
Linux und Windows nutzen beide Softwaremultitasking.


Ich dachte unter Softwaretasking könnte man z.B. keinen VM86-Mode verwenden. Aber Win kann trotzdem 16Bit-Anwendungen ausführen... Irgendwas ist da nicht korrekt.
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,...

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 03. December 2005, 23:23 »
Mit dem VM86 Mode hab ich mich noch nicht beschäftigt, aber soweit ich weiß muss man da nur EFLAGS ändern, was ja auch mit IRET möglich ist.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 04. December 2005, 00:43 »
Wie geht das denn, mit dem einzelnen TSS? Was wird da neugeladen?

Gruss
Noooooooooos

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 04. December 2005, 17:41 »
Man läd beim Starten des Kernels mit LTR einmalig das TSS. Danach trägt man vor jedem Taskswitch Ring0 ESP (und evt. Ring0 SS, wenn SS in verschiedenen Tasks anders ist, die meisten nutzen aber einen flachen Addressraum, daher ist das normalerweise nicht notwendig) in das TSS ein. Neugeladen wird da garnichts. Das TSS wird nur benötigt, damit bei einem Interrupt der Ring0 ESP richtig gesetzt wird.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 04. December 2005, 17:58 »
Also bei was für einem Interrupt. Timer ??? Fehler ???? Oder ein Intrerupt mittels "int" vom Programm aus ??? Muss dieses TSS irgendwie verlinkt mit anderen Deskriptoren usw. sein ???

Gruss
Nooooooooos

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #14 am: 04. December 2005, 18:12 »
Zitat von: bitmaster
Zitat von: SSJ7Gohan
Legend hat mal ein Tutorial geschrieben, benutz mal die Suchfunktion^^
Meinst du das hier? http://legendos.codingworld.net/tutorials/software_task_switching.html Es funktioniert leider nicht.


Ja, meine Seite zieht bald um. Der Vertrag für den Rootserver ist nun vorbei,  die meisten anderen hatten keine Lust mehr, da sie es nicht hinbekommen hatten zusammenzuarbeiten.

Ich nehme mal an das AMD Hardware TS aus dem Long Mode genommen hat da es nun mal auch in Software ging und man sich theoretisch Prozessorfunktionen sparen kann. Jetzt müsste eine CPU auch nur den Long Mode unterstützen, diese könnte dann ein paar Transistoren sparen. ;)
*post*

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 04. December 2005, 18:20 »
Bei jeder Art von Interrupt (wenn in der IDT ein Interrupt Gate eingetragen ist) wird folgendes gemacht:
-> Switch zu Ring0
-> Der Ring0 ESP wird aus dem TSS gelesen und der Ring3 ESP wird auf den neuen Stack gepushet
-> Ring0 SS wird aus dem TSS gelesen und der Ring3 SS wird auf den Stack gepushed
-> CS:EIP wird auf den Stack gepushet

Daher braucht man auch bei Softwaretasking ein TSS, man muss es aber nicht neuladen, es reicht, Ring0 ESP und SS zu ändern, wärend man das TSS geladen lässt. Die anderen Felder des TSS sind egal, man muss nur ein TSS erstellen, einen Descriptor dafür in die GDT eintragen und es dann mit LTR laden.

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 04. December 2005, 18:21 »
Zitat von: Legend
Ich nehme mal an das AMD Hardware TS aus dem Long Mode genommen hat da es nun mal auch in Software ging und man sich theoretisch Prozessorfunktionen sparen kann. Jetzt müsste eine CPU auch nur den Long Mode unterstützen, diese könnte dann ein paar Transistoren sparen. ;)

Sparen? Du vergisst den Abwärtskompatibilitätswahn von x86. ;)
db 0x55AA

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #17 am: 04. December 2005, 19:04 »
Deswegen habe ich theoretisch gesagt.
*post*

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 04. December 2005, 20:45 »
Dann wird bei iret das ganze umgekehrt gemacht oder ?????
Oder? , das  TSS wird dazu verwendet, um den Stack vom Task auch im höher privilegiertem Timer zu sichern ????? Korrigiert mich !!!!

Aber wäre es nicht sinnvoller/schneller gar kein "ltr" Befehl kein TSS .... zu benutzen. Denn man könnte ja einfach anfangs Timer den Stack vom Task nocheimal in "sp" laden und dann die Register sichern. Warum macht man das nicht ??????

Gruss
Noooooooooooos

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #19 am: 04. December 2005, 22:03 »
Bevor du irgend etwas laden kannst muss ich schon die Rücksprungaddresse gesichert werden.
*post*

 

Einloggen