【发布时间】:2011-09-07 12:31:44
【问题描述】:
在初始化我的内核时,我有一些事情需要发生:1)需要启用分页,2)物理内存管理器需要从 grub 解析内存映射,以及 3)需要访问各种启动代码需要留在那里供以后使用的数据(例如 GDT、IDT、内存管理结构)。
这些步骤之间的依赖关系让我发疯。对于高半部分,内核链接到其虚拟地址,因此我提出的选项是 1)在程序集中启用分页,这将涉及跟踪所有多引导指针(在程序集中),因此它们仍然可以访问到物理内存管理器,然后将它们全部取消映射,2)将启动代码链接到其物理地址,然后进行一些指针操作以访问其物理地址的内核结构,或者 3)不使用高半部分内核。
还涉及在编译时不知道物理内存量的情况下引导物理内存管理器。我很确定我必须在分配第一个结构时小心地避免所有多重引导结构,或者首先使用它们然后不要担心覆盖它们(尽管我仍然必须处理模块并且这种方法可能涉及在设置物理内存管理器时将多引导表复制到我需要的已知位置)。
这些问题是我到目前为止一直避免使用高半内核的原因。有没有人有一个很好的系统来解决这些依赖关系?也许this GDT trick 的一些变化可以在其链接/虚拟地址处访问内核和在其物理地址处访问多引导表,或者使用某种预定义的页表来避免上述问题,可能涉及 PSE?
【问题讨论】:
标签: kernel bootstrapping virtual-memory osdev