Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: N43 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
-
Tja, stimmt der Offset? ;)
-
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.
-
Wie wärs mit genauere Informationen. Du könntest z.B. einen Codeteil posten in der, der org, Selektor-setzten etc. gezeigt wird.
-
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.
-
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 ;))
-
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