linux 内核启动代码分析

上传人:汽*** 文档编号:477582781 上传时间:2022-07-27 格式:DOC 页数:12 大小:58.50KB
返回 下载 相关 举报
linux 内核启动代码分析_第1页
第1页 / 共12页
linux 内核启动代码分析_第2页
第2页 / 共12页
linux 内核启动代码分析_第3页
第3页 / 共12页
linux 内核启动代码分析_第4页
第4页 / 共12页
linux 内核启动代码分析_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《linux 内核启动代码分析》由会员分享,可在线阅读,更多相关《linux 内核启动代码分析(12页珍藏版)》请在金锄头文库上搜索。

1、linux 内核启动代码分析(我们使用的cpu是采用xscale技术的pxa250,具体的开发板是cerfboard。这里的代码解释都是根据pxa250进行的。不过,正如我们下面会看到,大部分的代码都是和具体的pxa型号无关的。另外,我们列出代码的行号仅仅为了解释方便,并不是代码在源文件中真正的行号。1. bootloader及内核解压bootloader将内核加载到内存中,设定一些寄存器,然后就将控制权交由内核了,这时并不需要打开MMU功能。一般,我们所说的内核都是指被压缩了的内核piggy.gz,其与head.o、misc.o和head-xscale.o一起构成最终的内核代码。启动内核的过

2、程首先包括解压,最先执行的代码是: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/

3、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.ty

4、pestext, #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?13m

5、oveqr0, #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_pro

6、cessor_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;22unsi

7、gned long_cpu_mmu_flags;/* used by head-armv.S */23unsigned long_cpu_flush;/* used by head-armv.S */24const char*arch_name;25const char*elf_name;26unsigned intelf_hwcap;27struct proc_info_item*info;28struct processor*proc;29;对于采用xscale技术pxa250,具体的处理器相关信息存放在arch/arm/mm/proc-xscale.S中,这里抽出了与pxa250有关的信

8、息,和struct proc_info_list对照就明白了:30.section .proc.info, #alloc, #execinstr 31_pxa250_proc_info:32.long0x6905210033.long0xfffff7f034#if CACHE_WRITE_THROUGH35.long0x00000c0a36#else37.long0x00000c0e38#endif39b_xscale_setup40.longcpu_arch_name41.longcpu_elf_name42.longHWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCA

9、P_FAST_MULT|HWCAP_EDSP43.longcpu_pxa250_info44.longxscale_processor_functions45.size_pxa250_proc_info, . - _pxa250_proc_info第39行是处理器初始化函数_xscale_setup的地址这里的一些结构随着我们对于代码的深入就会渐渐清晰了,现在我们不用过分纠缠与此。由于第30行.section指示符,上面定义的_pxa250_proc_info信息在编译的时候,被链接到.proc.info区中,而arch/arm/vmlinux-armv.lds中指定一个符号_proc_inf

10、o_begin指向此.proc.info区的起始地址,而_proc_info_end指向此.proc.info区结尾的下一地址。这是GNU的ld的一些功能,各位若不清楚,可以查看ld的手册。_proc_info_begin = .;*(.proc.info)_proc_info_end = .;这样,我们通过循环就可以访问所有的struct proc_info_list类型的对象了。好了,做了这么多铺垫,我们来看看_lookup_processor_type函数吧:46_lookup_processor_type:47adrr5, 2f get runtime address 48ldmiar

11、5, r7, r9, r1049subr5, r5, r10 convert addresses, offset between 50 runtime address and link address51addr7, r7, r5 to our address space52addr10, r9, r553mrcp15, 0, r9, c0, c0 get processor id541:ldmiar10, r5, r6, r8 value, mask, mmuflags55andr6, r6, r9 mask wanted bits56teqr5, r657moveqpc, lr58addr

12、10, r10, #36 sizeof(proc_info_list)59cmpr10, r760blt1b61movr10, #0 unknown processor62movpc, lr6364/*65 * Look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.ch for66 * more information about the _proc_info and _arch_info structures.67 */682:.long_proc_info_end69.long_proc_info_begin70.long2

13、b71.long_arch_info_begin72.long_arch_info_end第6869行就是我们刚才说的指向.proc.info区起始和结尾地址的符号,在第47行,我们将第68行代码的地址放到r5中,那么作为指针,r5指向的(非是r5的内容)是.proc.info区结尾的下一地址_proc_info_end。第48行结果是r7=_proc_info_end,r9= _proc_info_begin,r10=第70行的地址这个函数执行完毕后,寄存器情况如下:r8 = page table flagsr9 = processor IDr10 = pointer to processo

14、r structure(成功时),r10 = 0 (失败时)2.3 _lookup_architecture_type类似于struct proc_info_list,每个机器(某种开发板)都有自己特定的体系结构,如物理内存地址,物理I/O地址,显存起始地址等等,这个结构为struct machine_desc:struct machine_desc /* Note! The first four elements are used* by assembler code in head-armv.S*/unsigned intnr;/* architecture number*/unsigne

15、d intphys_ram;/* start of physical ram */unsigned intphys_io;/* start of physical io*/unsigned intio_pg_offst;/* byte offset for io page tabe entry*/const char*name;/* architecture name*/unsigned intparam_offset;/* parameter page*/unsigned intvideo_start;/* start of video RAM*/unsigned intvideo_end;/* end of video RAM*/unsigned intreserve_lp0 :1;/* never has lp0*/unsigned intreserve_lp1 :1;/* n

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号