Some test code i wrote, please note this code doesn't check if the memory behind the kernel is free to use (aka not a memory mapped device or something like that) kimage_end is the physical address of the ending of the kernel/init code section.
Code: Select all
{Place page directory's physical page behind kernel}
{kimage_end should be page aligned}
page_dir := Ppd(kimage_end);
{Initialize page directory, set non present flag on all entry's}
for i := 1 to 1023 do
page_dir[i] := 0;
{Identity map first 1MB + kernel}
image_page_table := Ppt(DWORD(kimage_end) + 4096);
page_dir[0] := DWORD(image_page_table) or $3;
for i := 0 to (DWORD(kimage_end) div 4096) - 1 do
image_page_table[i] := (i * 4096) or $3;
for i := (DWORD(kimage_end) div 4096) to 1023 do
image_page_table[i] := 0;
I hope its a bit helpfull and i didn't say to much idiot things