c - 我怎样才能跳到更高的半内核

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

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

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

最佳答案

我的内核,K-OS , 这样做。

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

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

关于c - 我怎样才能跳到更高的半内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16099665/

相关文章:

c++ - C 中参数中的 --i 和 i - 1 有什么区别?

c++ - preempt_disable/enable 和 raw_local_irq_save/restore 在基准测试中的作用

c - linux的用户空间如何分配内存

virtual-memory - 页表如何存储在主内存中?

c - OS X 10.9.2 上 Eclipse 4.3.0 中 C 的 "Launch failed. Binary not found"错误

c - C中结构成员的默认值

c - 每 0.008 秒从 MATLAB Simulink 获取 .txt 文件中的数据

程序集引导加载程序未跳转到内核

c - RLIMIT_STACK 包含环境变量和命令行参数或独占

c - 了解 pagedir_get_page() 中用户、内核和物理地址之间的关系