Added page frame allocator
Currently it is using bitmap. Maybe will be rewriten. Also deallocator is needed
This commit is contained in:
parent
45fc49d08c
commit
7e3279dba1
|
@ -3,6 +3,13 @@
|
|||
|
||||
#include <idt.h>
|
||||
|
||||
#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);
|
||||
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
51
src/paging.c
51
src/paging.c
|
@ -2,8 +2,10 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue