Und wieder ich :3 Da ich ja alleine nix hinkriege...
Ich will jetzt mal paging nutzen. Dazu muss ich ja erstmal initialisieren. Irgendwie geht der code aber nich...
Ich will den kernel, der an der physikalischen Adresse 0x00100000 liegt, nach 0xC0000000 mappen, das übliche also. Gleich nach dem füllen der Tables und des Directories krieg ich einen Page fault mit cr2 = 0x00000040
Hier der code:
start:
xor eax, eax
; or eax, 2
mov ecx, 0x0400
mov edi, [PAGE_DIR]
rep stosd
or eax, 2
mov ecx, 0x0400
mov edi, [PAGE_TAB1]
rep stosd
mov ecx, 0x0400
mov edi, [PAGE_TAB2]
rep stosd
mov dword [PAGE_DIR], PAGE_TAB1 | 3
mov dword [PAGE_DIR+0xC00], PAGE_TAB2 | 3
mov dword [PAGE_TAB1 + 0xB8*4], 0x000B8000 | 3
mov dword [PAGE_TAB2], 0x00100000 | 3
mov dword [PAGE_TAB2+4], 0x00101000 | 3
mov dword [PAGE_TAB2+8], 0x00102000 | 3
mov dword [PAGE_TAB2+12], 0x00103000 | 3
mov dword [PAGE_TAB2+16], 0x00104000 | 3
mov dword [PAGE_TAB2+20], 0x00105000 | 3
mov dword [PAGE_TAB2+24], 0x00106000 | 3
mov eax, PAGE_DIR
mov cr3, eax
mov eax, cr0
or eax, 0x80000000
mov cr0, eax
jmp dword start2
start2:
mov esp, stack
push ebx
call main
stop:
cli
hlt
und die linkfile
OUTPUT_FORMAT("elf32-i386")
ENTRY(start)
phys = 0x00100000;
corr = 0xBFF00000;
virt = 0xC0000000;
SECTIONS
{
. = virt;
.text : AT(ADDR(.text) - corr)
{
code = .; _code = .;
*(.text)
. = ALIGN(0x1000);
}
.data : AT(ADDR(.data) - corr)
{
data = .; _data = .;
*(.data)
*(.rodata*)
. = ALIGN(0x4);
}
.bss : AT(ADDR(.bss) - corr)
{
bss = .; _bss = .;
*(.bss)
*(COMMON)
. = ALIGN(0x1000);
}
end = .; _end = .;
}
Danke im vorraus...