这里要注意的是,我们不要忘了将启动栈加入实际可用的虚拟内存空间。因为我们现在仍处于启动过程中,因此离不开启动栈。

    主函数里则是:

    1. // src/init.rs
    2. #[no_mangle]
    3. pub extern "C" fn rust_main() -> ! {
    4. crate::interrupt::init();
    5. extern "C" {
    6. }
    7. ((end as usize - KERNEL_BEGIN_VADDR + KERNEL_BEGIN_PADDR) >> 12) + 1,
    8. PHYSICAL_MEMORY_END >> 12
    9. );
    10. crate::timer::init();
    11. loop {}

    运行一下,可以发现屏幕上仍在整齐的输出着 100 ticks! 我们回过头来验证一下关于读、写、执行的权限是否被正确处理了。 写这么几个测试函数:

    这说明内核意识到出了某些问题进入了中断,但我们并没有加以解决。 我们在中断处理里面加上对应的处理方案:

    我们再依次运行三个测试,会得到结果为:

    从中我们可以清楚的看出内核成功的找到了错误的原因,内核各段被成功的设置了不同的权限。我们达到了内核重映射的目的!目前的代码能在这里找到。