14
« am: 20. December 2007, 10:48 »
Joa ich bin mal wieder dabei... hab wegen einer Lapalie irgendwie alles verloren, was ich mal vorgearbeitet habe.
Beim vorherigen Entwurf von Eyrin hat das Mirror-Mapping funktioniert, aber ich weiß nicht mehr wie. Ich wollte alles als eine liste von 4MB maps darstellen, damit ich 1024 page tables benutzen muss usw. sondern nur 2. Ich glaube, dazu sind die Dinger auch da.
Hab mir also das Intel Manual zu Herzen genommen und nachgesehen, und diesen Code gebaut:
start:
mov eax, ebx
sub eax, (0xf0000000-0x00100000)
mov [multiboot], eax
push 2
popf
; First thing to do is setting up the memory to virtual memory
; At first: Mirror map all the memory from 0x00000000 to 0xf0000000
mov eax, 0x00301000
mov ebx, 0x00000083
mov ecx, 0xf00 / 4
.loop1:
mov [eax], ebx
add eax, 0x04
add ebx, 0x00400000
loop .loop1
or dword [0x00301000], 0x10 ; Disable cache for the first 4 MB in memory (too much movement)
; Second: map physical memory from kernel start to kernel end to 0xf0000000
extern __kernel_phys_end__
mov eax, 0x00302000
mov ebx, 0x00100103
mov ecx, 0x1000 / 0x04
.loop2:
mov [eax], ebx
add eax, 0x04
add ebx, 0x1000
loop .loop2
; Then set the directory up
mov dword [0x00300000], 0x00301103
mov dword [0x00300f00], 0x00302103
mov eax, 0x00300000
mov cr3, eax
; Set PSE flag
mov eax, cr4
or eax, 0x10
mov cr4, eax
; Set Paging
mov eax, cr0
or eax, 0x80000000
mov cr0, eax
Okay ich bin mit kommentaren sparsam, aber es sollte soweit ersichtlich sein. Der Kernel liegt physikalisch an 0x00100000 und virtuell bei 0xf0000000 und wird offensichtlich ordentlich gemappt. Aber mein Problem ist jetzt folgendes: Beim nächsten Schritt versucht der auf Speicher zuzugreifen, auf 0x00100090 oder so, dass allerdings aus irgendeinem Grund nach 0x40000000 gemappt worden ist. Und weiß nicht wieso, ich hab doch alles ordentlich gesetzt oder?
TFYA