ARM Linux Android启动分析
时间:2010-12-18 来源:socwhere
提纲
0) 方法论
1) uboot启动内核
2) 内核启动step 1
3) Android启动
方法论
苏格哪里说:不懂得方法论的同志不是好同志。
苏格哪里又说:对Linux内核的分析一定要注意方法论。
本次分析的历程要经历三个大的环节:u-boot引导内核、内核启动并初始化进程、Android启动初始服务。
实施的方式:不为分析而分析,要学以致用,为实践而分析;有分析、有实践、有总结,方能有效果。
1 关于内核镜像的格式
1.1内核镜像的格式问题
内核编译的最后,可以看到下面的链接和处理过程:
LD vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gz
AS arch/arm/boot/compressed/piggy.o
CC arch/arm/boot/compressed/misc.o
AS arch/arm/boot/compressed/head-xscale.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
vmlinux编译出来的最原始的内核文件,elf格式,是经过压缩的Image和加入了解压头的elf格式的文件。
zImage是在vmlinux基础上,objcopy处理了的可以直接下到对应的地址执行的内核镜像。
GNU实用工具程序objcopy的作用是拷贝一个目标文件的内容到另一个目标文件中。Objcopy可以使用不同于源目标文件的格式来写目的目标文件(也即是说可以将一种格式的目标文件转换成另一种格式的目标文件)。使用Objcopy产生一个原始的二进制文件,实质上是进行了一回输入目标文件内容的内存转储。所有的符号和重定位信息都将被丢弃。内存转储起始于输入目标文件中那些将要拷贝到输出目标文件去的部分的最小虚地址处。
bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。
uImage 是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。可以使用u-boot 提供的mkimage工具在zImage上打上头,生成uImage。
typedef struct image_header {
uint32_t ih_magic;/* Image Header Magic Number */
uint32_t ih_hcrc; /* Image Header CRC Checksum */
uint32_t ih_time; /* Image Creation Timestamp */
uint32_t ih_size; /* Image Data Size */
uint32_t ih_load; /* Data Load Address */
uint32_t ih_ep; /* Entry Point Address */
uint32_t ih_dcrc; /* Image Data CRC Checksum */
uint8_t ih_os; /* Operating System */
uint8_t ih_arch; /* CPU architecture */
uint8_t ih_type; /* Image Type */
uint8_t ih_comp; /* Compression Type */
uint8_t ih_name[IH_NMLEN]; /* Image Name */
} image_header_t;
2 boot如何启动内核
执行do_bootm
执行do_bootm_linux
3 uboot传递参数给内核
4 不加image_header_t也能被引导?