Autor Thema: Problem mit Far Jump beim Multi Tasking  (Gelesen 3429 mal)

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« am: 22. December 2005, 18:01 »
Ich habe Multi Tasking versucht zum Lauf zu bringen. Klappte nicht, daraufhin habe ich es nur mit dem Far Jump ausprobiert und Exception 13. Meine TSS und deren Deskriptor mehrfach nach  Fehlern durchsucht, aber irgendein Fehler muss drinnen sein, doch ich find ihn nicht.

Hier sind der Deskriptor zur TSS und TSS. Das System ist bei Adresse 0x10000
CodDesk. 1 von 0 – 4GB und DatDesk. 2 von 0 – 4GB
Desk. 6 und 7 sind Code und Daten Desks.


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

tss1:
dd 0
dd 0x2FFFFF
dw 10000b,0
dd 0x3FFFFF
dw 10000b,0
dd 0x4FFFFF
dw 10000b,0
dd 0
dd 0  ;g+0x10000 ;EIP
dd 0x90200
times 4 dd 0
dd 0x5fffff
times 3 dd 0;10000b
dw 56,0
dw 48,0
dw 16,0
times 3 dw 56,0
dw 0,0
dd 0
dd 0


Wo ist der Fehler?
 :?:

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 24. December 2005, 11:22 »
Da die Tabellen so etwas Unübersichtlich sind habe ich noch Kommentaren hinzugefügt.

tss1ds: ;5
dw 0x68         ;Größe der TSS (min. 68h)
dw tss1         ;Offset Adresse der TSS
db 1,10001001b  ;Code beginnt bei 0x10000  P,DPL,S,Type(1001)
dw 0            ;G,D,0,AVL,Größe   Startadresse

tss1:
dd 0                  ;BackLink(autogesetzt) & 0
dd 0x2FFFFF      ;ESP0
dw 10000b,0           ;SS0 & 0  (Alle SS mit desc 2,4GB ansprechbar)
dd 0x3FFFFF           ;ESP1
dw 10000b,0           ;SS1 & 0
dd 0x4FFFFF           ;ESP2
dw 10000b,0           ;SS2 & 0
dd 0                  ;CR3
dd 0  ;g+0x10000      ;EIP
dd 0x90200            ;EFLAGS
times 4 dd 0          ;EAX - EDX
dd 0x5fffff           ;ESP
times 3 dd 0          ;EBP, ESI, EDI
dw 56,0               ;ES desc 7 (daten)
dw 48,0               ;CS desc 6 (code)
dw 16,0               ;SS desc 2 (daten für gesamten Speicher)
times 3 dw 56,0       ;DS, FS, GS (sieh ES)
dw 0,0                ;Backlink & 0
dd 0                  ;LDT & 0
dd 0                  ;I/O Port Bitmap Base & 0 & T(Interrupt 2)



Aber Ich bin jetzt etwas weiter gekommen, statt des Exception 13, Exception 6 aufgerufen wird. Es macht für mich kein Sinn warum Exception 6 aufgerufen wird (Befehl wird nicht unterstützt). :?:
Da man mit Bochs etwas debuggen kann, in welcher reinfolge wird EIP, CS und Fehlercode auf den Stak gepuscht. Ich will noch mal sichergehen, dass ich den Task Wechsel richt vorgenommen habe, gazu muss ich doch mit LTR meinen ersten oder zweiten TSdesc aufrufen und dann mit Far Jump zum anderen springen. :?:

Mov ax, 64  ;8 * 8
Ltr ax
Jmp 40:0 ;5 * 8

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 29. December 2005, 16:31 »
Ich hab es geschafft (ein Stück alter Code, denn ich übersehn habe), aber es gibt doch noch ein Problem und zwar folgenden: Jeder Task hat ein eigenes Code und Datensegement. Was für ein Sprung befehl mache ich am ende des Tasks. Meine Varianten sind diese:
Jmp 0             ;EIP = 0
Jmp code1:0  ;code_n das jeweilige Codesegement

Oder wie macht man das? :?:

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #3 am: 29. December 2005, 17:10 »
Ein near jmp ist relativ, nicht absolut.
*post*

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 29. December 2005, 17:20 »
Was willst du denn machen? Wenn du einen Task beenden willst, solltest du den Kernel mithilfe eines Interrupts oder SYSCALL/SYSENTER aufrufen,

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 29. December 2005, 18:16 »
Nein, ich will nicht den Task beenden, sondern er soll in einer Dauerschleife kommen, die in meinem Fall am Anfang ist (noch fast kein Code im Task drin).

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #6 am: 29. December 2005, 18:28 »

loop:
    jmp loop


das :?:
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

Hauke

  • Beiträge: 113
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 29. December 2005, 18:48 »
Momentan ist der Code noch in einer ASM Datei. Ein Daten und Codesegement fängt hir bei „loop“ and und endet bei „jmp loop“, aber die Adressierung ist falsch, denn sie bezieht sich auf den gesamten Code und dass, ist das Problem.

 

Einloggen