linux+内核启动代码分析.doc
上传人:sy****28 上传时间:2024-09-14 格式:DOC 页数:22 大小:59KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

linux+内核启动代码分析.doc

linux+内核启动代码分析.doc

预览

免费试读已结束,剩余 12 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

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=machinetypenumber,对于MACH_TYPE_PXA_CERF是139r2=physicaladdressoftaggedlistinsystemRAM.2.1stextENTRY(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@makesuresvcmode6msrcpsr_c,r0@andallirqsdisabled7bl__lookup_processor_type8teqr10,#0@invalidprocessor?9moveqr0,#'p'@yes,error'p'10beq__error11bl__lookup_architecture_type12teqr7,#0@invalidarchitecture?13moveqr0,#'a'@yes,error'a'14beq__error15bl__create_page_tables16adrlr,__ret@returnaddress17addpc,r10,#12@initialiseprocessor18@(returncontrolreg)第5行,准备进入SVC工作模式,同时关闭中断(I_BIT)和快速中断(F_BIT)第7行,查看处理器类型,主要是为了得到处理器的ID以及页表的flags,详细说明见下。第11行,查看一些体系结构的信息,详细说明见下。第15行,建立页表。第17行,跳转到处理器的初始化函数,其函数地址是从__lookup_processor_type中得到的,需要注意的是第16行,当处理器初始化完成后,会直接跳转到__ret去执行,这是由于初始化函数最后的语句是movpc,lr。2.2__lookup_processor_type我们先来看看__lookup_processor_type函数,我们知道arm系列的处理器有arm7、arm9、arm10以及xscale等,可是如何区分呢?在内核中有个结构structproc_info_list,用来记录处理器相关的信息:19structproc_info_list{20unsignedintcpu_val;21unsignedintcpu_mask;22unsignedlong__cpu_mmu_flags;/*usedbyhead-armv.S*/23unsignedlong__cpu_flush;/*usedbyhead-armv.S*/24constchar*arch_name;25constchar*elf_name;26unsignedintelf_hwcap;27structproc_info_item*info;28structprocessor*proc;29};对于采用xscale技术pxa250,具体的处