Higher Half Kernel

来自osdev
Zhang3讨论 | 贡献2022年3月18日 (五) 09:13的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

This article is a stub! 此页面或段落为 草稿。 你可以通过更精确的编辑贡献 来帮助本wiki。

内核设计
模型
其它概念

向每个用户进程中映射内核是传统做法的,通常也是比较好的做法。 例如,Linux和许多其它类Unix系统内核驻留在每个地址空间的虚拟地址 “0XC0000000-0XFFFFFFFF”,用户代码、数据、堆栈、库等的范围为 “0x00000000-0xbffffff”。 有这种设计的内核因为相对与应用程序,内核使用了“higher half(高一半)”的虚拟地址空间。(译者注:注意,这里指的是虚拟地址空间的相对关系。Higher Half Kernel也许可以翻译为“置高内核”,下文不翻译。)

此外,还有一些非x86 ISA (MIPS RISC ArchitectureARM)在一定程度上导致了必须使用该设计。 在MIPS和ARM系统上,使用高位 (位31还是位63,取决于系统字宽) 的地址保留用于主管模式( Supervisor mode),并且在用户模式(User mode)下使用会设置异常捕获。

higher half内核的优点是:

  • 更容易设置VM86-虚拟8086模式进程,因为1MB以下的区域是用户空间。
  • 针对更一般的CPU架构,用户应用程序不依赖于内核空间的内存有多少 (无论内核是在 “0xC0000000” 、 “0x80000000” 还是 “0xE0000000”...),你的应用程序都可以链接到0x400000),这使得ABI更好。(译者注:这里意思应该是指面对不同物理内存和CPU,这样可以让用户空间没有最小基地址的限制,从0开始,对ABI更好)
  • 如果你的操作系统是64位的,那么32位应用程序将能够使用完整的32位地址空间。
  • 可以使用'助记(Mnemonic)'无效指针,如0xCAFEBABE0xDEADBEEF0xDEADC0DE等。

Bootloader支持

为了让事情变得更简单,一些引导加载程序通过直接加载内核并将其映射到虚拟内存中的上半部分,原生支持higher half内核。

  • BOOTBOOT按设计只支持higher half内核。 它有用 CPascalRustGo编写的Hello World内核示例
  • Limine需要内核中的特殊节,有关如何为Limine编写简单的64位higher half内核的教程,请参阅stivale Bare Bones

初始化

要设置higher half内核,你必须将内核映射到适当的虚拟地址。 当使用直接支持higher half内核的引导协议时,比如BOOTBOOTstivale,内核已经被正确映射。

如何做到这一点基本上取决于何时你希望你的内核相信它处于较高端,以及何时你设置了分页。 如果没有引导加载程序的帮助,你需要一个小的蹦床(trampoline)代码,它在lower half运行,设置higher half分页和jump。

另见

文章

论坛主题