当CPU处于内核模式时,它可以读写任何寄存器吗?

2023-12-11

当CPU处于内核模式时,它可以读写任何寄存器吗?或者是否有一些寄存器即使在内核模式下也无法访问?


在 x86 上,没有分组寄存器,因此所有寄存器在架构上同时可见。

是的,在内核模式(环 0)下,x86 可以写入任何寄存器。 (只要内核运行在64位模式下,否则无法访问x/ymm8..16或zmm8..31,或r8..r15)。

是的,从 64 位用户空间进入内核后切换到 32 位模式的内核是可能的; Solaris x86-64 显然是这样做的,并且MacOS X 曾经这样做过与 32 位内核驱动程序兼容。在 RAM 小于 4GB 且缓存较小的机器上,在内核中使用较小的指针有一些好处,而且缺点可能没有那么大。


wrmsr(写入特定于型号的寄存器)requires内核模式。也是如此rdmsr阅读 MSR。因此,与用户空间可以自由使用的整数和向量寄存器(rax..rsi/r8..r15 和 xmm0..15)不同,are只有内核可以修改的寄存器。

可能有一些特定于模型的注册表只能在系统管理模式下访问。 (有时称为环-1)我不知道,我没有读过太多关于SMM的内容。和/或与 SGX 相关的寄存器(用于“飞地”),我也没有研究过。

可能还存在一些您永远无法写入的只读 MSRwrmsr。 IDK,如果这就是你的意思,或者如果你只计算通常被认为是在上下文切换时保存/恢复的架构状态的一部分的寄存器,例如通用整数寄存器。所有这些寄存器都可以在任何模式下写入,甚至是段寄存器。


内部段基址/限制寄存器不可直接读取,但在 64 位长模式下,除 FS 和 GS 外,它们固定为基址 = 0 / 限制 = -1。但这些基地可以通过rdmsr/wrmsr on MSR_GS_BASE / MSR_FS_BASE.

添加了 FSGSBASE ISA 扩展wrfsbase等等,这确实可以让您更直接地读/写 FS 和 GS 库,比 MSR 更有效。 (无论哪种方式,内核都不必实际修改 GDT 或 LDT 条目并重新加载fs更新fs线程本地存储的基础)。Linux x86 64 中 MSR_GS_BASE 的详细信息

但我不认为 cs/ds/es/ss 基数/限制是通过 MSR 公开的,并且这些与 32 位保护模式相关。 (或者切换回真实模式以创建“虚幻”模式。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当CPU处于内核模式时,它可以读写任何寄存器吗? 的相关文章

随机推荐

  • Dojo 实习生设置 firefox 配置文件名称

    您好 我正在尝试在环境设置中设置 Firefox 配置文件名称intern配置文件 我已经尝试过 environments browserName firefox firefox profile default firefox profil
  • css z-index 嵌套元素的问题

    我想在 z 平面上订购 3 个 HTML 元素 bank width 200px height 200px background color grey position absolute z index 100 transform tran
  • 表单关闭后从特定上下文运行代码?

    我想在此处创建的表单关闭后在此上下文中运行一些代码 Form1 Form1 new Form1 Form1 Show lt After this closes I want to run code from this context usi
  • 如何以编程方式更改第三台显示器

    当我使用笔记本电脑时 我使用 3 个显示器 笔记本电脑显示屏 第二台显示器 通过 VGA 连接 电视 通过 HDMI 连接 我的显卡不支持 3 个显示器 所以我不断地从 2 个显示器切换到 3 个显示器 当我在计算机上时 我使用第二个显示器
  • 在 Electron 中找不到模块

    我目前正在与 Babylon 一起开发 Electron 我发现这个仓库我基本上将其用作我自己项目的样板 一切都运行良好 直到我尝试添加jquery pep js用于其他需求 我一直犯这个错误 未捕获的错误 找不到模块 jquery pep
  • 如何在 JavaScript 中将麦克风静音

    所以我正在创建一个视频通话网络应用程序 我想在其中打开 关闭麦克风 打开 关闭视频功能 navigator mediaDevices getUserMedia video true audio true then stream gt con
  • 为什么在innerHTML 中使用Array#map 输出中的额外逗号?

    之前的帖子已经提到了如何toString 方法将在映射的每个项目之间放置逗号 并且可以通过使用来解决这个问题join 下面 尝试 2 在显示的对象之间添加了逗号 而尝试 1 则没有 为什么是这样 如何修改尝试 2 使其输出复制尝试 1 va
  • 用户定义类型作为 PostgreSQL 函数中的输入参数

    您好 我正在创建一个用于插入元数据的过程 我创建了类型 并在另一种类型中包含了一种类型 并且在过程中我对其进行迭代以获取值 由于我是 PostgreSQL 的新手 任何人都可以帮助我如何调用该过程 输入参数为类型 Create Type F
  • Netbeans 7.1.2 - 无法添加 glassfish 服务器 3.1.2

    我从下载 glassfish 服务器http glassfish java net downloads 3 1 2 2 final html并单独安装 现在我正在尝试将其添加到 Netbeans 中 但这不起作用 我做了以下步骤 以管理员身
  • 训练神经网络时资源耗尽 - keras

    我有一个包含 65668 个文件的数据集 我使用 Keras 作为 CNN 这些是我的层 embedding layer Embedding len word index 1 EMBEDDING DIM weights embedding
  • 张量流相当于 torch.gather

    我有一个形状张量 16 4096 3 我有另一个形状索引张量 16 32768 3 我正在尝试收集价值观dim 1 这最初是在 pytorch 中使用聚集功能如下所示 a shape 16L 4096L 3L idx shape 16L 3
  • 分割十六进制的最佳方法?

    一般来说 我对十六进制还很陌生 并且我有一个应用程序需要我分割十六进制数 例如 给定数字 0x607F 我需要返回高 0x60 或低 0x7F 字节 这是可能的实现 但感觉有点麻烦 在 python 中是否有更标准的方法来做到这一点 def
  • 使用 jq 将对象的嵌套 JSON 转换为数组到 bash 数组

    我正在做一些根本错误的事情 但只是看不出是什么 有人可以指出我在 jq 或 JSON 方面的错误吗 我在数组中包含以下子对象 entries profile name TesterRun1 download entries ENTRY A
  • 使用 SIMD,如何有条件地仅移动 alpha 通道值为 255 的像素?

    我目前正在向量化一些代码以使用 AVX2 内在函数存储 32 位像素数据 由于 AVX2 寄存器是 256 位 因此我可以同时操作 8 个像素 我目前的代码可以从一个缓冲区加载 8 个像素 然后将它们存储到另一个缓冲区 Load 256 b
  • 实体框架级联删除

    首先 如果我在这里遗漏了一些基本的东西 我深表歉意 但我是 EF 的新手 并且仍然首先考虑设置数据库代码 我遇到了与此类似的问题引入 FOREIGN KEY 约束可能会导致循环或多条级联路径但似乎无法从那里的评论中找出我需要对我的特定模型做
  • 如何在awk中将驼峰式字符串拆分为数组?

    如何使用 split 函数将驼峰式字符串拆分为 awk 中的数组 Input STRING camelCasedExample 期望的结果 WORDS 1 camel WORDS 2 Cased WORDS 3 Example 糟糕的尝试
  • 实体框架代码优先迁移认为存在不应该存在的更改

    我有一个网站和一个 Windows 服务 它们都引用同一个项目来获取实体框架数据上下文 每次启动 Windows 服务时 实体框架都会运行自动迁移 将数据库列之一从 NOT NULL 更改为 NULL 不进行其他更改 该列的属性被标记为 R
  • 如何使用R中的函数替换数据框中的字符值

    我有一个数据框 max1 max2 max3 max4 max5 max6 max7 max8 max9 max10 x9 x8 x7 x6 x10 x5 x4 x2 x1 x3 x5 x3 x4 x6 x10 x1 x7 x2 x8 x9
  • Pandas:混合数据类型的列;如何找到异常情况

    我有一个很大的数据框 当阅读它时 它给了我这样的消息 DtypeWarning 列 0 8 具有混合类型 导入时指定 dtype 或设置 low memory False 它应该是一列浮标 但我怀疑里面藏着几根绳子 我想识别它们 并可能删除
  • 当CPU处于内核模式时,它可以读写任何寄存器吗?

    当CPU处于内核模式时 它可以读写任何寄存器吗 或者是否有一些寄存器即使在内核模式下也无法访问 在 x86 上 没有分组寄存器 因此所有寄存器在架构上同时可见 是的 在内核模式 环 0 下 x86 可以写入任何寄存器 只要内核运行在64位模