Autor Thema: Frage zu Multitasking  (Gelesen 6548 mal)

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« am: 12. October 2005, 22:06 »
Ich hab versucht Multitasking in mein OS einzubauen, aber das hat bis jetzt noch nicht richtig Funktioniert. Deswegen habe ich eine Frage zum starten des Multitasking Vorgang. Dazu habe ich gelesen dieses man dies mit diesem Befehl ltr [Adresse] macht. (Oder geht es ganz Anders?)
Im Protected Mode Tutorial von TeeJay ist dazu dieses Register aufgelistet, welche Inhalte ich nicht ganz verstehe.Und das Ziel der Adresse sein soll.

TR (Bits)
---------------------------------------------------------------
|    Selektor 15-0    |     Deskriptor 8 Byte (Versteck)      |
---------------------------------------------------------------

Meine Fragen dazu sind:
Welcher Selektor ist gemeint? (Vom TSS-Deskriptor oder ein anderen?)
Was ist mit „Deskriptor 8 Byte (Versteck)“ gemeint? Die Adresse von einem Deskriptor und von welchem Deskriptor? (Von einem TSS-Deskriptor):?:

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 12. October 2005, 22:09 »
ltr läd ein TSS, soweit ich mich errinnern kann, wird es so benutzt:
mov ax, <TSS_DESCRIPTOR_NUMMER>
ltr ax

Dadurch wird dann in das Task Register der Selektor sowie der Descriptor geladen, auf den Descriptor kann der Programmierer aber nicht zugreifen bzw. man bemerkt ihn garnicht (er ist halt versteckt im register ^^)

maumo

  • Beiträge: 182
    • Profil anzeigen
    • http://maumo.50webs.com/
Gespeichert
« Antwort #2 am: 17. October 2005, 13:15 »
ltr läd kein TSS, sondern läd das TaskRegister mit einem Selector. Dieses gibt nur an, in welches bei einem TaskSwitch der CPU inhalt geladen werden soll. Dadurch startest du keinesfalls Multitasking.
Starten könntest du es, indem du den Timer als TaskGate definierst und dann vor dem IRet im TSS des Timers das Backlink auf den nächsten Task legst

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #3 am: 17. October 2005, 15:11 »
Zitat von: maumo
ltr läd kein TSS, sondern läd das TaskRegister mit einem Selector.

Und den dazugehörigen Deskriptor.
Zitat von: maumo
Dadurch startest du keinesfalls Multitasking.

Es ist aber ein großer Bestandteil davon.
Zitat von: maumo
Starten könntest du es, indem du den Timer als TaskGate definierst und dann vor dem IRet im TSS des Timers das Backlink auf den nächsten Task legst

Oder du einfach nur das nächste TSS durch einen Jump anspringst, was weit einfacher ist. ;)
Oder aber, das ist noch einfacher, du aktivierst einfach den Timer, der immer das neue TSS anspringt, und dadurch wird der Kreislauf in Gang gesetzt.
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,...

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 20. October 2005, 15:32 »
Es funktioniert jetzt fast, aber wenn ich es in Bochs simuliere, wird eine Fehler Meldung ausgegeben (mit Absturz). Der Fehler tritt beim Taskwechsel auf.
[CPU0 ] fetch_raw_descriptor: LDTR.valid=0
Was bedeutet diese Fehler Meldung? :?:

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #5 am: 20. October 2005, 18:48 »
Also wenn das beim LTR passiert ist wohl dein Deskriptor in der GDT fehlerhaft.
*post*

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 20. October 2005, 19:19 »
Hier ist meine Deskriptor in der GDT  (5. Des)

tss1ds:
dw 0x68
dw tss1
db 1,10001001b
dw 0

und die tss
tss1:
dd 0
dd 0x2FFFFF
dw 10000b,0
dd 0x3FFFFF
dw 10000b,0
dd 0x4FFFFF
dw 10000b,0
dd 0
dd g+0x10000 ;EIP
dd 0x90200
times 4 dd 0
dd 0x5fffff
times 3 dd 0
dw 8,0
dw 4,0
times 4 dw 8,0
dw 0,0
dd 0

Die anderen beiden Tabellen sind fast identisch.
Adresse ist ab 0x10000.
Ich find aber keinen Fehler in den Tabellen. :?

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 29. October 2005, 13:50 »
Da keine antwort gekommen ist nehme ich an, dass in den Tabellen keine Fehler enthalten sind somit glaub ich, dass der Fehler im IRQ 0 (Timer Interrupt) ist. Und so sieht er aus: (und wichtige Zusätze)

tss_tabele:
dw 0,0x28,0
dw 1,0x30,0

start:


;MULTITASKING ZUWEISUNGEN ANFANG
mov eax, cs
shl eax, 4

add eax, g ;Dauerschleife
mov [tss1+32],eax
mov [tss2+32],eax



mov [tasking_end], word start
mov [tasking_current], word tss_tabele

;MULTITASKING ZUWEISUNGEN  ENDE



IRQ_32:
pushad
push ds
cli
mov al, 0x20 ;EOI-Wert in AL ablegen
out 0x20, al ;EOI an Master-PIC senden

mov ax, 2
shl ax, 3
mov ds, ax
mov al, [status+0x10000]
and al, 1 ;Multitasking ?
jz nicht_mt
;task wechsel anfang
push eax
push esi
add dword [tasking_current], 6 ;wert des aktuellen Tasks überspringen
mov esi, [tasking_end] ;task-Tabelle-Ende laden
cmp esi, [tasking_current] ;mit Position des zu ladenden Tasks vergleichen
jne scheduler_no_resetting ;falls nicht gleich, also das Ende noch nicht erreicht ist springen
mov dword [tasking_current], tss_tabele  ;Wie am Anfang
scheduler_no_resetting:
; hier haben wir in "Tasking_current" die Adresse der Daten des zu ladenen Tasks
mov esi, [tasking_current+0x10000]
add esi, 2
lodsw
pop esi

push edi
mov edi,tss_switch_label
add edi, 5
stosw
tss_switch_label:
jmp dword 0x1234:0x12345678
pop edi
pop eax
;taskwechsel ende
nicht_mt:
sti
pop ds
popad
iretd


Der erste Bit in der Variable „status“ ist dazu dar, um Multitasking ein und auszuschalten.
Zu der Adressierung von status habe ich noch eine Frage ist die Adressierung so richtig, wenn der Code bei 0x10000 im Speicher ist, aber der Daten Desc. von 0 bis 4GB geht.:?:

Was mich beim Taskwechsel verwirt ist der Code nach „tss_switch_label“ also der Jmp befehl im Tutorial zum Multitasking seht er so da. Hab ich dies vielleicht falsch interpretiert? :?:

 

Einloggen