在我的理解是把uImage通過對圖像運行mkimage生成了
你的理解是隻是部分正確。
A uImage可以包含任何類型的文件,並且不限於Linux 圖片文件。實際上它不可能是(未壓縮的)文件(因爲這不是傳統的使選項)。
在另一方面的zImage是壓縮圖像,它不包含加載地址和入口點(我的想法,糾正我,如果我'[原文]錯)
你是不正確的,它包含了內核的加載地址和入口點。爲了將內核映像解壓到適當的RAM地址,需要加載地址。內核的入口點在解壓後需要執行。
當構建用於ARM圖像和的zImage中,生成文件使用
ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
應翻譯的物理內存+爲0x8000開始。
zImage本身(即自解壓程序)是PIC,與位置無關的代碼。 zImage可以加載到RAM中的任何地方,並在其第一個地址執行,即它的入口點是它的加載地址。
在這種情況下,爲什麼使用uImage而不是zImage?
對於老版本的U-Boot,沒有別的選擇,因爲bootz命令可能沒有可用於Linux內核。
時下它可能是一種主觀選擇。
請注意,Linux內核社區對於在內核中支持U-Boot存在一些不滿。如果某些人有他們的方式,我會覺得你不能從主線源創建一個uImage。
我想知道什麼是zImage和uImage的格式,請問您能推薦一些參考嗎?
zImage的佈局本質上是由其鏈接器規範給出的。
有關ARM,請參閱arch/arm/boot/compressed/vmlinux.lds.S。
請注意,_magic_start包含無意義的加載地址。這也在文森特·桑德斯Booting ARM Linux
The zImage has a magic number and some useful information near its beginning.
Table 2. Useful fields in zImage head code
Offset into zImage Value Description
0x24 0x016F2818 Magic number used to identify this is an ARM Linux zImage
0x28 start address The address the zImage starts at
0x2C end address The address the zImage ends at
The start and end offsets can be used to determine the length of the compressed image (size = end - start).
...
The start address is usually 0 as the zImage code is position independent.
說明第5部分提到然而,該ARM啓動的要求已經由羅素國王Documentation/arm/Booting
一個的uImage的佈局取代簡直是U-Boot的頭加圖像文件,無論可能。
(希望沒有我寫什麼矛盾湯姆·里尼寫了。)
謝謝1「A的uImage可以包含任何類型的文件,並不僅限於Linux映像文件」,你能告訴例子uImage可以包含哪個文件? 2-「你是不正確的,zImage確實包含內核的加載地址和入口點」,我說的是引導設備加載地址而不是內核加載地址,無論如何,我想我已經明白了; zImage是PIC,所以無論它在哪裏加載 – Mouin
(1)頭文件有一個字節,用於編碼圖像的類型。請參閱http://elixir.free-electrons.com/u-boot/latest/source/include/image.h#L197以獲取超過三十種可能的值。 (2)zImage在偏移量0x28處包含其加載地址(但似乎沒有人使用它)。 – sawdust
好的,清楚,謝謝 – Mouin