首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

zImage内核镜像解压过程详解 03

zImage内核镜像解压过程详解 03

ZRELADDR := $(zreladdr-y)
  在arch/arm/boot/compressed/Makefile文件中
  zreladdr=$(ZRELADDR)
  在arch/arm/boot/compressed/Makefile中有
  .word zreladdr @ r4
  内核就是用这种方式让代码知道最终运行的位置的
  接下来再回答第2个问题
  decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,
  int arch_id)
  l output_start:指解压后内核输出的起始位置,此时它的值参考上面的图表,紧接在解压缓冲区后;
  l free_mem_ptr_p:解压函数需要的内存缓冲开始地址;
  l ulg free_mem_ptr_end_p:解压函数需要的内存缓冲结束地址,共64K;
  l arch_id :architecture ID,对于SMDK2410这个值为193;
  最后回答第3个问题
  首先看看piggy.o是如何生成的,在arch/arm/boot/compressed/Makefie中
  $(obj)/piggy.o: $(obj)/piggy.gz FORCE
  Piggy.o是由piggy.S生成的,咱们看看piggy.S的内容:
  .section .piggydata,#alloc
  .globl input_data
  input_data:
  .incbin "arch/arm/boot/compressed/piggy.gz"
  .globl input_data_end
  input_data_end:
  再看看misc.c中decompress_kernel函数吧,它将调用gunzip()解压内核。gunzip()在lib/inflate.c中定义,它将调用NEXTBYTE(),进而调用get_byte()来获取压缩内核代码。
  在misc.c中
  #define get_byte() (inptr <insize ? inbuf[inptr++] : fill_inbuf())
  查看fill_inbuf函数
  int fill_inbuf(void)
  {
  if (insize != 0)
  error("ran out of input data");
  inbuf = input_data;
  insize = &input_data_end[0] - &input_data[0];
  inptr = 1;
  return inbuf[0];
  }
  发现什么没?这里的input_data不正是piggy.S里的input_data吗?这个时候应该明白内核是怎样确定piggy.gz在zImage中的位置了吧。
  时间关系,可能叙述的不够详细,大家可以集合内核代码和网上的其它相关文章,理解启动解压过程。
返回列表