#include #include #include #include #include #include #include /* One vm_pg_data_t per NUMA node. */ static vm_pg_data_t *node_data = NULL; /* array of pages, one for each physical page frame present in RAM */ static vm_page_t *page_array = NULL; kern_status_t vm_bootstrap() { int numa_count = 1; /* we're only worrying about UMA systems for now */ node_data = memblock_alloc(sizeof(vm_pg_data_t) * numa_count); size_t pmem_size = 0; memblock_iter_t it; for_each_mem_range (&it, 0x0, UINTPTR_MAX) { if (pmem_size < it.it_limit + 1) { pmem_size = it.it_limit + 1; } } size_t nr_pages = pmem_size / VM_PAGE_SIZE; if (pmem_size % VM_PAGE_SIZE) { nr_pages++; } page_array = memblock_alloc(sizeof(vm_page_t) * nr_pages); printf("page_array covers 0x%zx bytes, %zu page frames\n", pmem_size, pmem_size / 0x1000); printf("page_array is %zu bytes long\n", sizeof(vm_page_t) * nr_pages); for (size_t i = 0; i < nr_pages; i++) { vm_page_init(&page_array[i]); } return KERN_OK; }