如何从Android固件文件中提取设备树文件
到目前为止,我们所有廉价的Android设备均基于较旧的Linux内核(3.0.x,3.4.x),该内核仍使用板文件(arch / arm / board),但我们最近看到诸如Amlogic和Rockchip之类的公司发布了源代码使用Linux内核3.10.x时,这些版本之间的主要区别之一是从主板文件转移到扁平化的设备树以及多平台支持。如果完全实现,则单个内核映像应该能够引导多个硬件平台,以及所有低级配置都由设备树文件处理。由于我已经连接了Tronsmart Vega S89的串行端口进行调试,而且这是一个新闻日,所以我认为我可能会尝试引导自己编译的Linux内核,但是挑战之一是获取设备树文件。我将展示如何从固件中提取它。也应该可以直接从闪存中获取它,但是“ cat / proc / mtd”并不像以前的版本那样显示完整的分区列表。
我已经在Ubuntu 14.04中执行了以下步骤。首先要安装一些工具:将用于将dtb(二进制)文件反编译为dtd(文本)文件的设备树编译器,以及将标准PERL脚本从boot.img中提取文件的split_bootimg.pl:
sudo apt-get install device-tree-compiler
wget https://gist.githubusercontent.com/jberkel/1087743/raw/5be96af0e1c1346678379b0c0f0330b71df51f25/split_bootimg.pl
sudo cp split_bootimg.pl /usr/local/bin
sudo chmod +x /usr/local/bin/split_bootimg.pl
我将以M8 / TM8固件(Amlogic S802)为例。确切的过程在固件文件之间会有所不同,但是如果您可以启动boot.img,则该过程应该独立于平台并且适用于任何ARM SoC。下载并解压缩固件文件(TM8 ap6330_03102014A_0410_ROOT.rar)之后,让我们创建一个工作目录,并解压缩“ OTA”文件。
mkdir TM8
cd TM8
unzip ../k200-ota-20140410.zip
现在,我们得到了一堆文件,包括boot.img。很好!是时候运行split_bootimg.pl脚本提取其内容了:
split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 7209567 (0x006e025f)
Ramdisk size: 2024995 (0x001ee623)
Second size: 17699 (0x00004523)
Board name:
Command line:
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.
Writing boot.img-second.gz ... complete.
因此,我们有了内核,虚拟磁盘和恰好是dtb文件的“第二个文件”。现在,我们可以使用dtc(设备树编译器)对其进行反编译,如下所示:
dtc -I dtb boot.img-second.gz -O dts -o meson8_tm8.dtd
就是它。这是M8设备树文件。
对于Tronsmart Vega S89(Elite),我也做过同样的事情。S89固件通常作为IMG文件分发,以与AML Flash Burning工具一起使用,但是我还没有找到提取此类文件的方法。但是,我在freaktab上找到了可以通过SD卡更新的“ OTA”固件,并且可以提取Tronsmart Vega S89 Elite和Vega S89的设备树文件。M8和S89 Elite DTD文件非常相似,但是M8中的最大CPU频率似乎更高,并且还有其他明显的细微差别。Vega S89 DTD文件似乎相差很大。