X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/69777bdcab284335651a8002e2896f3862fa423d..9e622bd093f8e106b7e8a00f55620f13cc5cd87f:/lunaix-os/kernel/boot_helper.c diff --git a/lunaix-os/kernel/boot_helper.c b/lunaix-os/kernel/boot_helper.c index f7ad158..37e6bb4 100644 --- a/lunaix-os/kernel/boot_helper.c +++ b/lunaix-os/kernel/boot_helper.c @@ -4,7 +4,8 @@ #include #include #include -#include +#include +#include /** * @brief Reserve memory for kernel bootstrapping initialization @@ -15,36 +16,47 @@ void boot_begin(struct boot_handoff* bhctx) { bhctx->prepare(bhctx); - - // Identity-map the first 3GiB address spaces - pte_t* ptep = mkl0tep(mkptep_va(VMS_SELF, 0)); - pte_t pte = mkpte_prot(KERNEL_DATA); - size_t count = page_count(KERNEL_RESIDENT, L0T_SIZE); - vmm_set_ptes_contig(ptep, pte_mkhuge(pte), L0T_SIZE, count); + boot_begin_arch_reserve(bhctx); + + // 将内核占据的页,包括前1MB,hhk_init 设为已占用 + size_t pg_count = leaf_count(to_kphysical(kernel_load_end)); + pmm_onhold_range(0, pg_count); - struct boot_mmapent *mmap = bhctx->mem.mmap, *mmapent; - for (size_t i = 0; i < bhctx->mem.mmap_len; i++) { - mmapent = &mmap[i]; - size_t size_pg = leaf_count(mmapent->size); - pfn_t start_pfn = pfn(mmapent->start); + size_t i; + struct boot_mmapent* ent; + for (i = 0; i < bhctx->mem.mmap_len; i++) { + ent = &bhctx->mem.mmap[i]; - if (mmapent->type == BOOT_MMAP_FREE) { - pmm_mark_chunk_free(start_pfn, size_pg); - continue; + if (reserved_memregion(ent) || reclaimable_memregion(ent)) { + unsigned int counts = leaf_count(ent->size); + pmm_onhold_range(pfn(ent->start), counts); } } /* Reserve region for all loaded modules */ - for (size_t i = 0; i < bhctx->mods.mods_num; i++) { + for (i = 0; i < bhctx->mods.mods_num; i++) { struct boot_modent* mod = &bhctx->mods.entries[i]; unsigned int counts = leaf_count(mod->end - mod->start); - pmm_mark_chunk_occupied(pfn(mod->start), counts, PP_FGLOCKED); + pmm_onhold_range(pfn(mod->start), counts); } } -extern u8_t __kboot_end; /* link/linker.ld */ +static void +__free_reclaimable() +{ + ptr_t start; + pfn_t pgs; + pte_t* ptep; + + start = reclaimable_start; + pgs = leaf_count(reclaimable_end - start); + ptep = mkptep_va(VMS_SELF, start); + + pmm_unhold_range(pfn(to_kphysical(start)), pgs); + vmm_unset_ptes(ptep, pgs); +} /** * @brief Release memory for kernel bootstrapping initialization @@ -54,33 +66,21 @@ extern u8_t __kboot_end; /* link/linker.ld */ void boot_end(struct boot_handoff* bhctx) { - struct boot_mmapent *mmap = bhctx->mem.mmap, *mmapent; + struct boot_mmapent* ent; for (size_t i = 0; i < bhctx->mem.mmap_len; i++) { - mmapent = &mmap[i]; - size_t size_pg = leaf_count(mmapent->size); - - if (mmapent->type == BOOT_MMAP_RCLM) { - pmm_mark_chunk_free(pfn(mmapent->start), size_pg); - } + ent = &bhctx->mem.mmap[i]; - if (mmapent->type == BOOT_MMAP_FREE) { - continue; + if (reclaimable_memregion(ent)) { + unsigned int counts = leaf_count(ent->size); + pmm_unhold_range(pfn(ent->start), counts); } } bhctx->release(bhctx); -} -/** - * @brief Clean up the boot stage code and data - * - */ -void -boot_cleanup() -{ - pte_t* ptep = mkl0tep(mkptep_va(VMS_SELF, 0)); - size_t count = page_count(KERNEL_RESIDENT, L0T_SIZE); - vmm_unset_ptes(ptep, count); + boot_clean_arch_reserve(bhctx); + + __free_reclaimable(); } void