生活随笔
收集整理的這篇文章主要介紹了
mkimage使用与解包
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在最初學(xué)習(xí)階段,我們經(jīng)常使用mkimage來(lái)制作uImage和ramdisk,實(shí)質(zhì)是在被處理的文件前面加上64字節(jié)的頭部。在到后來(lái),我們可以將多個(gè)內(nèi)核+多個(gè)設(shè)備樹(shù)文件+ramdisk打包成一個(gè) linux.itb 文件,用于一個(gè)鏡像文件支持多平臺(tái)啟動(dòng),同樣是使用 mkimage 工具來(lái)制作,不難猜測(cè),它也是將這多個(gè)文件按照一定的方式進(jìn)行組合,然后再在文件的開(kāi)頭加上64字節(jié)的頭部。
有時(shí)候難免悲劇發(fā)生,發(fā)現(xiàn)自己ramdisk.img的源碼找不到了,又懶重新制作,但是又需要對(duì)鏡像進(jìn)行修改,無(wú)奈之下我們需要解包(或者你想窺探一下別人鏡像里的秘密),如何解包是本文的重點(diǎn),mkimage工具的使用方法,一帶而過(guò)。
mkimage 制作 uImage
mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-3.0 -d zImage uImage
mkimage 制作 ramdisk.img
dd if=/dev/zero of=ramdisk.ext4 bs=1M count=0 seek=32
mkfs.ext4 -F -i 4096 ramdisk.ext4 -d ramdisk
gzip --best -c ramdisk.ext4 > ramdisk.ext4.gz
mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.ext4.gz ramdisk.img
mkimage 制作 itb 文件,它使用一個(gè)its文件來(lái)描述itb內(nèi)部構(gòu)造
mkimage -f linux_arm32.its linux.itb
制作好linux.itb文件之后,在uboot階段將其加載到內(nèi)存中,使用bootm命令進(jìn)行啟動(dòng),例如:
bootm 0x4a000000#ls1012afrwy;
its 文件示例如下:
/dts-v1/;/ {description = "Image file for the QorIQ ARM 32b Linux Kernel";#address-cells = <1>;images {kernel-v7 {description = "ARM32 Linux kernel";data = /incbin/("../../build/linux/kernel/arm32/zImage.v7");type = "kernel";arch = "arm";os = "linux";compression = "none";load = <0x80008000>;entry = <0x80008000>;};kernel-v8 {description = "ARM32 Linux kernel";data = /incbin/("../../build/linux/kernel/arm32/zImage.v8");type = "kernel";arch = "arm";os = "linux";compression = "none";load = <0x80008000>;entry = <0x80008000>;};initrd {description = "initrd for arm32";data = /incbin/("../../packages/rfs/ramdiskrfs/ramdisk_rootfs_arm32.ext4.gz");type = "ramdisk";arch = "arm";os = "linux";compression = "none";};ls1021atwr-dtb {description = "Flattened Device Tree blob";data = /incbin/("../../build/linux/kernel/arm32/ls1021a-twr.dtb");type = "flat_dt";arch = "arm";compression = "none";load = <0x90000000>;};ls1043ardb-dtb {description = "Flattened Device Tree blob";data = /incbin/("../../build/linux/kernel/arm32/fsl-ls1043a-rdb-sdk.dtb");type = "flat_dt";arch = "arm";compression = "none";load = <0x9ffe0000>;};};configurations {ls1021atwr {description = "Boot Linux kernel";kernel = "kernel-v7";fdt = "ls1021atwr-dtb";ramdisk = "initrd";};ls1043ardb {description = "Boot Linux kernel";kernel = "kernel-v8";fdt = "ls1043ardb-dtb";ramdisk = "initrd";};};
};
本文重點(diǎn)mkimage 解包 uImage ramdisk.img 只需要除去64字節(jié)頭部,即可得到原始文件。 例如:dd if=ramdisk.img of=ramdisk.img.gz skip=64 bs=1 對(duì)于itb文件,由于它是多個(gè)文件,因此我們只去除頭部是不夠的,還需要進(jìn)一步處理,不過(guò)呢,我們可以借助uboot中一個(gè)另外一個(gè)工具:dumpimage (2015之后的版本才有,位于tools目錄)
Usage: /tmp/dumpimage -l image-l ==> list image header information/tmp/dumpimage -i image -T type [-p position] [-o outfile] data_file-i ==> extract from the 'image' a specific 'data_file'-T ==> set image type to 'type'-p ==> 'position' (starting at 0) of the 'data_file' inside the 'image'/tmp/dumpimage -V ==> print version information and exit
-T 這里始終指定為 flat_dt 即可。 -p 指的是its文件中的images索引,例如 kernel-v7 為0,kernel-v8 為1
例如,想解壓出linux.itb中的 kernel-v7
dumpimage -i ./linux.itb -T flat_dt -p 0 zImage.v7
?
總結(jié)
以上是生活随笔 為你收集整理的mkimage使用与解包 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。