ARMlinux的启动部分源代码简略分析

ARMlinux的启动部分源代码简略分析

ID:47630337

大小:336.05 KB

页数:23页

时间:2019-09-27

ARMlinux的启动部分源代码简略分析_第1页
ARMlinux的启动部分源代码简略分析_第2页
ARMlinux的启动部分源代码简略分析_第3页
ARMlinux的启动部分源代码简略分析_第4页
ARMlinux的启动部分源代码简略分析_第5页
资源描述:

《ARMlinux的启动部分源代码简略分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、ARMlinux的启动部分源代码简略分析ARMlinux的启动部分源代码简略分析以友善之臂的mini2440开发板为平台,以较新的内核linux-2.6.32.7版本为例,仅作说明之用。当内核映像被加载到RAMZ后,Bootloader的控制权被释放。内核映像并不是可直接运行的目标代码,而是一个压缩过的zlmage(小内核)。但是,也并非是zlmage映像中的-•切均被压缩了,映像中包含未被压缩的部分,这部分中包含解压缩程序,解压缩程序会解压缩映像中被压缩的部分。zlmage使用gzip压缩的,它不仅仅是一个压缩文件

2、,而且在这个文件的开头部分内嵌有gzip解压缩代码。当zlmage被调用时它从arch/arm/boot/compressed/head.S的start汇编例程开始执行。这个例程进行一些基木的硬件设置,并调用arch/ann/boot/compressed/misc.c屮的decompress_kernel()解压缩内核。arch/arm/kernel/head.S文件是内核真正的启动入口点,一般是由解压缩内核的程序來调用的。首先先看下对于运行这个文件的耍求:MMU=off;D-cache=off;I-cache=无

3、所谓,开也可以,关也可以;rO=0;rl=机器号;r2=atags指针。这段代码是位置无关的,所以,如果以地址0xC0008000来链接内核,那么就可以直接用_pa(0xc0008000)地址来调用这里的代码。其实,在这个(Linux内核中总共有多达儿十个的以head.S命名的文件)head.S文件屮的一项重要工作就是设置内核的临时页表,不然mmu开起来也玩不转,但是内核怎么知道如何映射内存呢?linux的内核将映射到虚地址OxCxxxxxxx处,但他怎么知道在4GB的地址空间中有哪一片mm是可用的,从而可以映射过去

4、呢?因为不同的系统有不通的内存映像,所以,LINUX约定,要调用内核代码,一定要满足上面的调用要求,以为最初的内核代码提供一些最重要的关于机器的信息。内核代码开始的时候,R1存放的是系统目标平台的代号,对于一些常见的,标准的平台,内核已经提供了支持,只要在编译的时候选中就行了,例如对X86平台,内核是从物理地址1M开始映射的。好了好了,看下面的代码。arch/arm/kernel/head.SENTRY(slcxl)是这个文件的入口点。最初的儿行是这样的:setmodePSR_F_BIT

5、PSR_I_BIT

6、SVC_

7、MODE,r9@ensuresvcmode@andirqsdisabled〃设置为svc模式,关闭屮断和快速屮断//此处设定系统的工作状态为SVC,arm有7种状态每种状态〃都有自己的堆栈,SVC为管理模式,具有完全的权限,可以执行任意指令//访问任意地址的内存//setmode是一个宏,其定义为://.macrosetmode,mode,reg//msrcpsr_c,#mode//.endmmrcpl5,0,r9,cO,cO@getprocessoridbl_lookup_processor_type@r5=pr

8、ocinfor9=cpuidmovsrlO,r5@invalidprocessor(r5=0)?beq—error_p@yes,errorp*这儿行是查询处理器的类型的,我们知道arm系列有很多型号,arm7>arm9sarmll>Cortex核等等类型,这么多型号要如何区分呢?其实,在arm的15号协处理器(其实ARM暂时也就这么一个协处理器)屮有一个只读寄存器,存放与处理器相关信息。—lookup_processor_type是arch/arm/kernel/head-common.S文件中定义的一个例程,这个h

9、ead-common.S用include命令被包含在head.S文件中。其定义为:lookup_processor_type:adrr3,3fldmiar3,{r5-r7)subr3,r3,r7addr5,r5,r3addr6,r6,r3ldmiar5,{r3,r4}and『4,r4,r9teqr3,r4beq2faddr3,r3,#8@getoffsetbetweenvirt&phys@convertvirtaddressesto@physicaladdressspace@value,mask@maskwanted

10、bitsaddr5,r5,#PROC」NFO_SZ@sizeof(proc_info_Iist)cmpr5,r6biolb2:movpc,lrmovr5,#0@unknownprocessorENDPROC(—lookup_processor_type)这个例程接受处理器ID(保存在寄存器「9中)为参数,查找链接器建立的支持的处理器表。此时此刻

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。