MSR是个什么寄存器

MSR 这种寄存器专门用于调试、程序执行跟踪、计算机性能监控、简化软件编程、电源控制等等各种实验性功能。

什么是 MSR

MSR 的概念是不易理解,所以这一节只说一些 MSR 的外在,比如形容和指令等,然后展开说说,看完整篇文章你应该就能明白了。

MSR 是一组寄存器,主要可用于操作系统或执行过程(即在特权级别0下运行的代码),这些寄存器的数量和功能因处理器不同,可能也不同。

实际上所有的 MSR 处理系统相关的函数,并且不能被应用程序访问,读取和写入 MSR 需要使用WRMSRRDMSR两个系统指令。而本文的 TSC 是一个例外(使用rdtsc等指令也可以读取)。

为什么要设计这样的一种寄存器呢?

为什么要设计出这样的一种寄存器呢?这与常见的EAX通用寄存器太不一样了。

首先需要了解一下 MSR 的来历。从 80386 开始,英特尔给每一代处理器都会引入了一些“实验性”功能,这些功能不一定会出现在未来的处理器中。这就会导致一些指令无效。

比如在新一代处理器中新增了了几个测试功能的寄存器,然后设计了一个mov变体(假设叫movx)来读取这几个寄存器,但是后续处理器没有这几个测试寄存器,那么这个movx指令就失效了。但是有些程序或者编译器等是使用movx的话,就需要重新编写。加大了开发工作量和兼容难度。

为了解决这个问题,从奔腾处理器开始,英特尔开始提供WRMSRRDMSR这对指令来访问当前和未来会出现的“特定模块的寄存器”。比如说,这里读取一个测试代码的寄存器,我们不用操心具体使用哪个指令来读取具体的寄存器,而是使用RDMSR来读取这个测试代码模型下使用的寄存器,具体如何读取是RDMSR去实现的。这样就避免了寄存器未来不使用后,指令也不能用了的问题。

如果你在 Intel SDM 中搜索 MSR,会发现 MSR 出现的地方都是一些比较实验性的内容。而且最后的第 4 卷标题就是 Model-Specific Registers,可见这个技术还蛮重要的。

是不是有点像高级语言的感觉,所以有些人会把 MSR 当做一个虚拟寄存器。但是这是个实际存在的寄存器,只不过这个实际存在的寄存器在每一代可能都不同,因为加上了这样一层所以感觉有点“虚”。

为什么你说应用程序不能访问,又说WRMSRRDMSR两个系统指令可以读写 MSR 呢?

因为除了 TSC 可以使用rdtsc等指令外,你只能通过设置ECX寄存器的值,再使用RDMSR将其写入EDX:EAX两个寄存器中,然后使用mov等指令来读取EAXEDX的值。而不能直接用mov或者其变体读取 TSC 的寄存器。

关于使用rdtsc读取 TSC 可以看我的这篇文章:如何使用rdtsc和C/C++来测量运行时间(如何使用内联汇编和获取CPU的TSC时钟频率),这篇文章使用了内联汇编,可以作为一个例子帮助理解。

什么叫体系结构 MSR

让我们来想一个问题:现在指令是没有失效的风险了,但要是模型不用了咋办?随着技术的发展,一些技术可能就不用了,那么模型就被淘汰了。

这个没有 MSR 这么神奇的方法,所以只能依照约定和惯例。

在文档中提及:如果是体系结构 MSR(Architectural MSRs),那么未来可预期的会出现,但要不是,可能就没了。这就靠开发者了。

MSR 的一个子集和相关的比特字段在未来几代处理器中不会改变,现在被称为“体系结构MSR”。由于历史原因(从奔腾 4 处理器开始),这些“体系结构 MSR”的前缀为IA32_

名称/地址

每个寄存器都有自己的名称和地址,具体请见 Intel® 64 and IA-32 Architectures Software Developer’s Manual
Volume 4: Model-Specific Registers,整个第 4 卷 500 多页全是列出的 MSR。

如下图就是一个寄存器地址和体系结构 MSR 名称(Architectural MSR Name)的对应:

请添加图片描述

MSR地址范围在4000000H到4000FFFFH之间被标记为特别保留的范围。所有现有和未来的处理器都不会使用该范围内的任何MSR来实现任何功能。

希望能帮到有需要的人~

参考资料

Intel® 64 and IA-32 Architectures Software Developer Manuals:Intel 处理器的官方文档,比较详细的介绍了 MSR 以及一个长长长长的列表。

Model-specific register - Wikipedia:这个维基百科其实写的不详细,也是别人根据自己的研究编写的。重点是附带资料不错,推荐看看。

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

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

相关文章

计算机视觉 CV 八股分享 [自用](更新中......)

目录 一、深度学习中解决过拟合方法 二、深度学习中解决欠拟合方法 三、梯度消失和梯度爆炸 解决梯度消失的方法 解决梯度爆炸的方法 四、神经网络权重初始化方法 五、梯度下降法 六、BatchNorm 七、归一化方法 八、卷积 九、池化 十、激活函数 十一、预训练 十二…

【uniapp】 合成海报组件

之前公司的同事写过一个微信小程序用的 合成海报的组件 非常十分好用 最近的项目是uni的 把组件改造一下也可以用 记录一下 <template><view><canvas type"2d" class"_mycanvas" id"my-canvas" canvas-id"my-canvas" …

RT-Thread电源管理组件

电源管理组件 嵌入式系统低功耗管理的目的在于满足用户对性能需求的前提下&#xff0c;尽可能降低系统能耗以延长设备待机时间。 高性能与有限的电池能量在嵌入式系统中矛盾最为突出&#xff0c;硬件低功耗设计与软件低功耗管理的联合应用成为解决矛盾的有效手段。 现在的各种…

排序算法之桶排序

目录 一、简介二、代码实现三、应用场景 一、简介 算法平均时间复杂度最好时间复杂度最坏时间复杂度空间复杂度排序方式稳定性桶排序O(nk )O(nk)O(n^2)O(nk)Out-place稳定 稳定&#xff1a;如果A原本在B前面&#xff0c;而AB&#xff0c;排序之后A仍然在B的前面&#xff1b; 不…

Kotlin语法快速入门--条件控制和循环语句(2)

Kotlin语法入门–条件控制和循环语句&#xff08;2&#xff09; 文章目录 Kotlin语法入门--条件控制和循环语句&#xff08;2&#xff09;二、条件控制和循环语句1、if...else2、when2.1、常规用法2.2、特殊用法--并列&#xff1a;2.3、特殊用法--类型判断&#xff1a;2.4、特殊…

C语言进阶课程学习记录-第48课 - 函数设计原则

C语言进阶课程学习记录 - 函数设计原则 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录

无人驾驶 自动驾驶汽车 环境感知 精准定位 决策与规划 控制与执行 高精地图与车联网V2X 深度神经网络学习 深度强化学习 Apollo

无人驾驶 百度apollo课程 1-5 百度apollo课程 6-8 七月在线 无人驾驶系列知识入门到提高 当今,自动驾驶技术已经成为整个汽车产业的最新发展方向。应用自动驾驶技术可以全面提升汽车驾驶的安全性、舒适性,满足更高层次的市场需求等。自动驾驶技术得益于人工智能技术的应用…

端口被占用的解决方案汇总

端口被占用的解决方案汇总 【一】windows系统端口被占用【二】Linux系统端口被占用【三】Linux的ps命令查找&#xff08;1&#xff09;ps命令常用的方式有三种&#xff08;2&#xff09;ps -ef |grep 8080 【一】windows系统端口被占用 &#xff08;1&#xff09;键盘上按住Wi…

【LeetCode刷题记录】21. 合并两个有序链表

21 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2&#xff1a; 输入&#xff1a;l1 [], l2 …

# MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制&#xff0c;读写锁&#xff0c;和锁的粒度 并发控制的概述 在数据库系统中&#xff0c;并发控制是一种用于确保当多个用户同时访问数据库时&#xff0c;系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术&#xff0c;其中包括锁机制、多…

调试 WebSocket API 技巧分享

WebSocket 是一种在单个 TCP 连接上实现全双工通信的先进 API 技术。与传统的 HTTP 请求相比&#xff0c;WebSocket 提供了更低的延迟和更高的通信效率&#xff0c;使其成为在线游戏、实时聊天等应用的理想选择。 开始使用 Apifox 的 WebSocket 功能 首先&#xff0c;在项目界…

node和go的列表转树形, 执行速度测试对比

保证数据一致性&#xff0c;先生成4000条json数据到本地&#xff0c;然后分别读取文本执行处理 node代码 node是用midway框架 forNum1:number 0forNum2:number 0//执行测试async index(){// 生成菜单列表// const menuList await this.generateMenuList([], 4000);const men…

双周总结#008 - AIGC

本周参与了公司同事对 AIGC 的分享会&#xff0c;分享了 AIGC 在实际项目中的实践经验&#xff0c;以及如何进行 AIGC 的落地。内容分几项内容&#xff1a; 什么是 AIGCAIGC 能做什么AIGC 工具 以年终总结为例&#xff0c;分享了哪些过程应用了 AIGC&#xff0c;以及 AIGC 落地…

QA测试开发工程师面试题满分问答19: url请求到响应整个过程,涉及到什么技术细节

概述 当你点击鼠标发起一个请求&#xff0c;直到页面显示响应数据&#xff0c;整个过程可以详细展开为以下步骤&#xff1a; 用户点击鼠标&#xff1a;用户在浏览器中点击某个链接或按钮&#xff0c;触发请求的发起。 URL 解析&#xff1a;浏览器解析点击的链接中的 URL&…

在线音乐播放网站项目测试(selenium+Junit5)

在做完在线音乐播放网站项目之后&#xff0c;需要对项目的功能、接口进行测试&#xff0c;利用测试的工具&#xff1a;selenium以及Java的单元测试工具Junit进行测试&#xff0c;下面式测试的思维导图&#xff0c;列出该项目需要测试的所有测试用例&#xff1a; 测试结果&#…

下列程序定义了NxN的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N],int n),该函数的功能是:使数组右上半三角元素中的值乘以m。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 下列…

【QML】State组件

State(状态)组件是一组来自默认配置的批处理更改。所有项都有一个默认状态&#xff0c;该状态定义对象和属性值的默认配置。可以通过将State项添加到states属性来定义新的状态&#xff0c;以允许项在不同的配置之间切换。 State组件的基本用法如下&#xff1a; Window {id: …

【ARM Trace32(劳特巴赫) 使用介绍 12.1 -- Trace32 读写 64位地址】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 读写 64位地址读 64 位地址写64位地址Trace32 读写 64位地址 在使用TRACE32进行调试时,有时需要读取或操作64位的地址,特别是在处理64位的处理器或操作系统时。以下是如何在TRACE32中读取64位地址的一般方法。 读 64 位地…

MySQL行级锁——技术深度+1

引言 本文是对MySQL行级锁的学习&#xff0c;MySQL一直停留在会用的阶段&#xff0c;需要弄清楚锁和事务的原理并DEBUG查看。 PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取&#xff0c;欢迎Star&#xff01; MySQL行级锁 行级锁&#xff08;Row-…

js连接抖音打印组件实现打印

js连接抖音打印组件实现打印小票 安装抖音打印组件 抖音打印组件文档&#xff1a; https://bytedance.larkoffice.com/docs/doccn2vbOOdd3KWrCd6Z93nIlvg 跟着文档案例一步步配基本上没问题&#xff0c; 打印的时候需要设置下打印机名称 export class DouyinPrint {construct…