X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/cd09c4b222e4ddf45a42522563ae2471a829d1c8..1b471813a2ba287c2ace9cf6c866f330c725b99c:/lunaix-os/arch/x86/hhk.c diff --git a/lunaix-os/arch/x86/hhk.c b/lunaix-os/arch/x86/hhk.c index c0e5f9a..5dae566 100644 --- a/lunaix-os/arch/x86/hhk.c +++ b/lunaix-os/arch/x86/hhk.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include #define PT_ADDR(ptd, pt_index) ((ptd_t*)ptd + (pt_index + 1) * 1024) #define SET_PDE(ptd, pde_index, pde) *((ptd_t*)ptd + pde_index) = pde; @@ -14,12 +14,12 @@ // use table #1 #define PG_TABLE_IDENTITY 0 -// use table #2-4 +// use table #2-8 // hence the max size of kernel is 8MiB #define PG_TABLE_KERNEL 1 -// use table #5 -#define PG_TABLE_STACK 4 +// use table #9 +#define PG_TABLE_STACK 8 // Provided by linker (see linker.ld) extern uint8_t __kernel_start; @@ -29,26 +29,26 @@ extern uint8_t _k_stack; void _init_page(ptd_t* ptd) { - SET_PDE(ptd, 0, PDE(PG_PRESENT, ptd + PG_MAX_ENTRIES)) + SET_PDE(ptd, 0, NEW_L1_ENTRY(PG_PREM_RW, ptd + PG_MAX_ENTRIES)) // 对低1MiB空间进行对等映射(Identity mapping),也包括了我们的VGA,方便内核操作。 for (uint32_t i = 0; i < 256; i++) { - SET_PTE(ptd, PG_TABLE_IDENTITY, i, PTE(PG_PREM_RW, (i << 12))) + SET_PTE(ptd, PG_TABLE_IDENTITY, i, NEW_L2_ENTRY(PG_PREM_RW, (i << PG_SIZE_BITS))) } // 对等映射我们的hhk_init,这样一来,当分页与地址转换开启后,我们依然能够照常执行最终的 jmp 指令来跳转至 // 内核的入口点 for (uint32_t i = 0; i < HHK_PAGE_COUNT; i++) { - SET_PTE(ptd, PG_TABLE_IDENTITY, 256 + i, PTE(PG_PREM_RW, 0x100000 + (i << 12))) + SET_PTE(ptd, PG_TABLE_IDENTITY, 256 + i, NEW_L2_ENTRY(PG_PREM_RW, 0x100000 + (i << PG_SIZE_BITS))) } // --- 将内核重映射至高半区 --- // 这里是一些计算,主要是计算应当映射进的 页目录 与 页表 的条目索引(Entry Index) - uint32_t kernel_pde_index = PD_INDEX(sym_val(__kernel_start)); - uint32_t kernel_pte_index = PT_INDEX(sym_val(__kernel_start)); + uint32_t kernel_pde_index = L1_INDEX(sym_val(__kernel_start)); + uint32_t kernel_pte_index = L2_INDEX(sym_val(__kernel_start)); uint32_t kernel_pg_counts = KERNEL_PAGE_COUNT; // 将内核所需要的页表注册进页目录 @@ -59,15 +59,15 @@ _init_page(ptd_t* ptd) { SET_PDE( ptd, kernel_pde_index + i, - PDE(PG_PREM_RW, PT_ADDR(ptd, PG_TABLE_KERNEL + i)) + NEW_L1_ENTRY(PG_PREM_RW, PT_ADDR(ptd, PG_TABLE_KERNEL + i)) ) } // 首先,检查内核的大小是否可以fit进我们这几个表(12MiB) - if (kernel_pg_counts > (PG_TABLE_STACK - PG_TABLE_KERNEL) * 1024) { + if (kernel_pg_counts > (PG_TABLE_STACK - PG_TABLE_KERNEL) * PG_MAX_ENTRIES) { // ERROR: require more pages // here should do something else other than head into blocking - while (1); + asm ("ud2"); } // 计算内核.text段的物理地址 @@ -80,15 +80,15 @@ _init_page(ptd_t* ptd) { ptd, PG_TABLE_KERNEL, kernel_pte_index + i, - PTE(PG_PREM_RW, kernel_pm + (i << 12)) + NEW_L2_ENTRY(PG_PREM_RW, kernel_pm + (i << PG_SIZE_BITS)) ) } // 最后一个entry用于循环映射 SET_PDE( ptd, - 1023, - PDE(T_SELF_REF_PERM, ptd) + PG_MAX_ENTRIES - 1, + NEW_L1_ENTRY(T_SELF_REF_PERM, ptd) ); }