mm: improve stability by making the page bitmap full by default, also implement liballoc_lock and liballoc_unlock
This commit is contained in:
+9
-14
@@ -8,11 +8,13 @@
|
|||||||
|
|
||||||
int liballoc_lock() {
|
int liballoc_lock() {
|
||||||
// Implement locking (disable interrupts or use spinlock)
|
// Implement locking (disable interrupts or use spinlock)
|
||||||
|
asm volatile("cli");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int liballoc_unlock() {
|
int liballoc_unlock() {
|
||||||
// Implement unlocking
|
// Implement unlocking
|
||||||
|
asm volatile("sti");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,19 +83,18 @@ void* kvalloc(size_t npages) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Temporarily store physical addresses
|
// Temporarily store physical addresses
|
||||||
void* phys_addrs[npages];
|
|
||||||
uint32_t vaddr = KHEAP_START + start * PAGE_SIZE;
|
uint32_t vaddr = KHEAP_START + start * PAGE_SIZE;
|
||||||
|
|
||||||
// Allocate physical pages first
|
|
||||||
for (uint32_t i = 0; i < npages; i++) {
|
for (uint32_t i = 0; i < npages; i++) {
|
||||||
phys_addrs[i] = alloc_page();
|
void* phys = alloc_page();
|
||||||
if (!phys_addrs[i]) {
|
if (!phys) {
|
||||||
// Cleanup on failure
|
// Out of physical memory! Unmap what we just did and fail.
|
||||||
for (uint32_t j = 0; j < i; j++) {
|
kvfree((void*)vaddr, i);
|
||||||
free_page(phys_addrs[j]);
|
|
||||||
}
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Map the page
|
||||||
|
map_page(phys, (void*)(vaddr + i * PAGE_SIZE), PAGE_PRESENT | PAGE_RW);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark virtual pages as allocated
|
// Mark virtual pages as allocated
|
||||||
@@ -101,12 +102,6 @@ void* kvalloc(size_t npages) {
|
|||||||
kheap_bitmap_set(i);
|
kheap_bitmap_set(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map virtual to physical pages
|
|
||||||
for (uint32_t i = 0; i < npages; i++) {
|
|
||||||
map_page(phys_addrs[i], (void*)(vaddr + i * PAGE_SIZE),
|
|
||||||
PAGE_PRESENT | PAGE_RW);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (void*)vaddr;
|
return (void*)vaddr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -45,7 +45,7 @@ void clear_bit(uint32_t page_index) {
|
|||||||
void init_allocator() {
|
void init_allocator() {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
memset(page_bitmap, 0x00, BITMAP_SIZE);
|
memset(page_bitmap, 0xFF, BITMAP_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* alloc_page() {
|
void* alloc_page() {
|
||||||
|
|||||||
+6
-3
@@ -73,14 +73,14 @@ void grub_memory_map(unsigned int magic, struct multiboot_info* mbi)
|
|||||||
printf("Start Addr: %x | Length: %x | Size: %x | Type: %x\n",
|
printf("Start Addr: %x | Length: %x | Size: %x | Type: %x\n",
|
||||||
mmmt->addr_low, mmmt->len_low, mmmt->size, mmmt->type);
|
mmmt->addr_low, mmmt->len_low, mmmt->size, mmmt->type);
|
||||||
|
|
||||||
if(mmmt->type != MULTIBOOT_MEMORY_AVAILABLE) {
|
if(mmmt->type == MULTIBOOT_MEMORY_AVAILABLE) {
|
||||||
/*
|
/*
|
||||||
* Do something with this memory block!
|
* Do something with this memory block!
|
||||||
* BE WARNED that some of memory shown as availiable is actually
|
* BE WARNED that some of memory shown as availiable is actually
|
||||||
* actively being used by the kernel! You'll need to take that
|
* actively being used by the kernel! You'll need to take that
|
||||||
* into account before writing to memory!
|
* into account before writing to memory!
|
||||||
*/
|
*/
|
||||||
printf("not available\n");
|
printf("available\n");
|
||||||
uint32_t size_in_pages = mmmt->len_low / PAGE_SIZE;
|
uint32_t size_in_pages = mmmt->len_low / PAGE_SIZE;
|
||||||
printf("size_in_pages: 0x%X\n", size_in_pages);
|
printf("size_in_pages: 0x%X\n", size_in_pages);
|
||||||
|
|
||||||
@@ -88,7 +88,10 @@ void grub_memory_map(unsigned int magic, struct multiboot_info* mbi)
|
|||||||
uint32_t page_count = mmmt->len_low / PAGE_SIZE;
|
uint32_t page_count = mmmt->len_low / PAGE_SIZE;
|
||||||
printf("page_base: %X, page_count: %X\n", base_page, page_count);
|
printf("page_base: %X, page_count: %X\n", base_page, page_count);
|
||||||
for (uint32_t j = 0; j < page_count; j++) {
|
for (uint32_t j = 0; j < page_count; j++) {
|
||||||
set_bit(base_page + j);
|
// Only clear the bit if it fits in our bitmap
|
||||||
|
if ((base_page + j) < (BITMAP_SIZE * 8)) {
|
||||||
|
clear_bit(base_page + j);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user