fixing up paging issues
This commit is contained in:
@@ -13,8 +13,6 @@ static uint32_t max_address = 0;
|
||||
static uint32_t total_available_memory = 0;
|
||||
static uint8_t memory_bitmap[BITMAP_SIZE];
|
||||
|
||||
uint32_t* page_directory;
|
||||
|
||||
static void mark_free(uint32_t addr) {
|
||||
uint32_t page_index = addr / PAGE_SIZE;
|
||||
uint32_t byte_index = page_index / 8;
|
||||
@@ -56,8 +54,10 @@ static void parse_multiboot_mmap(void* base, uint32_t limit) {
|
||||
continue;
|
||||
}
|
||||
|
||||
uint32_t kernel_phys_start = (uint32_t)&__kernel_start - 0xC0000000;
|
||||
uint32_t kernel_phys_end = (uint32_t)&__kernel_end - 0xC0000000;
|
||||
for (uint32_t addr = usable_start; addr < usable_end; addr += 4096) {
|
||||
if (addr <= (uint32_t)&__kernel_end && addr >= (uint32_t)&__kernel_start) {
|
||||
if (addr <= (uint32_t)&kernel_phys_end && addr >= (uint32_t)&kernel_phys_start) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ static void parse_multiboot_mmap(void* base, uint32_t limit) {
|
||||
}
|
||||
}
|
||||
|
||||
void init_mm(void* mmap_base, uint32_t mmap_limit) {
|
||||
void init_pmm(void* mmap_base, uint32_t mmap_limit) {
|
||||
for (int i = 0; i < BITMAP_SIZE; i++) {
|
||||
memory_bitmap[i] = 0xFF;
|
||||
}
|
||||
@@ -92,7 +92,8 @@ uint32_t total_free_memory() {
|
||||
return total_available_memory;
|
||||
}
|
||||
|
||||
void* alloc_page() {
|
||||
// this returns the virtual address of the physical page allocated
|
||||
void* alloc_phys_page() {
|
||||
for (uint32_t i = 0; i < BITMAP_SIZE; i++) {
|
||||
uint8_t b = memory_bitmap[i];
|
||||
if (b == 0xFF) {
|
||||
@@ -103,7 +104,7 @@ void* alloc_page() {
|
||||
if ((b & (1 << bit)) == 0) {
|
||||
uint32_t page_addr = (i * 8 + bit) * PAGE_SIZE;
|
||||
mark_used(page_addr);
|
||||
return (void*)page_addr;
|
||||
return (void*)(page_addr + 0xC0000000);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -111,22 +112,19 @@ void* alloc_page() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_page(void* addr) {
|
||||
void free_phys_page(void* addr) {
|
||||
mark_free((uint32_t)addr);
|
||||
}
|
||||
|
||||
void init_paging() {
|
||||
page_directory = alloc_page();
|
||||
extern uint32_t page_directory[1024];
|
||||
extern void flush_tlb();
|
||||
extern void disable_pae();
|
||||
void init_page_tables() {
|
||||
uint32_t* kernel_table = alloc_phys_page();
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
page_directory[i] = 0x0;
|
||||
kernel_table[i] = (i * PAGE_SIZE) | 0x3;
|
||||
}
|
||||
|
||||
uint32_t* page_table = alloc_page();
|
||||
page_directory[0] = (uint32_t)(page_table) | 0x3;
|
||||
for (int i = 0; i < 1024; i++) {
|
||||
page_table[i] = (i * PAGE_SIZE) | 0x3;
|
||||
}
|
||||
|
||||
extern void load_page_directory(uint32_t* pd);
|
||||
load_page_directory(page_directory);
|
||||
uint32_t* phys_table = kernel_table - 0xC000000;
|
||||
page_directory[768] = (uint32_t)(phys_table) | 0x3;
|
||||
flush_tlb();
|
||||
}
|
||||
@@ -7,13 +7,12 @@ typedef struct __attribute__((packed)) {
|
||||
uint32_t addr;
|
||||
} mem_page_t;
|
||||
|
||||
void init_mm(void* mmap_base, uint32_t mmap_limit);
|
||||
void init_pmm(void* mmap_base, uint32_t mmap_limit);
|
||||
uint32_t total_free_memory();
|
||||
|
||||
void* alloc_page();
|
||||
void free_page(void* addr);
|
||||
|
||||
void init_paging();
|
||||
void enable_paging();
|
||||
void init_page_tables();
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,21 +1,11 @@
|
||||
.code32
|
||||
.global load_page_directory
|
||||
load_page_directory:
|
||||
push %ebp
|
||||
mov %esp, %ebp
|
||||
|
||||
mov 8(%ebp), %eax
|
||||
.code32
|
||||
.global flush_tlb
|
||||
flush_tlb:
|
||||
mov %cr3, %eax
|
||||
mov %eax, %cr3
|
||||
|
||||
leave
|
||||
ret
|
||||
|
||||
.global enable_paging
|
||||
enable_paging:
|
||||
mov %eax, %cr0
|
||||
orl $0x80000000, %eax
|
||||
mov %cr0, %eax
|
||||
jmp 1f
|
||||
1:
|
||||
|
||||
.global disable_pae
|
||||
disable_pae:
|
||||
ret
|
||||
|
||||
|
||||
Reference in New Issue
Block a user