以高通msm8916平台为例
安卓内核即linux启动的时候是如何加载设备树的呢
又如何根据设备树加载硬件信息,然后将平台相关的代码如何加载进内核中去的呢
首先要了解设备树信息是如何存储的,存储的内容是什么,内核如何去找这个信息
在kernel/arch/arm64/boot/dts/qcom/目录下有很多dts dtsi文件
哪一个是msm8916平台所需要的呢,最后如何编译,编译结果放在哪儿了,最后内核从哪儿去找?
在kernel/arch/arm64/boot/dts/qcom/目录下有个makefile
dtb-$(CONFIG_ARCH_MSM8916) += XXXX.dtb \
XXXXX.dtb \
.....
可以看见 根据CONFIG_ARCH_MSM8916这个宏,可以找到所需要的dtb文件
根据dts文件的格式
根节点是 /
然后根据根节点遍历所有节点
就能把设备信息给抓出来了
最后编译的时候是将dts文件编译成dtb
最后放在boot.img里
然后bootloader在引导kernel的时候会传入参数
这个参数就是dtb的物理地址,内核就通过这个地址去寻找dts
具体参考set_machion_fdt()函数
dts文件主要参数是
名称
内容
比如
memory
0x00000000 0x80000000
即memory设备 起始地址0 长度2G
然后内核就根据这些信息 建立内存映射表 等等
同样的,几乎所有设备信息 比如中断 i2c 都可以通过设备树进行描述