diff --git a/src/include/paging.h b/src/include/paging.h index d4a46af..d1d2d62 100644 --- a/src/include/paging.h +++ b/src/include/paging.h @@ -3,14 +3,18 @@ #include -#define NPAGES 4096U // FIXME -#define ENTRY_WIDTH 32U -#define PAGE_SIZE 0x1000U +#define NPAGES 4096 // FIXME +#define PAGE_SIZE 16 + +typedef struct page { + struct page *next; + int value; +} page_t; typedef uint32_t page_addr_t; -page_addr_t kalloc_frame(); -void kfree_frame(page_addr_t addr); +page_t *kalloc_frame(); +void kfree_frame(page_t *page); void paging_init(); void page_fault(registers_t regs); diff --git a/src/linker.ld b/src/linker.ld index 7ab94d3..72171ed 100644 --- a/src/linker.ld +++ b/src/linker.ld @@ -1,6 +1,6 @@ /* The bootloader will look at this image and start execution at the symbol designated as the entry point. */ -ENTRY(_start) +ENTRY(boot) /* Tell where the various sections of the object files will be put in the final kernel image. */ @@ -15,6 +15,7 @@ SECTIONS Next we'll put the .text section. */ .text BLOCK(4K) : ALIGN(4K) { + text_start = .; *(.multiboot) *(.text) } @@ -29,13 +30,17 @@ SECTIONS .data BLOCK(4K) : ALIGN(4K) { *(.data) + end_data = .; } /* Read-write data (uninitialized) and stack */ .bss BLOCK(4K) : ALIGN(4K) { + sbss = .; *(COMMON) *(.bss) + ebss = .; + endkernel = .; } /* The compiler may produce other sections, by default it will put them in diff --git a/src/paging.c b/src/paging.c index 916c43e..e9d2925 100644 --- a/src/paging.c +++ b/src/paging.c @@ -5,8 +5,6 @@ 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; __asm__ volatile("mov %%cr2, %0" : "=r" (faulting_address)); @@ -38,32 +36,26 @@ void 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 +extern uint32_t endkernel; - if (bitmap_index >= NPAGES/ENTRY_WIDTH) - return -1; +page_t *next_page; +page_t *free_pages = 0; - 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; +page_t *kalloc_frame(){ + page_t *temp; + if (free_pages == 0) { + temp = next_page; + next_page += PAGE_SIZE; + } else { + temp = free_pages; + free_pages = free_pages->next; + } + return temp; } -void kfree_frame(page_addr_t addr) { - page_addr_t index = addr / PAGE_SIZE; - bitmap[index / ENTRY_WIDTH] |= (1U << ((index / ENTRY_WIDTH) + (index % ENTRY_WIDTH))); +void kfree_frame(page_t *page) { + page->next = free_pages; + free_pages = page; } void paging_init() { @@ -71,10 +63,8 @@ void paging_init() { for(i = 0; i < 1024; i++) { page_dir[i] = 0x00000002; } - - for(i = 0; i < NPAGES/ENTRY_WIDTH; i++) { - bitmap[i] = ~0; - } + + next_page = (page_t*)endkernel; for(i = 0; i < 1024; i++) { page_table[i] = (i * 0x1000) | 3;