zImage內核鏡像解壓過程詳解
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中的位置了吧。
時間關系,可能敘述的不夠詳細,大家可以集合內核代碼和網上的其它相關文章,理解啟動解壓過程。
評論