From 7e3279dba105f7ad5b0308392e3b7519d4c6757c Mon Sep 17 00:00:00 2001 From: g1n Date: Sat, 12 Feb 2022 16:03:42 +0200 Subject: [PATCH] Added page frame allocator Currently it is using bitmap. Maybe will be rewriten. Also deallocator is needed --- src/include/paging.h | 7 ++++++ src/kernel.c | 5 ----- src/paging.c | 51 ++++++++++++++++++++++++++++++++++++-------- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/src/include/paging.h b/src/include/paging.h index c12ac83..5208218 100644 --- a/src/include/paging.h +++ b/src/include/paging.h @@ -3,6 +3,13 @@ #include +#define NPAGES 4096U // FIXME +#define ENTRY_WIDTH 32U +#define PAGE_SIZE 0x1000U + +typedef uint32_t page_addr_t; + +page_addr_t kalloc_frame(); void paging_init(); void page_fault(registers_t regs); diff --git a/src/kernel.c b/src/kernel.c index 12f7aab..46d3c21 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -6,9 +6,4 @@ void kernel_main() { kprintf("Hello, World!\n"); dbgf("Hello serial World!\n"); - warn("test warning debug %d\n", 42); - error("test error debug %d\n", 42); - fixme("test fixme debug %d\n", 42); - todo("test todo debug %d\n", 42); - panic("test panic\n"); } diff --git a/src/paging.c b/src/paging.c index 014add4..b148241 100644 --- a/src/paging.c +++ b/src/paging.c @@ -2,8 +2,10 @@ #include #include -uint32_t page_directory[1024] __attribute__((aligned(4096))); -uint32_t first_page_table[1024] __attribute__((aligned(4096))); +uint32_t page_dir[1024] __attribute__((aligned(4096))); +uint32_t page_table[1024] __attribute__((aligned(4096))); + +static uint32_t bitmap[NPAGES/ENTRY_WIDTH] __attribute__((aligned(4096))); void page_fault(registers_t regs) { uint32_t faulting_address; @@ -25,26 +27,57 @@ void page_fault(registers_t regs) { kprintf("PAGE FAULT\n"); } -void enable_paging(uint32_t *dir) { +void load_directory(uint32_t *dir) { __asm__ volatile("mov %0, %%cr3":: "r"(dir)); +} + +void enable_paging() { uint32_t cr0; __asm__ volatile("mov %%cr0, %0": "=r"(cr0)); cr0 |= 0x80000001; // Enable paging! __asm__ volatile("mov %0, %%cr0":: "r"(cr0)); } +page_addr_t kalloc_frame() { + uint32_t bitmap_index; + uint32_t element_index; + uint32_t page_frame_number; + + for (bitmap_index = 0; bitmap_index < NPAGES/ENTRY_WIDTH; bitmap_index++) + if (bitmap[bitmap_index] != 0) break; // FIXME + + if (bitmap_index >= NPAGES/ENTRY_WIDTH) + return -1; + + for (element_index = 0; element_index < ENTRY_WIDTH; element_index++) + if ((bitmap[bitmap_index] & (1U << element_index)) != 0) break; // FIXME + + if ((bitmap[bitmap_index] & (1U << element_index)) == 0) + return -1; + + bitmap[bitmap_index] &= ~(1U << element_index); + + page_frame_number = bitmap_index * ENTRY_WIDTH + element_index; + return page_frame_number * PAGE_SIZE; +} + void paging_init() { - int i; + unsigned int i; for(i = 0; i < 1024; i++) { - page_directory[i] = 0x00000002; + page_dir[i] = 0x00000002; + } + + for(i = 0; i < NPAGES/ENTRY_WIDTH; i++) { + bitmap[i] = ~0; } for(i = 0; i < 1024; i++) { - first_page_table[i] = (i * 0x1000) | 3; // attributes: supervisor level, read/write, present. + page_table[i] = (i * 0x1000) | 3; } - - page_directory[0] = ((unsigned int)first_page_table) | 3; + + page_dir[0] = ((unsigned int)page_table) | 3; register_interrupt_handler(14, &page_fault); - enable_paging(page_directory); + load_directory(page_dir); + enable_paging(); }