一个代码理解设备树CPU
cpus {
#address-cells = <1>; /* 每个 CPU ID 用 1 个单元 */
#size-cells = <0>; /* 没有子空间 */
/* ========== 定义16个逻辑 CPU ========= */
/* 每个物理核心有两个线程,所以 reg=0/1 表示CPU0的两个线程,2/3是CPU1的两个线程,… */
cpu@0 {
device_type = "cpu"; /* 知识点1:必须写 "cpu" 表示这是 CPU 节点 */
compatible = "arm,cortex-a72"; /* 知识点2:CPU 类型,比如大核 */
reg = <0>; /* CPU0 线程0 */
enable-method = "psci"; /* 知识点3:启动方法 */
};
cpu@1 {
device_type = "cpu";
compatible = "arm,cortex-a72";
reg = <1>; /* CPU0 线程1 */
enable-method = "psci";
};
cpu@2 {
device_type = "cpu";
compatible = "arm,cortex-a72";
reg = <2>; /* CPU1 线程0 */
enable-method = "psci";
};
cpu@3 {
device_type = "cpu";
compatible = "arm,cortex-a72";
reg = <3>; /* CPU1 线程1 */
enable-method = "psci";
};
/* … 以此类推,到 cpu@15 … */
/* 为简洁起见,这里省略了 4~14 的定义 */
cpu@14 {
device_type = "cpu";
compatible = "arm,cortex-a72";
reg = <14>;
enable-method = "psci";
};
cpu@15 {
device_type = "cpu";
compatible = "arm,cortex-a72";
reg = <15>;
enable-method = "psci";
};
/* ========== 描述拓扑结构,用 cpu-map ========== */
cpu-map {
/* 知识点4:cpu-map 用来描述复杂拓扑:socket + cluster + core + thread */
socket0 { /* 知识点5:表示物理插槽,名字必须是 socketN */
cluster0 { /* 知识点6:插槽里的第一个集群 */
core0 {
thread0 { cpu = <&/cpus/cpu@0>; }; /* 物理核心0的线程0 */
thread1 { cpu = <&/cpus/cpu@1>; }; /* 物理核心0的线程1 */
};
core1 {
thread0 { cpu = <&/cpus/cpu@2>; };
thread1 { cpu = <&/cpus/cpu@3>; };
};
core2 {
thread0 { cpu = <&/cpus/cpu@4>; };
thread1 { cpu = <&/cpus/cpu@5>; };
};
core3 {
thread0 { cpu = <&/cpus/cpu@6>; };
thread1 { cpu = <&/cpus/cpu@7>; };
};
};
cluster1 { /* 知识点7:插槽里的第二个集群 */
core0 {
thread0 { cpu = <&/cpus/cpu@8>; };
thread1 { cpu = <&/cpus/cpu@9>; };
};
core1 {
thread0 { cpu = <&/cpus/cpu@10>; };
thread1 { cpu = <&/cpus/cpu@11>; };
};
core2 {
thread0 { cpu = <&/cpus/cpu@12>; };
thread1 { cpu = <&/cpus/cpu@13>; };
};
core3 {
thread0 { cpu = <&/cpus/cpu@14>; };
thread1 { cpu = <&/cpus/cpu@15>; };
};
};
};
};
};
✅ cpus 节点
- 根节点是
cpus
。 - 包含所有逻辑 CPU,每个线程对应一个
cpu@N
。 - 必须写
device_type="cpu"
和compatible
和reg
。
✅ cpu-map 节点
- 当 CPU 有拓扑(如集群、大小核)时必须写。
- 父节点必须是
cpus
。
✅ socket 节点
- 表示物理插槽,通常写成
socket0
、socket1
。
✅ cluster 节点
- 一个 socket 下可以有多个 cluster。
✅ core + thread
- 一个 cluster 下的核心(core)和核心里的线程(thread)逐级描述。
🌟 总结
层级 | 描述 |
---|---|
cpus | 所有逻辑 CPU 的总入口 |
cpu@N | 单个逻辑 CPU |
cpu-map | 描述拓扑 |
socketN | 第 N 个插槽 |
clusterN | 第 N 个集群 |
coreN | 第 N 个物理核心 |
threadN | 第 N 个线程 |