1

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

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

4

1 回答 1

0

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

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

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

于 2013-08-05T00:30:55.207 回答