Когда я вчера писал инструкцию по установке Linux на Amlogic S905 Android TV вчера, я столкнулся с проблемой извлечения kernel.img которую я нашёл в Android прошивке, Но Google мне не помог пока я не нашёл mkboot в инструментах mkbootimg.
Но сначала давайте посмотрим, как создается kernel.img Google предоставляет сценарий на Python под названием mkbootimg, что совмещает образ ядра (Е, .g. ZImage), с корневым файловым / электронным диском и деревом устройств (DTB) файл командной строки выглядит как:
1 |
./mkbootimg --base=0 --kernel_offset=0x01080000 --kernel ${KERNEL} --ramdisk_offset=0x01000000 --ramdisk ./${ROOTFS} --second ${DTBFILE} --output ./kernel.img |
Тем не менее компания AFAIK не обеспечивает сценарий “unmkbootimg” , и mkbootimg может быть использован только для создания kernel.img, его невозможно декомпилировать. Это работает для kernel.img и recovery.img. Давайте получим необходимые файлы:
1 |
git clone https://github.com/xiaolu/mkbootimg_tools |
mkboot является Bash скриптом так, что мы можем использовать его сразу:
1 2 3 4 5 6 7 8 9 10 11 |
cd mkbootimg_tools ./mkboot <Unpack and repack boot.img tool> ---------------------------------------------------------------------- Not enough parameters or parameter error! unpack boot.img & decompress ramdisk: mkboot [img] [output dir] mkboot boot.img boot20130905 Use the unpacked directory repack boot.img(img_info): mkboot [unpacked dir] [newbootfile] mkboot boot20130905 newboot.img |
Его можно использовать как для распаковки так и архивирования kernel.img в / из каталога вывода. Давайте запустим команду к самому файлу kernel.img:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
./mkboot kernel.img k1plus Unpack & decompress ../kernel.img to k1plus kernel : kernel ramdisk : ramdisk page size : 2048 kernel size : 7236663 ramdisk size : 4282196 second_size : 31763 base : 0x01078000 kernel offset : 0x00008000 ramdisk offset : 0xfff88000 second_offset : 0xffe88000 tags offset : 0xfef88100 cmd line : ramdisk is gzip format. Unpack completed. |
Сценарий действительно декомпилирует kernel.img с ядром, в электронный диск, и second.img это файл DTB. img_info содержит информацию, показанную во время извлечения
1 2 3 4 5 6 7 8 |
ls -l k1plus/ total 11364 -rw-rw-r-- 1 jaufranc jaufranc 250 ธ.ค. 7 10:22 img_info -rw-rw-r-- 1 jaufranc jaufranc 7236663 ธ.ค. 7 10:22 kernel drwxrwxr-x 18 jaufranc jaufranc 4096 ธ.ค. 7 10:22 ramdisk -rw-rw-r-- 1 jaufranc jaufranc 4282196 ธ.ค. 7 10:22 ramdisk.packed -rw-rw-r-- 1 jaufranc jaufranc 31763 ธ.ค. 7 10:22 second.img -rw-rw-r-- 1 jaufranc jaufranc 32768 ธ.ค. 7 10:22 second.img.tmp |
second.img и second.img.tmp отличаются по размеру, так что я проверил их через DTC, чтобы получить читаемый файл дерева устройств и в результате файлы оказались идентичны:
1 2 3 |
dtc -I dtb second.img -O dts -o k1plus.dtd dtc -I dtb second.img.tmp -O dts -o k1plus.dtd.tmp diff k1plus.dtd k1plus.dtd.tmp |
Таким образом, временные файлы имеют какое-то дополнение, необходимое для создания second.img.
Теоритически вы можете изменить файлы ядра, randisk или дерево устройств, теперь давайте всё упакуем:
1 |
./mkboot k1plus kernelimg_new.img |
Но пока это ещё не работает так как нам надо:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
mkbootimg from k1plus/img_info. board : k1plus kernel : kernel ramdisk : new_ramdisk page size : 2048 kernel size : 7236663 ramdisk size : 4282403 second_size : 31763 base : 0x01078000 kernel offset : 0x00008000 ramdisk offset : 0xfff88000 second_offset : tags offset : 0xfef88100 cmd line : ramdisk is gzip format. Traceback (most recent call last): File "/home/jaufranc/edev/mini_mx/mkbootimg_tools/mkbootimg", line 140, in <module> main() File "/home/jaufranc/edev/mini_mx/mkbootimg_tools/mkbootimg", line 133, in main img_id = write_header(args) File "/home/jaufranc/edev/mini_mx/mkbootimg_tools/mkbootimg", line 57, in write_header args.pagesize)) # flash page size we assume struct.error: 'I' format requires 0 <= number <= 4294967295 Make boot.img Error! pls check img_info file. ... |
Если мы посмотрим на первую команду ./mkbootimg , мы можем увидеть некоторые отличия в декомпиляции образа, так что я изменил img_info по первой командной строке, с базой = 0, = 0x01080000 kernel_offset и ramdisk_offset = 0x01000000, и все получилось:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
./mkboot k1plus kernelimg_new.img mkbootimg from k1plus/img_info. kernel : kernel ramdisk : new_ramdisk page size : 2048 kernel size : 7236663 ramdisk size : 4282403 second_size : 31763 base : 0 kernel offset : 0x01080000 ramdisk offset : 0x01000000 second_offset : tags offset : 0xfef88100 cmd line : ramdisk is gzip format. Kernel size: 7236663, new ramdisk size: 4282403, kernelimg_new.img: 11556864. kernelimg_new.img has been created. |
Благодарим сайт Cnx-software.com за предоставленную информацию.
Оригинал статьи тут