1
0
Fork 0
mirror of https://github.com/tailix/kernel.git synced 2025-02-10 15:36:37 -05:00

Enable paging

This commit is contained in:
Braiden Vasco 2017-11-04 14:59:01 +00:00
parent 79dba8ad2b
commit e5a6f22bca
4 changed files with 82 additions and 0 deletions

View file

@ -40,5 +40,7 @@ const struct KernelMQ_Info *init(unsigned long multiboot_magic, unsigned long mu
/* kinfo.freepde_start = */ paging_mapkernel(&kinfo);
paging_load();
paging_enable();
return &kinfo;
}

View file

@ -1,6 +1,29 @@
[GLOBAL read_cr0]
[GLOBAL read_cr4]
[GLOBAL write_cr0]
[GLOBAL write_cr3]
[GLOBAL write_cr4]
read_cr0:
mov eax, cr0
ret
read_cr4:
mov eax, cr4
ret
write_cr0:
mov eax, [esp+4]
mov cr0, eax
ret
write_cr3:
mov eax, [esp+4]
mov cr3, eax
ret
write_cr4:
mov eax, [esp+4]
mov cr4, eax
ret

View file

@ -22,14 +22,69 @@
// Page directory specific flags.
#define I386_VM_BIGPAGE 0x080 // 4MB page
// CR0 bits
#define I386_CR0_PE 0x00000001 // Protected mode
#define I386_CR0_MP 0x00000002 // Monitor Coprocessor
#define I386_CR0_EM 0x00000004 // Emulate
#define I386_CR0_TS 0x00000008 // Task Switched
#define I386_CR0_ET 0x00000010 // Extension Type
#define I386_CR0_WP 0x00010000 // Enable paging
#define I386_CR0_PG 0x80000000 // Enable paging
// some CR4 bits
#define I386_CR4_VME 0x00000001 // Virtual 8086
#define I386_CR4_PVI 0x00000002 // Virtual ints
#define I386_CR4_TSD 0x00000004 // RDTSC privileged
#define I386_CR4_DE 0x00000008 // Debugging extensions
#define I386_CR4_PSE 0x00000010 // Page size extensions
#define I386_CR4_PAE 0x00000020 // Physical addr extens
#define I386_CR4_MCE 0x00000040 // Machine check enable
#define I386_CR4_PGE 0x00000080 // Global page flag enable
// TODO: implement this
#define assert(n) if (n) {}
#define panic() if (1) {}
unsigned long read_cr0();
unsigned long read_cr4();
void write_cr0(volatile unsigned long);
void write_cr3(volatile unsigned long);
void write_cr4(volatile unsigned long);
static unsigned long pagedir[I386_VM_PT_ENTRIES] __attribute__((aligned(4096)));
void paging_enable()
{
unsigned long cr0 = read_cr0();
unsigned long cr4 = read_cr4();
// The boot loader should have put us in protected mode.
assert(cr0 & I386_CR0_PE);
// First clear PG and PGE flag, as PGE must be enabled after PG.
write_cr0(cr0 & ~I386_CR0_PG);
write_cr4(cr4 & ~(I386_CR4_PGE | I386_CR4_PSE));
cr0 = read_cr0();
cr4 = read_cr4();
// Our page table contains 4MB entries.
cr4 |= I386_CR4_PSE;
write_cr4(cr4);
// First enable paging, then enable global page flag.
cr0 |= I386_CR0_PG;
write_cr0(cr0);
cr0 |= I386_CR0_WP;
write_cr0(cr0);
write_cr4(cr4);
}
void paging_clear()
{
kmemset(pagedir, 0, sizeof(pagedir));

View file

@ -3,6 +3,8 @@
#include <kernelmq/info.h>
void paging_enable();
void paging_clear();
void paging_identity(const struct KernelMQ_Info *kinfo);
int paging_mapkernel(const struct KernelMQ_Info *kinfo);