Arm64体系架构-MPIDR_EL1寄存器

背景

        在Arm64多核处理器中, 各核间的关系可能不同. 比如1个16 core的cpu, 每4个core划分为1个cluster,共享L2 cache. 当我们需要从core 0将任务调度出来时,如果优先选择core 1~3, 那么性能明显时优于其他core的.

       那么操作系统怎么知道core之间这样的拓扑信息呢? Arm提供了MPIDR_EL1 寄存器. 每个core都有一个该寄存器。

字段说明

a.该寄存器为只读寄存器

b.AFF3 & AFF2 都为ClusterID(从软件角度理解为不同CPU组的ID),AFF1 为CPUID,           AFF0 为多线程核的线程ID(指的是是否支持超线程的id)

MPIDR_EL1

U, bit [30]

0表示多核处理, 1表示单核处理

MT, bit [24]

0表示没有使用单核超线程, 1表示使用了单核超线程。

其他的affinity,则表示了各核之间的亲和性。以一个8核2 cluster 非超线程cpu为例, core0的mpidr_el1的affinity为(0,0,0,0),core1为(0,0,0,1),以次类推, core7则为(0,0,1,3)。Arm规范要求了每个core的(Aff3,Aff2,Aff1,Aff0)编码必须唯一。不支持超线程的cpu, Aff0表示核id

这样通过树形结构的编码,OS可以从该寄存器中获取各core之间的关系。

Kernel应用

// kernel表示每个core的拓扑结构,每个core对应一个该结构
struct cpu_topology {int thread_id;int core_id;int package_id;int llc_id;cpumask_t thread_sibling;cpumask_t core_sibling;cpumask_t llc_sibling;
};void store_cpu_topology(unsigned int cpuid)
{struct cpu_topology *cpuid_topo = &cpu_topology[cpuid];// 读取MPIDR_EL1u64 mpidr = read_cpuid_mpidr();/* Create cpu topology mapping based on MPIDR. */// 判断芯片是否支持超线程if (mpidr & MPIDR_MT_BITMASK) {/* Multiprocessor system : Multi-threads per core */// 在支持超线程的cpu, Aff0表示一个core内的超线程idcpuid_topo->thread_id  = MPIDR_AFFINITY_LEVEL(mpidr, 0);cpuid_topo->core_id    = MPIDR_AFFINITY_LEVEL(mpidr, 1);// package_id即cluster idcpuid_topo->package_id = MPIDR_AFFINITY_LEVEL(mpidr, 2) |MPIDR_AFFINITY_LEVEL(mpidr, 3) << 8;} else {/* Multiprocessor system : Single-thread per core */cpuid_topo->thread_id  = -1;// 不支持超线程的cpu, Aff0表示核idcpuid_topo->core_id    = MPIDR_AFFINITY_LEVEL(mpidr, 0);cpuid_topo->package_id = MPIDR_AFFINITY_LEVEL(mpidr, 1) |MPIDR_AFFINITY_LEVEL(mpidr, 2) << 8 |MPIDR_AFFINITY_LEVEL(mpidr, 3) << 16;}... ...
}

MPIDR_EL1在devicetree中的体现
        配置DTS时,需要设置MPIDR_EL1的值到CPU node中的reg property,以ArmV8 64bit系统为例:当#address-cell property为2时,需要设置MPIDR_EL1[39:32]到reg[7:0]、MPIDR_EL1[23:0]到reg[23:0]; 当#address-cell property为1时,需要设置MPIDR_EL1[23:0]到reg[23:0];reg的其他位设置位0。

Linux启动过程中MPIDR_EL1的相关逻辑
        a.内核中定义了cpu的逻辑映射变量如下,该变量保存MPIDR_EL1寄存器中亲和值。

        /* * Logical CPU mapping. */
        extern u64 __cpu_logical_map[NR_CPUS];
        #define cpu_logical_map(cpu)    __cpu_logical_map[cpu]
        b.cpu0(boot cpu/primary cpu)获取mpidr_el1亲和值的方式与其他cpu(secondary cpu)

        获取方式有所不同。

    void __init smp_setup_processor_id(void)
      {
                /*启动该过程时只有boot cpu即cpu0在执行,其他cpu还未启动
                通过read_cpuid_mpidr获取的MPIDR_EL1值即为当前执行的CPU0
                的亲和值*/
                u64 mpidr = read_cpuid_mpidr() & MPIDR_HWID_BITMASK;
 
                /*将获取到的cpu0的亲和值保存在cpu_logical_map(0)*/
                cpu_logical_map(0) = mpidr;
 
                /*
                 * clear __my_cpu_offset on boot CPU to avoid hang caused by
                 * using percpu variable early, for example, lockdep will
                 * access percpu variable inside lock_release
                 */
                set_my_cpu_offset(0);
                pr_info("Booting Linux on physical CPU 0x%lx\n", (unsigned long)mpidr);
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/129457.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「专题速递」AR协作、智能NPC、数字人的应用与未来

元宇宙是一个融合了虚拟现实、增强现实、人工智能和云计算等技术的综合概念。它旨在创造一个高度沉浸式的虚拟环境&#xff0c;允许用户在其中交互、创造和共享内容。在元宇宙中&#xff0c;人们可以建立虚拟身份、参与虚拟社交&#xff0c;并享受无限的虚拟体验。 作为互联网大…

【Es基础入门必看】

Es基础入门 1. ElasticSearch的认知1.1 搜索1.2 倒排索引1.3 Lucene1.4 ES基本概念 1. ElasticSearch的认知 ElasticSearch&#xff08;以下简称ES&#xff09;是什么&#xff1f;按照官网的定义&#xff0c;ElasticSearch是一个分布式的、RESTFUL风格的搜索引擎。 1.1 搜索…

Netron【.pt转.onnx模型展示】

接着上一篇写哈&#xff0c;如何转.onnx的。 因为是转.onnx类型的&#xff0c;需要先安装onnx的包。 这是直接pip install onnx后转onnx报的错&#xff1a; 很显然是版本问题导致的&#xff0c;so: 将export.py的脚本拉到最下面的parse_opt函数&#xff0c;把“17”改为“12”…

超越React,JS代码体积减少90%!它为何是2023年最好的Web框架?

说到Web框架&#xff0c;大家最先想到的可能是 Vue、React&#xff0c;或者是Next.js。但不得不提&#xff0c;有个后起之秀“来势汹汹”&#xff0c;1.0版本发布至今仅一年&#xff0c;就出尽风头。它就是Astro。 Astro 是什么&#xff1f;一个现代化的静态站点生成器和前端框…

Notepad++提取含有特定字符串的行

ctrl M快捷键&#xff0c;进入"标记" 页面 标记所在行–循环查找-- 正则表达式 – 输入关键字 – 全部标记 – Copy Marked Text 关键字格式如下&#xff1a; .*关键字.*ctrl v&#xff0c;粘贴即可。

深入理解PKI

安全始终是网络通信的核心议题&#xff0c;PKI提供了一组标准的网络安全组件&#xff0c;可以为通信双方提供加密、完整性保护、认证等安全基础设施。原文: Public Key Infrastructure (PKI) Jacek DylagUnsplash 由于用户名和密码不足以验证用户的身份&#xff0c;因此PKI(公钥…

Deep learning of free boundary and Stefan problems论文阅读复现

Deep learning of free boundary and Stefan problems论文阅读复现 摘要1. 一维一相Stefan问题1.1 Direct Stefan problem1.2 Inverse Type I1.3 Inverse Type II 2. 一维二相Stefan问题2.1 Direct Stefan problem2.2 Inverse Type I2.3 Inverse Type II 3. 二维一相Stefan问题…

使用chat-GPT接口提取合同中关键信息

1 业务需求 目前公司有几千份合同&#xff0c;而且还会不断的增长&#xff1b;现在需要将合同中的关键信息提取出来给业务使用&#xff0c;业务现在需要将这些关键字段信息录入存档到档案系统&#xff1b;人工去阅读整个合同去提取这些信息&#xff0c;是很浪费人力的&#xff…

Netty深入浅出(无处不在的IO)

为什么要有Netty Netty是为了解决网络编程的复杂性和提供易于使用、高性能和可扩展的框架而开发的。它通过提供一组可重用的组件来处理网络通信的低级细节&#xff0c;例如套接字管理、线程和缓冲&#xff0c;简化了开发网络应用程序的过程。这使开发人员可以专注于应用程序逻…

Dubbo 环境隔离

通过标签实现流量隔离环境&#xff08;灰度、多套开发环境等&#xff09; 无论是在日常开发测试环境&#xff0c;还是在预发生产环境&#xff0c;我们经常都会遇到流量隔离环境的需求。 在日常开发中&#xff0c;为了避免开发测试过程中互相干扰&#xff0c;我们有搭建多套独…

Flink---11、状态管理(按键分区状态(值状态、列表状态、Map状态、归约状态、聚合状态)算子状态(列表状态、广播状态))

星光下的赶路人star的个人主页 这世上唯一扛得住岁月摧残的就是才华 文章目录 1、状态管理1.1 Flink中的状态1.1.1 概述1.1.2 状态的分类 1.2 按键分区状态&#xff08;Keyed State&#xff09;1.2.1 值状态&#xff08;ValueState&#xff09;1.2.2 列表状态&#xff08;ListS…

在Remix中编写你的第一份智能合约

智能合约简单来讲就是&#xff1a;部署在去中心化区块链上的一个合约或者一组指令&#xff0c;当这个合约或者这组指令被部署以后&#xff0c;它就不能被改变了&#xff0c;并会自动执行&#xff0c;每个人都可以看到合约里面的条款。更深层次的理解就是&#xff1a;这些代码会…