head.s中的代码片段如下所示:

movl $swapper_pg_dir-0xc0000000,%eax
movl %eax,%cr3 /* set the page table pointer.. */
movl %cr0,%eax
orl $0x80000000,%eax
movl %eax,%cr0 /* ..and set paging (PG) bit */

在内核启用分页机制之前(当然,现在已经启用了PE标志),它将内核将临时页面目录表的地址加载到%cr3中。

问题是:
我认为内核应该直接将$swapper_pg_dir值放入%eax而不是$swapper_pg_dir-0xc0000000。我知道我错了,但是为什么呢?

最佳答案

内核将内存视为基于0xC0000000。任何内存分配(指针或全局)都位于0xC0000000至0xFFFFFFFF之间。
但是,对于硬件 Controller ,例如MMU或任何协处理器,内存窗口可能基于0x00000000。

因此,当加载指向表或指向HW引擎的描述符的指针时,它必须基于0x00000000

关于linux - 读取head.s(Linux内核文件之一)时遇到一个问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31694531/

10-15 09:20