【问题标题】:how can I jump to the higher half kernel我怎样才能跳转到上半部分内核
【发布时间】:2013-04-12 13:18:19
【问题描述】:

我目前正在构建更高半的内核,我的引导加载程序在物理地址 0x100000(1M) 处加载内核,并且身份映射已设置为 0-4MB。问题来了:如何跳转到更高的虚拟地址(例如 3GB)。

我用谷歌搜索了这个问题,发现了两种方法:一种是使用地址空间扭曲,一种是设置页面条目以将 3GB~3GB+4MB 映射到 0-4MB,然后“跳转”到更高的地址。我决定使用第二种方式,但找不到足够的信息来实现它。我反汇编了我的内核,发现所有的地址都是绝对的,所以我相信一个“jmp”指令是不够的。我能想到的唯一方法是在 3GB 以上的虚拟地址中有一个函数,我们在较低空间调用这个函数,然后我们将在高空间执行,这个函数永远不应该返回。如果这是真的,我该怎么做?

【问题讨论】:

标签: c kernel virtual-memory osdev virtual-address-space


【解决方案1】:

我的内核 K-OS 就是这样做的。

基本上,您需要编写一个链接描述文件来将您的整个内核转移到所需的“Higher-half”地址(参见this)。然后,您需要附加一个小汇编程序 sn-p(参见 this),这是内核的入口点。

这个 sn-p 应该只使用相对地址,并且应该为高半部分设置页表(将整个内核映射到您在链接描述文件中所说的位置)。最后,该 sn-p 应该 JMP 到“Higher-half”入口点,然后调用 C 代码。

【讨论】:

    猜你喜欢
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2017-09-05
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多