1 #include <klibc/string.h>
2 #include <lunaix/boot_generic.h>
3 #include <lunaix/mm/pmm.h>
4 #include <lunaix/mm/vmm.h>
5 #include <lunaix/spike.h>
6 #include <lunaix/kcmd.h>
7 #include <lunaix/sections.h>
8 #include <sys/mm/mm_defs.h>
11 * @brief Reserve memory for kernel bootstrapping initialization
16 boot_begin(struct boot_handoff* bhctx)
18 bhctx->prepare(bhctx);
20 boot_begin_arch_reserve(bhctx);
22 // 将内核占据的页,包括前1MB,hhk_init 设为已占用
23 size_t pg_count = leaf_count(to_kphysical(kernel_load_end));
24 pmm_onhold_range(0, pg_count);
27 struct boot_mmapent* ent;
28 for (i = 0; i < bhctx->mem.mmap_len; i++) {
29 ent = &bhctx->mem.mmap[i];
31 if (reserved_memregion(ent) || reclaimable_memregion(ent)) {
32 unsigned int counts = leaf_count(ent->size);
33 pmm_onhold_range(pfn(ent->start), counts);
37 /* Reserve region for all loaded modules */
38 for (i = 0; i < bhctx->mods.mods_num; i++) {
39 struct boot_modent* mod = &bhctx->mods.entries[i];
40 unsigned int counts = leaf_count(mod->end - mod->start);
42 pmm_onhold_range(pfn(mod->start), counts);
53 start = reclaimable_start;
54 pgs = leaf_count(reclaimable_end - start);
55 ptep = mkptep_va(VMS_SELF, start);
57 pmm_unhold_range(pfn(to_kphysical(start)), pgs);
58 vmm_unset_ptes(ptep, pgs);
62 * @brief Release memory for kernel bootstrapping initialization
67 boot_end(struct boot_handoff* bhctx)
69 struct boot_mmapent* ent;
70 for (size_t i = 0; i < bhctx->mem.mmap_len; i++) {
71 ent = &bhctx->mem.mmap[i];
73 if (reclaimable_memregion(ent)) {
74 unsigned int counts = leaf_count(ent->size);
75 pmm_unhold_range(pfn(ent->start), counts);
79 bhctx->release(bhctx);
81 boot_clean_arch_reserve(bhctx);
87 boot_parse_cmdline(struct boot_handoff* bhctx) {
88 if (!bhctx->kexec.len) {
92 kcmd_parse_cmdline(bhctx->kexec.cmdline);