首先我们从AOSP得知:
设备树 (DT) 是用于描述“不可发现”硬件的命名节点和属性构成的一种数据结构。操作系统(例如在 Android 中使用的 Linux 内核)会使用 DT 来支持 Android 设备使用的各种硬件配置。硬件供应商会提供自己的 DT 源文件,接下来 Linux 会将这些文件编译成引导加载程序使用的设备树 Blob (DTB) 文件。
设备树叠加层 (DTO) 可用于在设备树中主要设备树 blob (DTB) 的基础上叠加信息。使用 DTO 的引导加载程序可以维护系统芯片 (SoC) DT,并动态叠加设备专用的 DT,从而向树中添加节点并对现有树中的属性进行更改
本教程分为三个部分,
一是获取叠加层文件,
二是获取设备树文件,
三是内核配置pstore定位问题,
四是定位内核是否加载驱动问题
五是如何快速对内核call trace(内核Panic<oops级别)溯源(随机重启,CPU软锁)
解包dtbo.img获取叠加层文件 (dtb-overlay)
设备树是描述硬件的数据结构,通过编写dts文件,不同CPU架构的设备都可以跑Linux kernel
1.克隆libufdt工具,用于解开dtbo镜像
git clone https://android.googlesource.com/platform/system/libufdt
2.安装python2
sudo apt install Python2
3.我就看看不进去
ls ~/libuft/utils/src
4.拆镜像
cp [your img path] ~/libuft/utils/src
python2 mkdtboimg.py help all
python2 mkdtboimg.py dump dtbo.img -b device
然后生成了好多好多后缀名是数字的device文件,这些就是设备数叠加层(DTB-Overlay)文件。
通过device tree compiler转换文件内容是数制的设备文件,使人可读。
sudo apt device tree compiler
dtc -I dtb -O dts -o device.dts device.0
mkdir dts
cp device.* dts/
gah0@儿童电脑 ~/mkdtimg/utils/src >$ ls dtsi/
device.0 device.1 …..device.51 device.dts
这里出现后缀名为数字的文件,和你内核存放设备树目录下的Makefile文件里的写入需要编译的设备树文件,数量是不一样的。
解包boot.img获取设备树文件 (DTB)
1.获取与编译
git clone -b master --single-branch https://github.com/PabloCastellano/extract-dtb.git
cd PabloCastellano-master
2.如何运行
cp [ your boot.img file ~/PabloCastellano-master]
./extract-dtb.py -o dtb boot.img
成功后会提示类似的字眼
Dumped 00_kernel, start=0 end=10705757
Dumped 01_dtbdump_mt6779.dtb, start=10705757 end=11890752
Extracted 2 appended dtbs + kernel to dtb
3.打开dtb文件夹
cd $(pwd)/dtb
4.利用dtc解开设备树
dtc -I dtb -O dts -o dtb.dtsi 01_dtbdump_mt6779.dtb
如果你编译内核刷入后开机出现相机错误,外放没声音,触摸坏了等各种异常情况。用此排除原因。不妨看看是否是设备树文件太老了。更新内核设备树可能是解决问题的办法!
定位内核问题
- 内核中配置pstore,pstore可以获取一些内核信息。
adb可用时也可以用于定位内核问题(adb通常在init.rc启动后工作)。
adb cat /proc/kmsg
内核配置pstore
CONFIG_PSTORE=y
CONFIG_PSTORE_CONSOLE=y
CONFIG_PSTORE_PMSG=y
CONFIG_PSTORE_RAM=y
- 偶尔dmesg中出现一堆内存地址的时候,大概是WARN_ON()函数在内核起作用了,不妨跟着日志信息溯源,看看是那些代码或者提交有错误吧。
定位驱动问题
通常我们会遇到一些很棘手的驱动问题,例如Wifi并未启动,声音丢失。
我们可以跟踪设备是否注册驱动。
通过对比我们可以得知。
grus:/ $ cat /proc/devices
得到以下内容
180 usb
189 usb_device
212 DVB
214 qcwlanstate
215 msm_usb_bridge
很好看起来wlan已经注册。
更多的驱动运行内容可以从/sys/kernel/debug
目录获取。
解决内核恐慌,Kernel Panic,日志出现call trace,随机重启
请点击查看