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:48 编辑
回复 10# darling54454
如果只是想看调用流程的话,可以用ftrace
其实编译也不浪费时间,你在uboot用tftp下载kernel,这样就不用烧flash了,节约了时间
rootfs也可以用nfs,这样你就只需要烧一个uboot就行了
以后不管是改kernel还是改app,都无需烧flash
本帖最后由 arm-linux-gcc 于 2015-01-07 19:47 编辑
回复 10# darling54454
年轻真好啊,有劲钻研,我特么都搞不动了,年龄大了,脑力下降了很多
岁数大了工作也不怎么好找,现在好多公司都只要年轻人 回复 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:04 编辑
回复 14# darling54454
cpu有好几个id,这处代码具体什么意义没仔细研究过,你可以看一下armv7-a的手册
B3.18(在这一节中搜索MPIDR)B4.1.106这两节,文件太大传不上来,去我云盘里下载吧
http://yunpan.cn/cyP2FNEGn5s4P
提取码 af49
页:
1
[2]