Arm64体系架构-MPIDR_EL1寄存器

news2024/11/28 12:40:50

背景

        在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_EL1
	u64 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内的超线程id
		cpuid_topo->thread_id  = MPIDR_AFFINITY_LEVEL(mpidr, 0);
		cpuid_topo->core_id    = MPIDR_AFFINITY_LEVEL(mpidr, 1);
                // package_id即cluster id
		cpuid_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表示核id
		cpuid_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.coloradmin.cn/o/1069934.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

敏捷项目管理解锁:2023年使用YouTrack的全面指南

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

20231008工作心得:sql

1.SQL语句里的if的嵌套使用 if(product A and brand_name B,C,if(product A and brand_name !B,D,product)) as product if&#xff08;A,B,C&#xff09;。SQL里if函数&#xff0c;如果条件A成立&#xff0c;就显示B的值&#xff0c;否则就显示C。 这个代码的意思的&#x…

RK3588实用技巧:查看显示器支持的分辨率,基于weston修改分辨率输出

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133685938 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

数据结构面试常问问题--保研及考研复试

前言&#xff1a; Hello大家好&#xff0c;我是Dream。今年保研上岸山东大学人工智能专业 &#xff08;经验贴&#xff09;&#xff0c;现在将我自己的专业课备考知识点整理出来&#xff0c;分享给大家&#xff0c;希望可以帮助到大家&#xff01;这是重点知识总结&#xff0c;…

mfoc-hardnested项目属性

常规 预处理器 NDEBUG _CONSOLE NOGDI _AMD64_ _CRT_SECURE_NO_WARNINGS CONFFILES DRIVER_ACR122S_ENABLED DRIVER_ACR122_USB_ENABLED DRIVER_ARYGON_ENABLED DRIVER_PN532_UART_ENABLED DRIVER_PN53X_USB_ENABLED ENVVARS HAVE_CONFIG_H LOG u_int16_tuint16_t u_int8_tuin…

解决Playwright无法登录Google账号的问题

文章目录 问题描述解决问题免费登录生成代码问题描述 当使用playwright需要登入google帐号的时候,有可能会出现下面的情况:无法登录,提示浏览器不安全(因为我们是脚本使用) 【Python自学笔记】微软自动化测试工具playwright,微软版selenium解决问题 解决上面这个无法登入…

竞赛 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

Windows关闭指定端口程序

1.netstat -ano |findstr “4710” 2.查询当前端口PID为8376的进程 tasklist | findstr 8376 3. 选择杀死进程的方式 taskkill /f /t /im "PID or process name " ① taskkill /f /t /im “8376” ② taskkill /f /t /im “node.exe”

MPLS VPN知识点梳理与实战

项目拓扑与项目需求 项目需求&#xff1a;如图所示&#xff0c;某公司拥有总部和分支A、分支B。现在需要实现如下需求 总部和分支通过mpls vpn互联&#xff0c;运营商内部使用RR放射MP-bgp路由&#xff0c;运营商IGP协议选择ospf&#xff0c;企业内部的IGP选择ospf2、分支A和分…

【初识Jmeter】【接口自动化】

jmeter的使用笔记1 Jmeter介绍与下载安装介绍安装配置配置与扩展组件 jmeter的使用基本功能元素登陆请求与提取cookie其他请求接口关联Cookie-响应成功聚合报告查看 Jmeter介绍与下载安装 介绍 jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&…

HTML5使用html2canvas转化为图片,然后再转为base64.

介绍 场景&#xff1a;今天同事提了个协助&#xff0c;将HTML5文件中的元素转为图片&#xff0c;并且最终转为base64格式传给后端。感觉还挺有意思就记录下。&#xff08;试例如下&#xff09; 步骤一&#xff1a;引入html2canvas 的js源码 html2canvas.min.js 下载地址 htt…

民族民俗景区3d智慧旅游系统提升游客旅游体验和质量

随着科技的不断发展&#xff0c;传统的旅游方式正在逐渐被新的技术和系统所取代。网上3D沉浸式旅游体验凭借其身临其境的沉浸式体验优势&#xff0c;正成为旅游业的新宠。 网上3D沉浸式旅游体验是将旅游景区、度假区、休闲街区、科博馆等场所空间&#xff0c;利用VR全景制作、w…

API商品数据接口概述,API商品数据接口的组成

API商品数据接口是一种应用程序接口&#xff0c;用于提供商品数据的服务。它允许开发者通过编写代码来访问和获取商品数据&#xff0c;以便于他们在自己的应用程序中使用。API商品数据接口可以使用各种不同的协议和标准来实现&#xff0c;例如RESTful API、SOAP、XML-RPC等&…

Antv/s2 明细表 透视表实现和性能优化(一)

前言 以我实际项目环境为准&#xff0c;vuets为技术框架&#xff0c;代码如果有什么不懂欢迎留言评论我会回复的 透视表 定义文件 class PivotTableControl extends BaseControl {type pivotTable;label controls.chart.pivotTable;icon tc-color-pivot-table;widget () &…

Linux设备驱动的精髓在哪?为何感觉写驱动就像写八股文?

Linux设备驱动的精髓在哪&#xff1f;为何感觉写驱动就像写八股文&#xff1f; 话题背景&#xff1a;随着互联网尤其是移动互联网的发展&#xff0c;Android手机操作系统得到了广泛应用&#xff0c;而Android系统是基于Linux系统开发的。另外&#xff0c;大数据、云计算等技术也…

7321-2017 定形耐火制品试样制备方法

声明 本文是学习GB-T 7321-2017 定形耐火制品试样制备方法.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了定形耐火制品制样的定义、制样部位的确定原则和试样的制备。 本标准适用于定形耐火制品试样的制备。 2 规范性引用文…

AI:10-基于TensorFlow的玉米病害识别

玉米是世界上最重要的粮食作物之一,然而,玉米病害对其产量和质量造成了严重威胁。传统的病害识别方法通常依赖于人工观察和经验判断,效率低下且易受主观因素影响。近年来,基于深度学习的图像识别技术在农业领域取得了显著进展,为玉米病害的快速、准确识别提供了新的解决方…

【虚拟机】根据已有IP获取当前网段的主机范围

虚拟机有的时候会需要自己手动分配IP&#xff0c;此时无论是和宿主主机通信、还是访问外网&#xff0c;都需要保证和宿主主机在一个网段。现在已知宿主主机的 IP 和子网掩码&#xff0c;需要知道宿主主机所处网段可以分配哪些IP。 假设宿主主机 IP 为172.20.10.2&#xff0c;子…

[补题记录] Atcoder Beginner Contest 323(E、F)

URL&#xff1a;https://atcoder.jp/contests/abc323 目录 E Problem/题意 Thought/思路 Code/代码 F Problem/题意 Thought/思路 Code/代码 E Problem/题意 有 N 首歌曲&#xff0c;每首歌曲时长为 Ti。每次随机播放一首歌曲&#xff0c;问在 X 0.5 这一时刻&#x…

ict在线测试设备功能如何作用与芯片静态功耗测试,提升性能和稳定性

在芯片的众多测试项目中芯片的功耗测试可谓重中之重&#xff0c;因为芯片的功耗不仅关系着芯片的整体工作性能也对芯片的效率有着非常重大的影响。芯片的功耗测试包括动态功耗和静态功耗。 芯片静态功耗是什么? 芯片的静态功耗也叫做芯片静态电流&#xff0c;它是芯片测试中的…