This commit is contained in:
2026-06-14 18:53:54 -05:00
parent 53c5d7d40c
commit ac4b510221
6 changed files with 56 additions and 9 deletions

View File

@@ -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:

View File

@@ -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);
} }

View File

@@ -2,7 +2,7 @@ ENTRY(_start)
SECTIONS SECTIONS
{ {
. = 2M; . = 0xC0100000;
__kernel_start = .; __kernel_start = .;
.text BLOCK(4K) : ALIGN(4K) .text BLOCK(4K) : ALIGN(4K)

View File

@@ -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);
} }

View File

@@ -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
View 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