资源描述:
《ArmLinux BOOTLOADER全程详解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、ArmLinuxBOOTLOADER全程详解网上关于Linux的BOOTLOADER文章不少了,但是大都是vivi,blob等比较庞大的程序,读起来不太方便,编译出的文件也比较大,而且更多的是面向开发用的引导代码,做成产品时还要裁减,这一定程度影响了开发速度,对初学者学习开销也比较大,在此分析一种简单的BOOTLOADER,是在三星公司提供的2410BOOTLOADER上稍微修改后的结果,编译出来的文件大小不超过4k,希望对大家有所帮助.1.几个重要的概念COMPRESSEDKERNELandDECOMPR
2、ESSEDKERNEL压缩后的KERNEL,按照文档资料,现在不提倡使用DECOMPRESSEDKERNEL,而要使用COMPRESSEDKERNEL,它包括了解压器.因此要在ram分配时给压缩和解压的KERNEL提供足够空间,这样它们不会相互覆盖.当执行指令跳转到COMPRESSEDKERNEL后,解压器就开始工作,如果解压器探测到解压的代码会覆盖掉COMPRESSEDKERNEL,那它会直接跳到COMPRESSEDKERNEL后存放数据,并且重新定位KERNEL,所以如果没有足够空间,就会出错.Jffs
3、2FileSystem可以使armlinux应用中产生的数据保存在FLASH上,我的板子还没用到这个.RAMDISK使用RAMDISK可以使ROOTFILESYSTEM在没有其他设备的情况下启动.一般有两种加载方式,我就介绍最常用的吧,把COMPRESSEDRAMDISKIMAGE放到指定地址,然后由BOOTLOADER把这个地址通过启动参数的方式ATAG_INITRD2传递给KERNEL.具体看代码分析.启动参数(摘自IBMdeveloper)在调用内核之前,应该作一步准备工作,即:设置Linux内核的启
4、动参数。Linux2.4.x以后的内核都期望以标记列表(taggedlist)的形式来传递启动参数。启动参数标记列表以标记ATAG_CORE开始,以标记ATAG_NONE结束。每个标记由标识被传递参数的tag_header结构以及随后的参数值数据结构来组成。数据结构tag和tag_header定义在Linux内核源码的include/asm/setup.h头文件中.在嵌入式Linux系统中,通常需要由BOOTLOADER设置的常见启动参数有:ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、A
5、TAG_RAMDISK、ATAG_INITRD等。(注)参数也可以用COMMANDLINE来设定,在我的BOOTLOADER里,我两种都用了.2.开发环境和开发板配置:CPU:S3C2410,BANK6上有64M的SDRAM(两块),BANK0上有32MNORFLASH,串口当然是逃不掉的.这样,按照数据手册,地址分配如下:0x4000_0000开始是4k的片内DRAM.0x0000_0000开始是32MFLASH16bit宽度0x3000_0000开始是64MSDRAM32bit宽度注意:控制寄存器中的B
6、ANK6和BANK7部分必须相同.0x4000_0000(片内DRAM)存放4k以内的BOOTLOADERIMAGE0x3000_0100开始存放启动参数0x3120_0000存放COMPRESSEDKERNELIMAGE0x3200_0000存放COMPRESSEDRAMDISK0x3000_8000指定为DECOMPRESSEDKERNELIMAGEADDRESS0x3040_0000指定为DECOMPRESSEDRAMDISKIMAGEADDRESS开发环境:RedhatLinux,armgcctoo
7、lchain,armlinuxKERNEL如何建立armgcc的编译环境:建议使用toolchain,而不要自己去编译armgcc,偶试过好多次,都以失败告终.先下载arm-gcc3.3.2toolchain将arm-linux-gcc-3.3.2.tar.bz2解压到/toolchain#tarjxvfarm-linux-gcc-3.3.2.tar.bz2#mv/usr/local/arm/3.3.2/toolchain在makefile中在把arch=armCROSS_COMPILE设置成toolcha
8、in的路径还有就是INCLUDE=-I../include-I/root/my/usr/local/arm/3.3.2/include.,否则库函数就不能用了3.启动方式:可以放在FLASH里启动,或者用Jtag仿真器.由于使用NORFLASH,根据2410的手册,片内的4KDRAM在不需要设置便可以直接使用,而其他存储器必须先初始化,比如告诉memorycontroller,BANK6里有两块SDRAM,数据宽