网站大量收购独家精品文档,联系QQ:2885784924

linux 内核启动代码分析.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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.S arch/arm/boot/compressed/head-xscale.S arch/arm/boot/compressed/misc.c 上面代码主要任务是解压真正的内核代码,真正的内核代码是从head-armv.S开始,以后提到的内核都是指真正的内核: arch/arm/kernel/head-armv.S 2. 内核启动第一阶段 内核启动第一阶段是从ENTRY(stext)到c语言函数start_kernel,这一部分涉及的代码有 arch/arm/kernel/head-armv.S arch/arm/mm/proc-xscale.S 在bootloader调用内核运行之前,要在指定的寄存器中存放参数,如下: r0 = 0, r1 = machine type number,对于MACH_TYPE_PXA_CERF是139 r2 = physical address of tagged list in system RAM. 2.1 stext ENTRY(stext)是整个内核的入口,其代码位于编译后生成的目标文件kernel.o中的.text.init区(section),最后被链接到内核的.init区。 1.section .text.init,#alloc,#execinstr@定义所属区 2.typestext, #function@定义符号stext为函数符号 3ENTRY(stext) 4movr12, r0 5movr0, #F_BIT | I_BIT | MODE_SVC@ make sure svc mode 6msrcpsr_c, r0@ and all irqs disabled 7bl__lookup_processor_type 8teqr10, #0@ invalid processor? 9moveqr0, #p@ yes, error p 10beq__error 11bl__lookup_architecture_type 12teqr7, #0@ invalid architecture? 13moveqr0, #a@ yes, error a 14beq__error 15bl__create_page_tables 16adrlr, __ret@ return address 17addpc, r10, #12@ initialise processor 18@ (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)

2017meng + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档