这里要注意的是,我们不要忘了将启动栈加入实际可用的虚拟内存空间。因为我们现在仍处于启动过程中,因此离不开启动栈。
主函数里则是:
// src/init.rs
#[no_mangle]
pub extern "C" fn rust_main() -> ! {
crate::interrupt::init();
extern "C" {
}
((end as usize - KERNEL_BEGIN_VADDR + KERNEL_BEGIN_PADDR) >> 12) + 1,
PHYSICAL_MEMORY_END >> 12
);
crate::timer::init();
loop {}
运行一下,可以发现屏幕上仍在整齐的输出着 100 ticks
! 我们回过头来验证一下关于读、写、执行的权限是否被正确处理了。 写这么几个测试函数:
这说明内核意识到出了某些问题进入了中断,但我们并没有加以解决。 我们在中断处理里面加上对应的处理方案:
我们再依次运行三个测试,会得到结果为:
从中我们可以清楚的看出内核成功的找到了错误的原因,内核各段被成功的设置了不同的权限。我们达到了内核重映射的目的!目前的代码能在这里找到。