新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > zImage内核镜像解压过程详解

zImage内核镜像解压过程详解

作者:时间:2012-08-27来源:网络收藏

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在中的位置了吧。

时间关系,可能叙述的不够详细,大家可以集合内核代码和网上的其它相关文章,理解启动解压


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭