linux内核启动汇编部分详解
参考文档:https://blog.csdn.net/haoge921026/article/details/46785995 找到入口ENTRY(stext)开始分析 setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE,r9? ? ? @ ensure svc mode? ? ?@ and irqs disabled 设置cpu为svc模式,禁止中断 mrc p15,r9,c0,c0 @ get processor id 读取ARM协处理器cp15的c0寄存器获得CPU ID,存放在r9 CPU ID格式如下: 查手册: cotex_a8_r3p2_trm.pdf 3.2.2节可以获得如下信息? r9 : cpuid(0x413fc082)? ? ? r1:机器码 r2:atag指针 bl __lookup_processor_type @ r5=procinfo r9=cpuid linux内核支持多个cpu,每个cpu对应一个procinfo结构体,这句指令是去查找procinfo结构体中查找是否有这个cpu 查看代码: __lookup_processor_type: adr r3,3f? ? ? ? ? ? ? ? ? ? ? ? ?//将procinfo结构体集的链接首地址的运行指针赋给r3 r3 -> 局部标号3运行地址 add r3,r3,#8 r3 -> 运行地址与链接地址的偏移 r5 -> __proc_info_begin 运行地址 and r4,r4,r9 @ mask wanted bits 查看代码: .align?2 ? ? ?r5=procinfo? ? ? ?r9=cpuid r1:机器码 r2:atag指针 ? ? movs r10,r5 @ invalid processor (r5=0)? r5返回0则去"nError: unrecognized/unrecognized processor variant(0x<cpuid>).n",然后进入死循环 。 ?r9=cpuid? ? ? ??r10=procinfo? r1:机器码 r2:atag指针 ? bl __lookup_machine_type @ r5=machinfo Linux内核支持多个开发板,每个开发板对应多个machinfo结构体,去查找这个结构体集看看是否存在与r1传进来的机器码匹配 存在则返回r5=machinfo,不存在(r5=0)打印Error: unrecognized/unsupported machine ID (r1 = 0x<machine_ID>")然后进入死循环 r9=cpuid? ? ? ??r10=procinfo? r1:机器码 r8=machinfo r2:atag指针 bl __vet_atags 检查atag格式是否正确,不正确会r2=0 bl?__create_page_tables 在0x30004000-0x30008000之间创建16k的页表,将内核代码范围的地址映射到0x30000000 ? ? ldr r13,__switch_data @ address to jump to after r10为主机procinfo结构体首地址,跳转__v7_setup 主要干的事情有: 跳转__switch_data __switch_data中主要请bss,设置栈,保存cpuid,机器码,atags指针 最后用b?start_kernel 跳转内核启动c部分 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |