一个代码理解设备树CPU

一个代码理解设备树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"compatiblereg

cpu-map 节点

  • 当 CPU 有拓扑(如集群、大小核)时必须写。
  • 父节点必须是 cpus

socket 节点

  • 表示物理插槽,通常写成 socket0socket1

cluster 节点

  • 一个 socket 下可以有多个 cluster。

core + thread

  • 一个 cluster 下的核心(core)和核心里的线程(thread)逐级描述。

🌟 总结

层级描述
cpus所有逻辑 CPU 的总入口
cpu@N单个逻辑 CPU
cpu-map描述拓扑
socketN第 N 个插槽
clusterN第 N 个集群
coreN第 N 个物理核心
threadN第 N 个线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值