Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Hauke 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?
:?:
-
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
-
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? :?:
-
Ein near jmp ist relativ, nicht absolut.
-
Was willst du denn machen? Wenn du einen Task beenden willst, solltest du den Kernel mithilfe eines Interrupts oder SYSCALL/SYSENTER aufrufen,
-
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).
-
loop:
jmp loop
das :?:
-
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.