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:这个维基百科其实写的不详细,也是别人根据自己的研究编写的。重点是附带资料不错,推荐看看。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

向媒体投稿有了好方法财政单位信息宣传工作简单又轻松

当我初涉财政单位的信息宣传岗位,肩负起对外展示单位风采、传播政策信息的重要职责时,我深刻体验到了投稿之路的艰辛曲折。初期,对于如何有效对接媒体并成功发表稿件,我感到一片茫然,仿佛置身于浩瀚的信息海洋中,无从下手。 那时,我的工作日常就是广泛搜集各类媒体的联系方式,特…

稀碎从零算法笔记Day56-LeetCode:组合总和 Ⅳ

题型:DP、数组 链接:377. 组合总和 Ⅳ - 力扣(LeetCode) 来源:LeetCode 题目描述 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的…

数据结构系列-堆排序

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 昨天我们实现的堆的搭建,我们今天实现以下堆的排序, 堆的排序的最大的优点就是提高的效率,减小了时间复杂度,在这个里面我们有一个…

C++ 并发编程指南(11)原子操作 | 11.5、内存模型

文章目录 一、C 内存模型1、为什么需要内存模型?2、happens-before和synchronize-with两个关键概念2.1、happens-before2.2、synchronize-with2.3、总结 前言 C 11标准中最重要的特性之一,是大多数程序员都不会关注的东西。它并不是新的语法特性&#xf…

系统思考—业务复盘

今日的JSTO——《业务复盘》中,赵海懿老师的分享启发了我深度反思。她提到的两句话特别引人思考: 1、学校里学到的最重要的东西,就是“最重要的东西在学校里学不到”。 2、学习型组织不只是组织学习。 这些话提醒我们,真正的学习…

区块链钱包开发指南: 探究区块链钱包开发涉及

区块链钱包是连接用户与区块链网络的重要工具,它们不仅提供了安全的存储和管理数字资产的功能,还允许用户进行交易和与区块链上的智能合约进行互动。本文将探究区块链钱包开发涉及的关键方面和技术要点。 1. 区块链钱包类型 区块链钱包可以分为以下几种…

Unity中的UI系统之UGUI

目录 概述UGUI基础——六大基础组件六大基础组件概述Canvas画布组件CanvasScaler画布缩放控制器组件必备知识恒定像素模式缩放模式恒定物理模式3D模式 Graphic Raycaster图形射线投射器EventSystem和Standalone Input ModuleRectTransform UGUI基础——三大基础控件Image图像控…

JS - 以工厂模式和原型模式方式建造对象、JS的垃级回收机制、数组的使用

创建对象的方式 使用工厂方法来建造对象 在JS中我们可以通过以下方式进行创建对象: var obj {name:"孙悟空",age:18,gender:"男",sayName:function(){alert(this.name);}};var obj2 {name:"猪八戒",age:28,gender:"男",…

【第4讲】XTuner 微调 LLM:1.8B、多模态、Agent

目录 1 简介2 基础知识2.1 finetune简介2.2 xtuner简介2.2.1 技术架构2.2.2 快速上手xtuner 2.3 8GB显存玩转LLM(intern1.8b)2.3.1 flash attention vs deepspeed zero2.3.2 相关版本更新和使用 2.4 多模态LLM2.4.1 多模态LLaVA基本原理简介2.4.2 快速上…

Linux的学习之路:18、进程间通信(2)

摘要 本章主要是说一下命名管道和共享内存 目录 摘要 一、命名管道 1、创建一个命名管道 2、匿名管道与命名管道的区别 3、命名管道的打开规则 4、代码实现 二、system V共享内存 1、共享内存 2、共享内存函数 三、代码 四、思维导图 一、命名管道 1、创建一个命…

24年做抖店,如何快速脱离“商家新手期”?

我是王路飞。 这个“新手期”不是你们理解的那种店铺新手期,现在抖店没有新手期这一说了。 主要说的是从商家角度来说,如何在最短时间内从一个没有电商经验的新手,蜕变成一个有经验、有流程、有操作、甚至有一定数据的“老玩家”&#xff1…

CentOS7配置固定ip

一、打开配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 二、更改配置文件的参数 将BOOTPROTO的属性值改为static 或者是直接注销原来的重新写更改为静态的 三、在配置文件中设置ip地址和网关 1、IP地址的前三段需要和主机的 VMnet8 网卡的ip保持一致(主…

js 打印网页时没有背景色,window.print打印背景色丢失

页面效果 打印效果 需要在打印的容器里增加下面代码 /*webkit 为Google Chrome、Safari等浏览器内核*/ -webkit-print-color-adjust: exact; /*解决火狐浏览器打印*/ print-color-adjust: exact; color-adjust: exact; 完整写法 我为了方便直接写*,这样所有元素都…

IDEA 2024.1 配置 AspectJ环境

最近Java课设在学习AspectJ,做PPT顺便写一个博客 下载包 首先去AspectJ官网下载一个JAR包并安装 安装完最后可以按照他的建议配置一下 然后找到AspectJ的安装位置的lib目录,把三个包拷到自己项目中的lib目录下 由于最新版的IDEA已经不支持AspectJ了 所…

【Linux】在ubuntu快速搭建部署K8S(1.27)集群

ubuntu快速安装K8s1.27 (一)环境说明1.硬件环境2.Ubuntu环境设置 (二)安装配置containerd1.安装2.配置3.启动 (三)所有节点操作1.安装runc和cni2.节点系统设置、关闭临时分区3.修改内核参数4.安装 kubeadm、…

新手小白,在数学建模的过程中应该怎么分工?

大家知道,数学建模竞赛是需要一个团队的三个人在三天或四天的时间内,完成模型建立,编程实现和论文写作的任务,对许多第一次参加建模或者建模经验比较欠缺的团队来说,是时间紧任务重的,那么怎么办呢&#xf…

EelasticSearch的介绍和基于docker安装

1.概述 Elasticsearch 是一个基于 Apache Lucene 构建的开源分布式搜索引擎和分析引擎。它专为云计算环境设计,提供了一个分布式的、高可用的实时分析和搜索平台。Elasticsearch 可以处理大量数据,并且具备横向扩展能力,能够通过增加更多的硬…

程序设计语言—Python几种语言区别的总结

程序设计语言篇—Python&几种语言区别的总结 文章目录 程序设计语言篇—Python&几种语言区别的总结一、Python介绍&理解1.1 Python基础1.2 Python规范 二、标识符&变量&常量三、数据类型&运算符和表达式3.1 数据类型3.2 运算符&表达式 四、常用的函…

真实世界的密码学(三)

原文:annas-archive.org/md5/655c944001312f47533514408a1a919a 译者:飞龙 协议:CC BY-NC-SA 4.0 第十一章:用户认证 本章涵盖了 认证人员和数据之间的区别 用户认证,根据密码或密钥对用户进行身份验证。 用户辅助认…

光伏仿真设计需要用到的工具有哪些?

随着全球能源结构的转型和可持续发展战略的深入实施,光伏发电作为一种清洁、可再生的能源形式,正日益受到广泛关注和应用。在光伏系统的设计和优化过程中,光伏仿真设计工具发挥着至关重要的作用。那么,光伏仿真设计需要用到的工具…