Code: Select all
unit paging;
interface
procedure InstallPaging;
implementation
uses
screen;
var
PageDirectory: PLongWord; external name 'page_directory';
PageTable: PLongWord; external name 'page_table';
function ReadCr0: LongWord; external name 'read_cr0';
procedure WriteCr0(Value: LongWord); external name 'write_cr0';
function ReadCr3: LongWord; external name 'read_cr3';
procedure WriteCr3(Value: LongWord); external name 'write_cr3';
procedure FillPageTable;
var
i: Word;
begin
for i:=0 to 1023 do
PageTable[i]:=(i*4096) or 3; // 011 (supervisor, read/write, present)
end;
procedure FillPageDirectory;
var
i: Word;
begin
PageDirectory[0]:=PtrUInt(PageTable);
PageDirectory[0]:=PageDirectory[0] or 3;
for i:=1 to 1023 do
PageDirectory[i]:=2; // 010 (supervisor, read/write, NOT present)
end;
procedure InstallPaging;
begin
WriteStr('Installing Paging... ');
FillPageDirectory;
FillPageTable;
WriteCr3(PtrUInt(PageDirectory)); // put PageDirectory address into CR3
WriteCr0(ReadCr0 or $80000000); // set the paging bit in CR0 to 1
WriteStrLn('Done.');
end;
end.
Code: Select all
section .text
...
; Paging helper functions
global read_cr0
read_cr0:
mov eax,cr0
retn
global write_cr0
write_cr0:
push ebp
mov ebp,esp
mov eax,[ebp+8]
mov cr0,eax
pop ebp
retn
global read_cr3
read_cr3:
mov eax,cr3
retn
global write_cr3
write_cr3:
push ebp
mov ebp,esp
mov eax,[ebp+8]
mov cr3,eax
pop ebp
retn
...
section .bss
;
; Page directory & page table
;
align 4096
global page_directory
page_directory:
resd 1024
global page_table
page_table:
resd 1024