From e71a141533c742d05c0612d3a87ffb3810a4b5de Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Mon, 29 Jan 2024 13:22:50 -0500 Subject: memory works --- src/memory/physalloc.c | 23 +++++++++++++---------- src/memory/virtalloc.c | 18 ++++++++++++------ 2 files changed, 25 insertions(+), 16 deletions(-) (limited to 'src/memory') diff --git a/src/memory/physalloc.c b/src/memory/physalloc.c index b8eada6..7414d2e 100644 --- a/src/memory/physalloc.c +++ b/src/memory/physalloc.c @@ -7,8 +7,9 @@ #include #include -extern uintptr_t kernel_start; -extern uintptr_t kernel_end; +extern char kernel_start; +extern char kernel_end; +#define kaddr(addr) ((uintptr_t)(&addr)) // between memory_start and kernel_start will be the bitmap static uintptr_t memory_start = 0; @@ -113,9 +114,9 @@ void free_phys_pages(void *ptr, int pages) { static bool segment_invalid(const struct memory_segment *segment) { if (segment->type != 1) return false; - if (segment->addr < kernel_start) return false; + if (segment->addr < kaddr(kernel_start)) return false; if (segment->addr + segment->len < memory_start) return false; - if (segment->addr + segment->len < kernel_start) return false; + if (segment->addr + segment->len < kaddr(kernel_start)) return false; return true; } @@ -127,7 +128,7 @@ static struct memory_area segment_to_area(const struct memory_segment *segment) if (memory_start) start = memory_start; else - start = kernel_end; + start = kaddr(kernel_end); if (segment->addr < start) { addr = start; @@ -144,7 +145,7 @@ static struct memory_area segment_to_area(const struct memory_segment *segment) } static uintptr_t page_align(uintptr_t ptr) { - return ptr + PAGE_SIZE - 1 / PAGE_SIZE; + return (ptr + PAGE_SIZE - 1) / PAGE_SIZE * PAGE_SIZE; } void memory_init(struct memory_map *map) { @@ -165,7 +166,7 @@ void memory_init(struct memory_map *map) { struct memory_segment *segment = &map->entries[0]; int segment_count = 0; - + for(; (uintptr_t) segment < end; segment++) { if (segment_invalid(segment)) continue; @@ -180,15 +181,17 @@ void memory_init(struct memory_map *map) { //HACK: terrible hack bad bad bad bad long bitmap_size = bitmap_pages * PAGE_SIZE; - bitmap = (uint64_t *) page_at(page_count - bitmap_pages); + bitmap = (uint64_t *) page_align(kaddr(kernel_end)); + char buf[20]; long page_area_size = segment_count * sizeof(struct memory_area); char *page_area_addr = (char *)bitmap + bitmap_size; - bitmap = mmap(bitmap, bitmap_size); + ltoa((long)bitmap, buf, 16); + memset(bitmap, 0, 12); memset(bitmap, 0, bitmap_size); - memory_start = page_align(kernel_end + bitmap_size + page_area_size); + memory_start = page_align(kaddr(kernel_end) + bitmap_size + page_area_size); page_area_addr = mmap(page_area_addr, page_area_size); page_start = (struct memory_area *) page_area_addr; diff --git a/src/memory/virtalloc.c b/src/memory/virtalloc.c index b8135ef..f8d8169 100644 --- a/src/memory/virtalloc.c +++ b/src/memory/virtalloc.c @@ -26,7 +26,7 @@ static struct addr_node *alloc_node(void) { } else { struct addr_node *node = &nodes[bss_nodes]; bss_nodes += 1; - node->is_bss = false; + node->is_bss = true; return node; } return NULL; @@ -39,8 +39,8 @@ static void free_node(struct addr_node *node) { void virtaddr_init(void) { struct addr_node init = { - .start = 0, - .end = UINT64_MAX, + .start = 0x400000, // third page table + .end = 0x1000000000000, // 48bit memory address max .next = NULL, .prev = NULL, .is_alloc = false, @@ -53,6 +53,10 @@ void virtaddr_init(void) { void *virtaddr_alloc(int n_pages) { + + if (n_pages < 1) + return NULL; + long n_length = n_pages * PAGE_SIZE; struct addr_node *node = start_node; @@ -64,17 +68,19 @@ void *virtaddr_alloc(int n_pages) { long length = node->end - node->start; if (length >= n_length) { struct addr_node *new = alloc_node(); - if (node == NULL) + if (node == NULL) { return NULL; - new->next = node; - node->prev = new; + } if (node->prev != NULL) { node->prev->next = new; } + new->next = node; + node->prev = new; new->start = node->start; new->end = new->start + n_length; node->start = new->end; new->is_alloc = true; + new->next = node; return (void *) new->start; } } -- cgit v1.2.3-freya