免费注册 查看新帖 |

Chinaunix

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

[内核入门] 关于head.s 的几个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-14 08:49 |只看该作者 |倒序浏览
本帖最后由 leslielg 于 2012-09-14 09:37 编辑

arm linux, 2.6.35

1. __create_page_tables 的时候,先

add        r0, r4,  #(KERNEL_START & 0xff000000) >> 18
str        r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]!

将内核链接地址(KERNEL_START=PAGE_OFFSET+TEXT_OFFSET)印射到内核运行的物理地址(由pc计算出来的位置)。

然后

/*
         * Then map first 1MB of ram in case it contains our boot params.
         */
        add        r0, r4, #PAGE_OFFSET >> 18
        orr        r6, r7, #(PHYS_OFFSET & 0xff000000)
        .if        (PHYS_OFFSET & 0x00f00000)
        orr        r6, r6, #(PHYS_OFFSET & 0x00f00000)
        .endif
        str        r6, [r0]

又将PAGE_OFFSET印射到物理地址0的位置。

问题是如果uboot设置内核运行的物理地址不在物理地址0处,那这两个印射是不是就冲突了?第一个印射在页表里被第二个印射覆盖,会不会对kernel产生影响?还是作者知道会覆盖,但是后来kernel有处理,所以不会导致影响?

2. add        r0, r4,  #(KERNEL_START & 0xff000000) >> 18
        str        r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]!

为何设置页表要先取最高8位,然后再加上后面4位?不能直接取得12位的页表项?

3. #define THREAD_START_SP                (THREAD_SIZE - 8 )

为何这里要减去8?


先谢了!

论坛徽章:
0
2 [报告]
发表于 2012-09-14 10:46 |只看该作者
lz从哪里看出来是0地址的,PHYS_OFFSET又不一定是0地址了,而且映射的方向好像也搞反了,
看看这篇文章http://blog.chinaunix.net/uid-20543672-id-3019565.html

论坛徽章:
0
3 [报告]
发表于 2012-09-14 11:56 |只看该作者
回复 2# moonsunearth

假设物理地址从0开始,我这个平台的PHSY_OFFSET是0,这个常数的具体数值应该不影响结果。
印射反了应该不可能吧,2.6.35的arm平台都是用的这个代码,在页表里填的物理内存地址,怎么反了?

你给的链接是3.0的kernel,变化挺大的了,先不讨论。


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP