mirror of
https://github.com/tailix/kernel.git
synced 2025-02-10 15:36:37 -05:00
Enable paging
This commit is contained in:
parent
79dba8ad2b
commit
e5a6f22bca
4 changed files with 82 additions and 0 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue