免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1333 | 回复: 4
打印 上一主题 下一主题

[内核入门] 为何startup_32中,要将 $swapper_pg_dir减去oxc0000000,然后才放入cr3中? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-30 11:45 |只看该作者 |倒序浏览
  1. movl $swapper_pg_dir-0xc0000000,%eax
  2. movl %eax,%cr3 /* set the page table pointer.. */
  3. movl %cr0,%eax
  4. orl $0x80000000,%eax
  5. movl %eax,%cr0 /* ..and set paging (PG) bit */
复制代码
RT,请问,这个时候$swapper_pg_dir不已经是物理地址了么?
我是新手,求大神帮助,谢谢谢谢。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2015-07-30 17:34 |只看该作者
swapper_pg_dir作为vmlinux里的一个普通symbol,它的值必定是在link阶段就决定了。就像用户态程序的main值一样。
所以不可能是物理地址。

论坛徽章:
0
3 [报告]
发表于 2015-07-30 17:58 |只看该作者
回复 2# nswcfd


    HI,你好,我刚刚仔细的查阅了很多的资料,好像kernel被放在了物理地址0x100000上面,Linux kernel在编译的时候,其指令中涉及的地址都是以0xc0100000为偏移的,不是以0xc0000000为偏移的。所以在开启分页机制之后,就不需要pa()之类的操作了。
不知道我这样的理解对不对,还请指导一下。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2015-07-30 18:25 |只看该作者
关于这些符号的逻辑地址,可以直接从vmlinux里查看。比如使用nm vmlinux | grep startup_32。

相关的链接脚本是arch/i386/kernel/vmlinux.lds.S
  1. #define LOAD_OFFSET     __PAGE_OFFSET
  2. #define LOAD_PHYSICAL_ADDR ((0x100000 + CONFIG_PHYSICAL_ALIGN - 1) \
  3.                                 & ~(CONFIG_PHYSICAL_ALIGN - 1))
  4. SECTIONS
  5. {
  6.   . = LOAD_OFFSET + LOAD_PHYSICAL_ADDR;   #这就是0xc010000的由来,它的意思是,从这里开始给符号分配逻辑地址,不影响pa和va之间的PAGE_OFFSET的偏移关系。
  7.   ....
  8. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2015-07-31 09:17 |只看该作者
非常感谢您的回答,谢谢谢谢 回复 4# nswcfd


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP