Autor Thema: near jump im Protected Mode  (Gelesen 5680 mal)

N43

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« am: 27. November 2005, 16:38 »
Hallo,

wenn ich einen near jump im Protected Mode ausführen möchte, bleibt das System stehen. Bochs gibt mir auch keine Fehlermeldung.

Woran könnte das liegen?

Danke schonmal für die Antworten.


N43

Legend

  • Beiträge: 635
    • Profil anzeigen
    • http://os.joachimnock.de
Gespeichert
« Antwort #1 am: 27. November 2005, 17:00 »
Tja, stimmt der Offset? ;)
*post*

N43

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 27. November 2005, 17:10 »
Hallo,

habe gerade nochmal im generierten Bytecode nachgeschaut, der generiert auch mit der funktionierenden Variante einen near jump.

Mit folgendem Code funktioniert das ganze.

jmp END

times 0x100-($-$$) db 0

END:


Wenn ich aber statt auf 0x100 Byte auf 0x200 Byte auffülle funktioniert das ganze nicht mehr.

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #3 am: 27. November 2005, 19:10 »
Wie wärs mit genauere Informationen. Du könntest z.B. einen Codeteil posten in der, der org, Selektor-setzten etc. gezeigt wird.
In the Future everyone will need OS-64!!!

N43

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 27. November 2005, 22:12 »
Hallo,

mit dem folgenden Code wechsel ich in den Protected Mode, nach END beginnt der Kernel. Der Kernel wird an die Datei angehängt.

[BITS 16]

JMP BEGIN


gdt_begin:

sd_null:
DD 0
DD 0

sd_code:
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0

sd_data:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0

gdt_end:

gdt:
.Limit dw (gdt_end - gdt_begin - 1)
.Base dd 0

code_desc equ sd_code-gdt_begin
data_desc equ sd_data-gdt_begin

BEGIN:

cli

mov eax, cs
mov ds, eax

shl eax, 4
add eax, gdt_begin
mov [gdt.Base], eax


lgdt[gdt]

mov eax, cr0
or eax, 1
mov cr0, eax

jmp 0x0008:DWord (0x10000 + PMODE)

[Bits 32]

PMODE:

mov eax, data_desc
mov ds, eax
mov es, eax
mov fs, eax
mov gs, eax
mov ss, eax
mov esp, 0x90000

jmp END

times 0x100-($-$$) db 0

END:



Wie gesagt, so funktioniert der Code, wenn ich aber auf 0x200 Bytes auffülle nicht mehr. Die Speicheradressen im Linkerscript hatte ich entsprechend angepasst.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 28. November 2005, 17:20 »
teste mal das hier:
jmp dword (END+0x10000)

   times 0x200-($-$$)   db   0

END:


wenn es geht änder mal

  jmp 0x0008:DWord (0x10000 + PMODE)

[Bits 32]      

PMODE:

nach
  jmp 0x0008:DWord PMODE

[Bits 32]      
org 0x10000

PMODE:


; dann müsste es so gehen
jmp END

   times 0x200-($-$$)   db   0

END:

(wenns nicht geht, änder es trotzdem mal ;))
Dieser Text wird unter jedem Beitrag angezeigt.

N43

  • Beiträge: 8
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 28. November 2005, 18:49 »
Hallo,

ich habe den Fehler gefunden, hatte im Bootloader den nächsten Cluster falsch ermittelt. Ab dem 512 Byte hatte ich also nur noch Mist geladen.

Bzw. jump wird doch, wenn ich die Adresse direkt angebe, relativ zur aktuellen Adresse ausgeführt, oder?


N43

 

Einloggen