diff options
author | Freya Murphy <freya@freyacat.org> | 2024-01-29 13:22:50 -0500 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-01-29 13:22:50 -0500 |
commit | e71a141533c742d05c0612d3a87ffb3810a4b5de (patch) | |
tree | 06f8b5f8d33b287e8443caa65dea4abb64a5d3c4 /src/memory/virtalloc.c | |
parent | changes (diff) | |
download | corn-e71a141533c742d05c0612d3a87ffb3810a4b5de.tar.gz corn-e71a141533c742d05c0612d3a87ffb3810a4b5de.tar.bz2 corn-e71a141533c742d05c0612d3a87ffb3810a4b5de.zip |
memory works
Diffstat (limited to '')
-rw-r--r-- | src/memory/virtalloc.c | 18 |
1 files changed, 12 insertions, 6 deletions
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; } } |