- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
linux 内核启动代码分析
linux 内核启动代码分析(我们使用的cpu是采用xscale技术的pxa250,具体的开发板是cerfboard。这里的代码解释都是根据pxa250进行的。不过,正如我们下面会看到,大部分的代码都是和具体的pxa型号无关的。另外,我们列出代码的行号仅仅为了解释方便,并不是代码在源文件中真正的行号。1. bootloader及内核解压bootloader将内核加载到内存中,设定一些寄存器,然后就将控制权交由内核了,这时并不需要打开MMU功能。一般,我们所说的内核都是指被压缩了的内核piggy.gz,其与head.o、misc.o和head-xscale.o一起构成最终的内核代码。启动内核的过程首先包括解压,最先执行的代码是:arch/arm/boot/compressed/head.Sarch/arm/boot/compressed/head-xscale.Sarch/arm/boot/compressed/misc.c上面代码主要任务是解压真正的内核代码,真正的内核代码是从head-armv.S开始,以后提到的内核都是指真正的内核:arch/arm/kernel/head-armv.S2. 内核启动第一阶段内核启动第一阶段是从ENTRY(stext)到c语言函数start_kernel,这一部分涉及的代码有arch/arm/kernel/head-armv.Sarch/arm/mm/proc-xscale.S在bootloader调用内核运行之前,要在指定的寄存器中存放参数,如下:r0 = 0, r1 = machine type number,对于MACH_TYPE_PXA_CERF是139r2 = physical address of tagged list in system RAM.2.1 stextENTRY(stext)是整个内核的入口,其代码位于编译后生成的目标文件kernel.o中的.text.init区(section),最后被链接到内核的.init区。1.section .text.init,#alloc,#execinstr@定义所属区2.typestext, #function@定义符号stext为函数符号3ENTRY(stext)4movr12, r05movr0, #F_BIT | I_BIT | MODE_SVC@ make sure svc mode6msrcpsr_c, r0@ and all irqs disabled7bl__lookup_processor_type8teqr10, #0@ invalid processor?9moveqr0, #p@ yes, error p10beq__error11bl__lookup_architecture_type12teqr7, #0@ invalid architecture?13moveqr0, #a@ yes, error a14beq__error15bl__create_page_tables16adrlr, __ret@ return address17addpc, r10, #12@ initialise processor18@ (return control reg)第5行,准备进入SVC工作模式,同时关闭中断(I_BIT)和快速中断(F_BIT)第7行,查看处理器类型,主要是为了得到处理器的ID以及页表的flags,详细说明见下。第11行,查看一些体系结构的信息,详细说明见下。第15行,建立页表。第17行,跳转到处理器的初始化函数,其函数地址是从__lookup_processor_type中得到的,需要注意的是第16行,当处理器初始化完成后,会直接跳转到__ret去执行,这是由于初始化函数最后的语句是mov pc, lr。2.2 __lookup_processor_type我们先来看看__lookup_processor_type函数,我们知道arm系列的处理器有arm7、arm9、arm10以及xscale等,可是如何区分呢?在内核中有个结构struct proc_info_list,用来记录处理器相关的信息:19struct proc_info_list {20unsigned intcpu_val;21unsigned intcpu_mask;22unsigned long__cpu_mmu_flags;/* used by head-armv.S */23unsigned long__cpu_flush;/* used by head-armv.S */24const char*arch_na
文档评论(0)