- _init_idt();
-
- multiboot_memory_map_t* map = (multiboot_memory_map_t*)mb_info->mmap_addr;
-
- // TODO: 内核初始化
- // (v) 根据memory map初始化内存管理器
- // (v) 分配新的栈空间
- // 调整映射:
- // ( ) + 映射 memory map (APCI,APIC,IO映射) (以后)
- // (v) + 释放 hhk_init 所占据的空间
-
- // 初始化物理内存管理器
- pmm_init(MEM_1MB + mb_info->mem_upper << 10);
- vmm_init();
- tty_init(VGA_BUFFER_PADDR);
-
- tty_set_theme(VGA_COLOR_GREEN, VGA_COLOR_BLACK);
-
- printf("[KERNEL] Initializing Memory ...\n");
- unsigned int map_size =
- mb_info->mmap_length / sizeof(multiboot_memory_map_t);
- printf("[MM] Mem: %d KiB, Extended Mem: %d KiB\n",
- mb_info->mem_lower,
- mb_info->mem_upper);
-
- // 按照 Memory map 标识可用的物理页
- for (unsigned int i = 0; i < map_size; i++) {
- multiboot_memory_map_t mmap = map[i];
- printf("[MM] Base: 0x%x, len: %u KiB, type: %u\n",
- map[i].addr_low,
- map[i].len_low >> 10,
- map[i].type);
- if (mmap.type == MULTIBOOT_MEMORY_AVAILABLE) {
- // 整数向上取整除法
- uintptr_t pg = map[i].addr_low + 0x0fffU;
- pmm_mark_chunk_free(pg >> 12, map[i].len_low >> 12);
- printf("[MM] Freed %u pages start from 0x%x\n",
- map[i].len_low >> 12,
- pg & ~0x0fffU);
- }
- }