X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/1f37d39e678168ffc089bcde6f9ea203c4763550..17fe1418db474b23d9f516db049772dfe3d8696c:/lunaix-os/kernel/mm/pmm.c diff --git a/lunaix-os/kernel/mm/pmm.c b/lunaix-os/kernel/mm/pmm.c index 9c0d3eb..3ebe22a 100644 --- a/lunaix-os/kernel/mm/pmm.c +++ b/lunaix-os/kernel/mm/pmm.c @@ -30,7 +30,7 @@ pmm_mark_chunk_free(uintptr_t start_ppn, size_t page_count) void pmm_mark_chunk_occupied(pid_t owner, - uint32_t start_ppn, + u32_t start_ppn, size_t page_count, pp_attr_t attr) { @@ -43,7 +43,7 @@ pmm_mark_chunk_occupied(pid_t owner, // 我们跳过位于0x0的页。我们不希望空指针是指向一个有效的内存空间。 #define LOOKUP_START 1 -size_t pg_lookup_ptr; +volatile size_t pg_lookup_ptr; void pmm_init(uintptr_t mem_upper_lim) @@ -66,10 +66,10 @@ pmm_alloc_cpage(pid_t owner, size_t num_pages, pp_attr_t attr) size_t p2 = 0; while (p2 < max_pg && p2 - p1 < num_pages) { - (!(&pm_table[p2])->ref_counts) ? (p2++) : (p1 = p2); + (!(&pm_table[p2])->ref_counts) ? (p2++) : (p1 = ++p2); } - if (p2 < max_pg) { + if (p2 == max_pg && p2 - p1 < num_pages) { return NULL; } @@ -140,7 +140,7 @@ pmm_ref_page(pid_t owner, void* page) { (void*)owner; // TODO: do smth with owner - uint32_t ppn = (uintptr_t)page >> 12; + u32_t ppn = (uintptr_t)page >> 12; if (ppn >= PM_BMP_MAX_SIZE) { return 0; @@ -158,7 +158,7 @@ pmm_ref_page(pid_t owner, void* page) struct pp_struct* pmm_query(void* pa) { - uint32_t ppn = (uintptr_t)pa >> 12; + u32_t ppn = (uintptr_t)pa >> 12; if (ppn >= PM_BMP_MAX_SIZE) { return NULL;