当初始化我的内核时,我有一些需要发生的事情:1)需要启用分页,2)物理内存管理器需要从grub解析内存映射,3)配套启动代码需要访问需要留在那里的数据(例如GDT,IDT,内存管理结构)。更高一半的内核初始化
这些步骤之间的依赖关系让我疯狂。在更高一半的情况下,内核链接到它的虚拟地址,所以我提出的选项是1)在汇编中启用分页,这将涉及所有多重启动指针(汇编中),以便它们仍然可以访问到物理内存管理器,然后将其全部取消映射,2)将启动代码链接到其物理地址,然后执行一些指针操作来访问其物理地址处的内核结构,或者3)不使用更高一半的核心。
还涉及在编译时不知道物理内存量的情况下引导物理内存管理器。我非常肯定,在分配第一个结构时,我必须小心避免所有的多引导结构,或者先使用它们,然后不要担心覆盖它们(尽管我仍然需要处理模块,并且这种方法很可能涉及将多重引导表复制到已知位置,因为我在设置物理内存管理器时需要它们)。
这些问题是为什么我避免了更高的半内核到现在。有没有人有解决这些依赖关系的好系统?可能在this GDT trick上有一些变化来访问其链接/虚拟地址处的内核以及物理地址处的多重引导表,或者使用某种预先定义的页表避免上述问题,可能涉及PSE?
谢谢!一个问题 - 初始化堆(我猜测)包含重新定位的MBI,当你完成它时可以放弃,但它听起来像它也包含初始映射的页表。一旦你创建了第一个过程,你是否也放弃了这些? – rpjohnst 2011-06-03 12:21:11
@Rusky:是的,MBI可能会被丢弃,但我不这样做,因为它太小了。我不把页面目录和页面表放入堆中,而是放在非常低的内存中(大约4KB)。我不会放弃这些,因为我运行的第一个流程会继承它们。即我的第一个进程将在我初始化期间设置的地址空间中运行。 – Job 2011-06-03 13:58:43