git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vmm - allow remapping
[lunaix-os.git]
/
lunaix-os
/
arch
/
x86
/
hhk.c
diff --git
a/lunaix-os/arch/x86/hhk.c
b/lunaix-os/arch/x86/hhk.c
index c0e5f9a1b2ac2b2b4f8fc7b93c4f42e3cda6029a..ed3709f0e44800a8f3f316da8a850cbbeb1b06a5 100644
(file)
--- a/
lunaix-os/arch/x86/hhk.c
+++ b/
lunaix-os/arch/x86/hhk.c
@@
-29,26
+29,26
@@
extern uint8_t _k_stack;
void
_init_page(ptd_t* ptd) {
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_PRESENT, ptd + PG_MAX_ENTRIES))
// 对低1MiB空间进行对等映射(Identity mapping),也包括了我们的VGA,方便内核操作。
for (uint32_t i = 0; i < 256; i++)
{
// 对低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++)
{
}
// 对等映射我们的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)
}
// --- 将内核重映射至高半区 ---
// 这里是一些计算,主要是计算应当映射进的 页目录 与 页表 的条目索引(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;
// 将内核所需要的页表注册进页目录
uint32_t kernel_pg_counts = KERNEL_PAGE_COUNT;
// 将内核所需要的页表注册进页目录
@@
-59,12
+59,12
@@
_init_page(ptd_t* ptd) {
SET_PDE(
ptd,
kernel_pde_index + i,
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)
)
}
// 首先,检查内核的大小是否可以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);
// ERROR: require more pages
// here should do something else other than head into blocking
while (1);
@@
-80,15
+80,15
@@
_init_page(ptd_t* ptd) {
ptd,
PG_TABLE_KERNEL,
kernel_pte_index + i,
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,
)
}
// 最后一个entry用于循环映射
SET_PDE(
ptd,
-
1023
,
-
PDE
(T_SELF_REF_PERM, ptd)
+
PG_MAX_ENTRIES - 1
,
+
NEW_L1_ENTRY
(T_SELF_REF_PERM, ptd)
);
}
);
}