3.1 Base Device Node Types
下面的部分指定了符合dtspec的设备树中所需的基本设备节点集的要求。
所有设备树都应该有一个根节点,以下节点应该出现在所有设备树的根节点上:
• One /cpus node
• At least one /memory node
3.2 Root node
设备树有一个根节点,所有其他设备节点都是它的后代。根节点的全路径为“/”。
3.3 /aliases node
设备树可能有一个别名节点(/aliases),该节点定义一个或多个别名属性。别名节点应位于设备树的根,并具有节点名/别名。
/aliases节点的每个属性定义了一个别名。属性名指定别名。属性值指定设备树中节点的完整路径。例如,属性serial0 = "/simple-bus@fe000000/ serial@llc500"定义了别名serial0。
别名值是一个设备路径,并被编码为字符串。该值表示节点的完整路径,但该路径不需要引用叶节点。
客户端程序可以使用别名属性名将完整的设备路径作为其字符串值的全部或部分来引用。一个客户端程序,当考虑一个字符串作为一个设备路径时,应该检测并使用别名。
aliases {
serial0 = "/simple-bus@fe000000/serial@llc500";
ethernet0 = "/simple-bus@fe000000/ethernet@31c000";
};
3.4 /memory node
所有设备树都需要一个内存设备节点,它描述了系统的物理内存布局。如果系统有多个内存范围,可以创建多个内存节点,或者可以在单个内存节点的reg属性中指定这些范围。
例子:
给定一个64位的Power系统,其物理内存布局如下:
•RAM:起始地址0x0,长度0x80000000 (2 GB)
•RAM:起始地址0x100000000,长度0x100000000 (4 GB)
可以这样定义内存节点,假设#address-cells = <2>和#size-cells = <2>。
memory@0 {
device_type = "memory";
reg = <0x000000000 0x00000000 0x00000000 0x80000000
0x000000001 0x00000000 0x00000001 0x00000000>;
};
或者
memory@0 {
device_type = "memory";
reg = <0x000000000 0x00000000 0x00000000 0x80000000>;
};
memory@100000000 {
device_type = "memory";
reg = <0x000000001 0x00000000 0x00000001 0x00000000>;
};
3.5 /chosen Node
所选节点并不代表系统中的实际设备,而是描述系统固件在运行时选择或指定的参数。它应该是根节点的一个子节点。
chosen {
bootargs = "root=/dev/nfs rw nfsroot=192.168.1.1 console=ttyS0,115200";
};
3.6 /cpus Node Properties
所有设备树都需要有一个/cpu节点。它并不代表系统中的一个真实设备,而是作为表示系统cpu的子cpu节点的容器。
3.7 /cpus/cpu* Node Properties
cpu节点代表一个硬件执行块,该执行块足够独立,能够运行一个操作系统,而不干扰可能运行其他操作系统的其他cpu。
共享一个MMU的硬件线程通常在一个cpu节点下表示。如果设计了其他更复杂的CPU拓扑,那么CPU的绑定必须描述该拓扑(例如,不共享MMU的线程)
cpu和线程通过一个统一的数字空间进行编号,这个数字空间应该尽可能接近中断控制器的cpu /线程编号。
在cpu节点之间具有相同值的属性可以放在/cpu节点中。客户端程序必须首先检查一个特定的cpu节点,但是如果没有找到预期的属性,那么它应该查看父节点/cpu节点。
这将减少所有cpu之间相同的属性的详细表示。
每个CPU节点的节点名都应该是CPU。
3.7.1 General Properties of /cpus/cpu* nodes
cpu节点的基本属性如下表所示。表3.6中描述的一些属性是具有特定适用细节的选择标准属性
表格太长,不列出来,详见源文档。
3.7.2 TLB Properties
cpu节点的以下属性描述了处理器MMU中的翻译后备缓冲区。
3.7.3 Internal (L1) Cache Properties
3.7.4 Example
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
device_type = "cpu";
reg = <0>;
d-cache-block-size = <32>; // L1 - 32 bytes
i-cache-block-size = <32>; // L1 - 32 bytes
d-cache-size = <0x8000>; // L1, 32K
i-cache-size = <0x8000>; // L1, 32K
timebase-frequency = <82500000>; // 82.5 MHz
clock-frequency = <825000000>; // 825 MHz
};
};
3.8 Multi-level and Shared Cache Nodes (/cpus/cpu*/l?-cache)
未完待续