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/