Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16312
  • 博文数量: 7
  • 博客积分: 330
  • 博客等级: 一等列兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-01 21:40
文章分类
文章存档

2011年(1)

2010年(6)

我的朋友
最近访客

分类: LINUX

2010-12-18 17:26:42

 

 提纲

              0 方法论

  1)  uboot启动内核

         2 内核启动step 1

         3)  Android启动

 

 

方法论

       苏格哪里说:不懂得方法论的同志不是好同志。

       苏格哪里又说:对Linux内核的分析一定要注意方法论。

本次分析的历程要经历三个大的环节:u-boot引导内核、内核启动并初始化进程、Android启动初始服务。

实施的方式:不为分析而分析,要学以致用,为实践而分析;有分析、有实践、有总结,方能有效果。

 

 1 关于内核镜像的格式

11内核镜像的格式问题

内核编译的最后,可以看到下面的链接和处理过程


  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以上)。如果内核比较小,那么采用zImagebzImage都行,如果比较大应该用bzImage
 uImage U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40tag。可以使用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也能被引导?

 

阅读(564) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~