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.