paging
This commit is contained in:
@@ -10,6 +10,13 @@
|
|||||||
.long FLAGS
|
.long FLAGS
|
||||||
.long CHECKSUM
|
.long CHECKSUM
|
||||||
|
|
||||||
|
.section .bss
|
||||||
|
.align 4096
|
||||||
|
boot_page_directory:
|
||||||
|
.skip 4096
|
||||||
|
boot_page_table1:
|
||||||
|
.skip 4096
|
||||||
|
|
||||||
.section .bss
|
.section .bss
|
||||||
.align 16
|
.align 16
|
||||||
stack_bottom:
|
stack_bottom:
|
||||||
|
|||||||
@@ -53,14 +53,12 @@ void kmain(uint32_t magic, multiboot_info* mbi) {
|
|||||||
uint32_t mem_size = total_free_memory();
|
uint32_t mem_size = total_free_memory();
|
||||||
kprintf("Total available memory: %d MB\n", mem_size / 1024 / 1024);
|
kprintf("Total available memory: %d MB\n", mem_size / 1024 / 1024);
|
||||||
|
|
||||||
page = alloc_page();
|
init_paging();
|
||||||
kprintf("Allocated page at: 0x%x\n", (uint32_t)page);
|
enable_paging();
|
||||||
|
kprintf("Paging enabled\n");
|
||||||
|
|
||||||
free_page(page);
|
// enable_interrupts();
|
||||||
kprintf("Freed page");
|
// kprintf("Interrupts enabled\n");
|
||||||
|
|
||||||
enable_interrupts();
|
|
||||||
kprintf("Interrupts enabled\n");
|
|
||||||
|
|
||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ ENTRY(_start)
|
|||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
. = 2M;
|
. = 0xC0100000;
|
||||||
__kernel_start = .;
|
__kernel_start = .;
|
||||||
|
|
||||||
.text BLOCK(4K) : ALIGN(4K)
|
.text BLOCK(4K) : ALIGN(4K)
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ static uint32_t max_address = 0;
|
|||||||
static uint32_t total_available_memory = 0;
|
static uint32_t total_available_memory = 0;
|
||||||
static uint8_t memory_bitmap[BITMAP_SIZE];
|
static uint8_t memory_bitmap[BITMAP_SIZE];
|
||||||
|
|
||||||
|
uint32_t* page_directory;
|
||||||
|
|
||||||
static void mark_free(uint32_t addr) {
|
static void mark_free(uint32_t addr) {
|
||||||
uint32_t page_index = addr / PAGE_SIZE;
|
uint32_t page_index = addr / PAGE_SIZE;
|
||||||
uint32_t byte_index = page_index / 8;
|
uint32_t byte_index = page_index / 8;
|
||||||
@@ -111,4 +113,20 @@ void* alloc_page() {
|
|||||||
|
|
||||||
void free_page(void* addr) {
|
void free_page(void* addr) {
|
||||||
mark_free((uint32_t)addr);
|
mark_free((uint32_t)addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void init_paging() {
|
||||||
|
page_directory = alloc_page();
|
||||||
|
for (int i = 0; i < 1024; i++) {
|
||||||
|
page_directory[i] = 0x0;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
@@ -13,4 +13,7 @@ uint32_t total_free_memory();
|
|||||||
void* alloc_page();
|
void* alloc_page();
|
||||||
void free_page(void* addr);
|
void free_page(void* addr);
|
||||||
|
|
||||||
#endif
|
void init_paging();
|
||||||
|
void enable_paging();
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
21
kernel/memory/mm_stubs.S
Normal file
21
kernel/memory/mm_stubs.S
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
.code32
|
||||||
|
.global load_page_directory
|
||||||
|
load_page_directory:
|
||||||
|
push %ebp
|
||||||
|
mov %esp, %ebp
|
||||||
|
|
||||||
|
mov 8(%ebp), %eax
|
||||||
|
mov %eax, %cr3
|
||||||
|
|
||||||
|
leave
|
||||||
|
ret
|
||||||
|
|
||||||
|
.global enable_paging
|
||||||
|
enable_paging:
|
||||||
|
mov %eax, %cr0
|
||||||
|
orl $0x80000000, %eax
|
||||||
|
mov %cr0, %eax
|
||||||
|
jmp 1f
|
||||||
|
1:
|
||||||
|
ret
|
||||||
|
|
||||||
Reference in New Issue
Block a user