arm-linux-gcc 发表于 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, , #4
        strne        fp, , #4
        bne        1b

        mov        fp, #0                                @ Clear BSS (and zero fp)
1:        cmp        r6, r7
        strcc        fp, ,#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,                 )
        str        r9,                         @ Save processor ID
        str        r1,                         @ Save machine type
        str        r2,                         @ 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


arm-linux-gcc 发表于 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

arm-linux-gcc 发表于 2015-01-07 19:20

本帖最后由 arm-linux-gcc 于 2015-01-07 19:47 编辑

回复 10# darling54454


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

darling54454 发表于 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,
是不是说明,cpu存放的并不是CPU ID号,而是该数组的下标号,然后可以取得真正的CPUID。
这个只是我的推测。

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

arm-linux-gcc 发表于 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



页: 1 [2]
查看完整版本: linux arm 页表建立。