LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3129|回复: 2

[Linux]最近在看深入理解Linux第二版,有个问题感到很困惑

[复制链接]
发表于 2007-3-13 13:27:41 | 显示全部楼层 |阅读模式
在该书的72页,关于在汇编函数startup_32()中启动MMU的分页功能的语句
  movl  $swarpper_pg_dir - 0xc0000000, %eax
   movl %eax , %cr3 /*设置页面指针*/
我不理解为何要用swarpper_pg_dir的地址减去0xc0000000,因为此时CPU
还处于实模式,那么全局变量swarpper_pg_dir的地址就应该是物理地址。为
何要减去0xc0000000呢?请那位高手帮我解答。
发表于 2007-4-6 13:51:58 | 显示全部楼层
我猜是这样的: 在编译的时候 base address 是 0xc0000000, 这样在得到的object文件中的地址都是 0xc0000000 偏移的, 要得到实地址(因为 cr3寄存器需要实地址), 所以要减去一个 0xc0000000.
回复 支持 反对

使用道具 举报

发表于 2007-4-24 19:49:38 | 显示全部楼层
内核空间是 3G 以上,所以在链接的时候,会把地址定在 0xC000 0000 之上的,对于内核代码而言,3G的空间线性映射到物理地址 0 - max 上,所以,需要减一下;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表