我正在尝试启动Apple的XNU内核(sources)的自定义分支。内核是用汇编程序,C和C ++组合编写的。我目前正在尝试从_start
函数跳转到vstart
,该函数由汇编程序执行,因为它执行了低级操作,用{C}编写。
我在地址0x10BFF8
上遇到页面错误,由于IDT尚未设置,因此会升级为三重错误。现在,问题是,我有2048个PTD条目,每个条目映射2MB;第0个从内存底部(地址零)延伸到地址0x200000
,其中包括0x10BFF8
。
Here are the page tables I’m using。为什么BootPTD
数组中的第0页表不被尊重?我确定它只是 被忽略的第0页表。在三重故障时,寄存器转储表示指令指针指向地址0x2D15C0
,即vstart
的地址。该地址属于第一个PTD的范围。如果没有PTD被尊重,我会改为在该地址上出现页面错误。
(请注意,尽管数组名为BootPDT
,但每个条目中都设置了PS
位,告诉CPU每个条目映射2MB内存,而不是指向PTE映射4K内存。)