stm32-uclinux-startkernel之前的汇编代码分析.docxVIP

stm32-uclinux-startkernel之前的汇编代码分析.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
stm32-uclinux-startkernel之前的汇编代码分析

Boot中执行下面两句话之后,进入uclinux内核。 theKernel = (void (*)(int, int, unsigned int))((uint32_t)0; theKernel(0, 2189, ((uint32_t)0); 1 start_kernel之前的汇编代码分析 首先来到0x0800 3000处,此时携带有三个参数,R0、R1、R2,分别是0,2189,0x2000 0100. 0x0800 3000对应着下面stext的汇编代码。 代码阅读说明:  = 1 \* GB3 ① @后面的内容标示是注释语句  = 2 \* GB3 ② ARM或者THUMB指令的选取,在\include\asm-arm\unified.h中,定义了使用ARM,THUMB为空  = 3 \* GB3 ③ 偏移量#PROC_INFO_SZ等,在\include\asm\asm-offset.h中宏定义 head-mommu.S 文件在arch\arm\kernel\head-nommu.S,text.head段,有stext、__after_proc_init两段组成,内核从这里开始启动,然后通过各种调用,最终进入C语言的start_kernel函数,这段代码执行流程如下: 调用__lookup_processor_type,传入R9(CPU基址寄存器的值),成功后获得当前的proc_info结构体信息,地址放入R10; 调用__lookup_machine_type,BootLoader传给内核的R1值,成功后获得当前的machine_desc结构体信息,地址放入R8; 执行__v7m_setup,进行必要的初始化; 执行__switch_data,并最终跳转到C语言的start_kernel函数。 .section .text.head, ax ENTRY(stext) cpsid i @ disable interrupts //cortex-M3特殊指令,关闭所有中断 ldr r9, =0xe000ed00 @ CPUID register address ldr r9, [r9] //CPUID基址寄存器,参考手册(周立功)-P80 bl __lookup_processor_type @ r5=procinfo r9=cupid //head-common.S movs r10, r5 @ invalid processor (r5=0)? beq __error_p @ yes, error p bl __lookup_machine_type @ r5=machinfo movs r8, r5 @ invalid machine (r5=0)? beq __error_a @ yes, error a badr lr, __after_proc_init @ return (PIC) address //提前暂存lr的值 ARM( add pc, r10, #PROCINFO_INITFUNC ) //R10处偏移16个字节,然后赋给PC //相当于跳转到下面的__v7m_setup ENDPROC(stext) __after_proc_init: ldr pc,__switch_data //将PC 指针赋值到__switch_data标号地址处,实际执行的 ENDPROC(__after_proc_init) //是在__mmap_switched这个标号处 .ltorg #include head-common.S //末尾包含下面的文件 head-common.S 文件在arch\arm\kernel\head-common.S,有__switch_data、__mmap_switched、__error_p、__error_a、__error、__lookup_processor_type、C语言的lookup_processor_type、__lookup_machine_type 、C语言的lookup_machine_type、__vet_atags等组成,这里只列出上面调用要使用的查找处理器类型和查找机器类型。 _lookup_processor_type: //r9是刚从CPU基址寄存器中取出的值 ARM( adr r3, 3f ) //执行此句后,r3的地址是后面标号3处的地址 ARM( ldmda r3, {r5 - r7} )//r5,r6,r7依次变为,__proc_info_begin,end,以及

文档评论(0)

2017ll + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档