免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: darling54454
打印 上一主题 下一主题

[内存管理] linux arm 页表建立。 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
11 [报告]
发表于 2015-01-07 19:13 |只看该作者
回复 9# darling54454


    head_common.S中

__mmap_switched:
        adr        r3, __mmap_switched_data

        ldmia        r3!, {r4, r5, r6, r7}
        cmp        r4, r5                                @ Copy data segment if needed
1:        cmpne        r5, r6
        ldrne        fp, [r4], #4
        strne        fp, [r5], #4
        bne        1b

        mov        fp, #0                                @ Clear BSS (and zero fp)
1:        cmp        r6, r7
        strcc        fp, [r6],#4
        bcc        1b

ARM(        ldmia        r3, {r4, r5, r6, r7, sp})              栈顶就是全局结构体init_thread_union,你可以看到只有部分有初值,cpu字段编译时自动填为0了,你可以反汇编vmlinux就能确认cpu字段的初值(从System.map里找到init_thread_union的地址,然后再在vmlinux的反汇编里去查看)
THUMB(        ldmia        r3, {r4, r5, r6, r7}        )
THUMB(        ldr        sp, [r3, #16]                )
        str        r9, [r4]                        @ Save processor ID
        str        r1, [r5]                        @ Save machine type
        str        r2, [r6]                        @ Save atags pointer
        cmp        r7, #0
        bicne        r4, r0, #CR_A                        @ Clear 'A' bit
        stmneia        r7, {r0, r4}                        @ Save control register values
        b        start_kernel

所以在start_kernel之前,thread_info.cpu就已经为0了,所以在boot_cpu_init处cpu id为0


论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
12 [报告]
发表于 2015-01-07 19:17 |只看该作者
本帖最后由 arm-linux-gcc 于 2015-01-07 19:48 编辑

回复 10# darling54454


    如果只是想看调用流程的话,可以用ftrace


其实编译也不浪费时间,你在uboot用tftp下载kernel,这样就不用烧flash了,节约了时间
rootfs也可以用nfs,这样你就只需要烧一个uboot就行了
以后不管是改kernel还是改app,都无需烧flash

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
13 [报告]
发表于 2015-01-07 19:20 |只看该作者
本帖最后由 arm-linux-gcc 于 2015-01-07 19:47 编辑

回复 10# darling54454


    年轻真好啊,有劲钻研,我特么都搞不动了,年龄大了,脑力下降了很多
岁数大了工作也不怎么好找,现在好多公司都只要年轻人

论坛徽章:
0
14 [报告]
发表于 2015-01-07 20:30 |只看该作者
回复 11# arm-linux-gcc


如果不是有这种专研劲,应该也不会来深入内核源码了。
这个论坛里,经常看到你来回答一些博文。挺好的,挺感谢的,哈哈。

这么说的话,对于init_thread_info.cpu就一定为0.
在smp_setup_processor_id函数里面,
        u32 cpu = is_smp() ? read_cpuid_mpidr() & 0xff : 0;
        cpu_logical_map(0) = cpu;

就是把当前的cpu ID赋值到__cpu_logical_map[0],
是不是说明,cpu存放的并不是CPU ID号,而是该数组的下标号,然后可以取得真正的CPUID。
这个只是我的推测。

至于其他一些进程中这个cpu域,如何赋值的,还得去了解一下。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
15 [报告]
发表于 2015-01-07 22:02 |只看该作者
本帖最后由 arm-linux-gcc 于 2015-01-07 22:04 编辑

回复 14# darling54454


    cpu有好几个id,这处代码具体什么意义没仔细研究过,你可以看一下armv7-a的手册
B3.18(在这一节中搜索MPIDR)  B4.1.106这两节,文件太大传不上来,去我云盘里下载吧
http://yunpan.cn/cyP2FNEGn5s4P
提取码 af49



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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP