Co jest źle w tym kodzie włączającym stronnicowanie?
mov [ds:SYS_PGDIR+0xC00], dword KERNEL_PGTBL | 3
Zapis adresu PageTable zawierającego jedną stronę kodu kernela, tak żeby pokazywała pod 0xC0000000(będzie to strona 0xC0000, po podzieleniu przez ilość stron per PageTable dostajemy 0x300, mnożąc razy rozmiar PDE dostajemy 0xC00). Najpierw zapisujemy adres z 12ma pierwszymi bitami wyzerowanymi, a potem dajemy Present i Read/Write.
mov [ds:KERNEL_PGTBL], dword 3
Nie potrzebujemy adresu bo ta strona wskazuje na 0x0 gdzie znajduje się kod kernela. Dajemy jej tylko Presenta i Read/Write.
mov eax, SYS_PGDIR
mov cr3, eax
Zapisujemy do CR3 adres katalogu z pierwszymi 12 bitami wyzerowanymi.
mov eax, cr0
or eax, 0x80000000
mov cr0, eax
Logicznie rzecz biorąc włączamy stronnicowanie
jmp 08h:mojeip+0xC0000000
mojeip:
Odśwież eip /* dodane */
SYS_PGDIR equ 0x7E000
KERNEL_PGTBL equ 0x7D000