[MEMORY] Memory pages and paging management

This commit is contained in:
2017-01-24 09:58:28 +01:00
parent 5dd42d26ae
commit 4bf5835dc4
10 changed files with 344 additions and 5 deletions

View File

@@ -12,12 +12,13 @@ int kmain(uint64_t multiboot_magic, void *multiboot_data)
interrupt_init();
multiboot_init(multiboot_magic, P2V(multiboot_data));
vmm_init();
pmm_init();
// We still need the GDT to be mapped in
extern void *BootGDT;
vmm_set_page(0, V2P(&BootGDT), V2P(&BootGDT), PAGE_PRESENT);
debug_info("BOOT COMPLETE\n");
// Cause a divide-by-zero exception
int a = 5, b = 0;
int c = a/b;
(void)c;
for(;;)asm("hlt");
}

View File

@@ -19,6 +19,12 @@ void parse_multiboot1()
debug_ok("MBOOT1 - bootloader\n");
mboot_data.bootloader = P2V(data->bootloader_name);
}
if(data->flags & (1<<6))
{
debug_ok("MBOOT1 - memory map\n");
mboot_data.mmap_size = data->mmap_len/sizeof(mboot1_mmap_entry);
mboot_data.mmap = P2V(data->mmap_addr);
}
}
char *mboot_tags_type[] = {
@@ -58,6 +64,12 @@ void parse_multiboot2()
mboot_data.bootloader = tag->data;
debug_ok("MBOOT2 - handle ");
break;
case MBOOT2_MMAP:
mboot_data.mmap_size = (tag->size - 8)/
((mboot2_memory_map*)tag->data)->entry_size;
mboot_data.mmap = tag->data;
debug_ok("MBOOT2 - handle ");
break;
default:
debug_warning("MBOOT2 - ignore ");
break;
@@ -92,3 +104,59 @@ void multiboot_init(uint64_t magic, void *data)
if(mboot_data.bootloader)
debug_info("MBOOT - Bootloader: %s\n", mboot_data.bootloader);
}
#define overlap(start1, end1, start2, end2) \
(!( \
((uintptr_t)(start1) >= (uintptr_t)(end2)) \
|| ((uintptr_t)(end1) <= (uintptr_t)(start2)) \
))
#define overlapsz(start1, size1, start2, size2) \
overlap((start1), (start1)+(size1), (start2), (start2)+(size2))
int multiboot_page_used(uintptr_t addr)
{
if(mboot_data.version == 1)
{
mboot1_info *data = mboot_data.data;
if(overlapsz(addr, PAGE_SIZE, V2P(data), sizeof(data)))
return 1;
if(data->flags & (1<<6))
{
if(overlapsz(addr, PAGE_SIZE, data->mmap_addr, data->mmap_len*sizeof(mboot1_mmap_entry)))
return 1;
}
} else {
mboot2_tags_head *data = mboot_data.data;
if(overlapsz(addr, PAGE_SIZE, V2P(data), data->total_size))
return 1;
}
return 0;
}
int multiboot_get_memory_area(uintptr_t *start, uintptr_t *end, uint32_t *type)
{
static uint32_t entry = 0;
if(entry >= mboot_data.mmap_size)
return 0;
if(mboot_data.version == 1)
{
mboot1_mmap_entry *map = (void *)mboot_data.mmap;
*start = ((uintptr_t)map[entry].base_hi << 32) + map[entry].base_lo;
*end = *start + ((uintptr_t)map[entry].len_hi << 32) + map[entry].len_lo;
*type = map[entry].type;
} else {
mboot2_memory_map *mmap = mboot_data.mmap;
mboot2_mmap_entry *e = mmap->entries;
uint32_t i = entry;
while(i)
{
e = incptr(e, mmap->entry_size);
i--;
}
*start = (uintptr_t)e->base_addr;
*end = *start + (uintptr_t)e->length;
*type = e->type;
}
entry++;
return 1;
}