x86 段寄存器在现代 CPU 和操作系统上有特殊含义/用途吗?

2023-11-29

从 16 位到 32 位再到 64 位,x86 CPU 历代都有各种棘手的模式和内存分段。

如今,现代操作系统在现代操作模式下使用现代 CPU,您不必担心内存段,但您仍然可以在现代 CPU 上的旧操作系统上运行旧应用程序,在这种情况下,我假设 CPU 在特殊旧版中运行模式(保护模式、实模式等)。

很明显,段寄存器的存在是为了向后兼容,但这是唯一的原因吗?

段寄存器也有现代用途吗?或者它们现在已经成为通用寄存器,仅具有反映其历史功能的名称?

这个问题的灵感来自于这个旧的 Stack Overflow 线程的评论:为什么mov指令必须这样使用呢?


2002年,Linux内核黑客Ingo Molnar在实现时使用了分段执行盾,32 位 x86 系统上的一种数据执行预防形式。这是一modern我所知道的分段的使用,但主要是在从无法改变的硬件机制中获得最大收益方式。分段不用于在 x86-64 CPU 上实现数据执行预防NX支持。

The FS and GSx86-64 上仍然使用段寄存器:

在 64 位模式下,通常(但不是完全)禁用分段,从而创建平坦的 64 位线性地址空间。处理器将 CS、DS、ES、SS 的段基数视为零,从而创建等于有效地址的线性地址。 FS 和 GS 段是例外。这些段寄存器(保存段基址)可以用作线性地址计算中的附加基址寄存器。它们有助于寻址本地数据和某些操作系统数据结构。

英特尔系统编程指南,第 3.2.4 章

在 x86-64 上,Linux 使用FS用于线程本地存储和GS每个 cpu 数据的内核空间。看Linux AMD64 中如何使用 fs/gs 寄存器? and Linux x86 64 中 MSR_GS_BASE 的详细信息

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

x86 段寄存器在现代 CPU 和操作系统上有特殊含义/用途吗? 的相关文章

  • int64_t的宽度,总是64位吗?

    对于以下代码 static inline float fix2float int64 t f return float f 1 lt lt 60 lt error here 编译器向我发出这些警告 warning left shift co
  • 长延迟指令

    I would like a long latency single uop x861 instruction in order to create long dependency chains as part of testing mic
  • x86 TEST 指令不起作用?

    我一直在用头撞墙来解决这个问题 但这对我来说毫无意义 为什么这个程序会进入死循环 我以为你可以用test比较两个值是否相等 如图所示here https stackoverflow com questions 6002079 为什么不起作用
  • 汇编内存操作数说明

    我理解 例如 BX 位于括号之间时 它指的是其内存内容 但同时我也不明白这一点 CMP BX 12ADH 在那个例子中我不明白真正比较的是什么 MOV EBX BX 对于此移动也是如此 我不知道正在移动的内容及其内存地址或其中的值 CMP
  • 为什么在 shellcode 中使用 Push/Pop 而不是 Mov 将数字放入寄存器中?

    我有一些来自 shell 代码有效负载的示例代码 显示了 for 循环并使用 push pop 来设置计数器 push 9 pop ecx 为什么不能直接使用mov呢 mov ecx 9 是的 通常你应该总是使用mov ecx 9出于性能原
  • x86汇编代码的语法

    我试图了解操作系统的基础知识 并在 OCW 中找到了相关课程 名为 6 828 我在课程的实验室中找到了引导加载程序的代码 我尝试了但不明白以下部分代码 Enable A20 For backwards compatibility with
  • 枚举程序集的所有已安装版本(在 GAC 中)

    是否可以使用 C 枚举 GAC 中程序集的所有已安装版本 例如 我有一个名为 My Assembly 的程序集 该程序集可能有各种版本 1 0 0 0 2 3 4 5 0 1 2 4 等 并且可以针对各种平台 x86 x64 任何 CPU
  • 如果您的程序+库不包含 SSE 指令,那么使用 VZEROUPPER 有用吗?

    我明白使用它很重要VZEROUPPER混合 SSE 和 AVX 代码时 但如果我只使用 AVX 和普通 x86 64 代码 而不使用任何旧版 SSE 指令怎么办 如果我从未在代码中使用单个 SSE 指令 是否有任何性能原因导致我需要使用VZ
  • 逆向工程的汇编语言[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • FASM 是否使用 Intel 语法?

    我尝试在 FASM 中编译以下代码 mov DWORD PTR ebp 4 1234567 它给了我一个 无效表达式 错误 但是以下代码有效 mov DWORD ebp 4 1234567 那么 FASM 是否使用 Intel 语法 我假设
  • 从地址获取上一条指令的开头

    我们在缓冲区中查看 x86 操作码 标记当前指针 68 0F 00 6A 90 00 找到下一条指令的开始很容易 因为电流的大小是可以确定的 但是你如何才能准确地猜出前一个的开始呢 68 0F 00 6A 90 总共 5 个字节 结束于 0
  • 为什么允许 gcc 从结构推测加载?

    显示 gcc 优化和可能出现故障的用户代码的示例 下面代码片段中的函数 foo 将仅加载结构成员 A 或 B 之一 至少这是未优化代码的意图 typedef struct int A int B Pair int foo const Pai
  • x86 分页如何工作?

    这个问题旨在填补有关该主题的优质免费信息的真空 我相信一个好的答案将适合一个大的 SO 答案 或者至少适合几个答案 主要目标是为初学者提供足够的信息 以便他们可以自己阅读本手册 并能够理解与分页相关的基本操作系统概念 建议指南 answer
  • 如何正确确定Intel处理器的-march和-mtune?

    我目前正在从源代码构建一个对我来说性能至关重要的软件 因此 我想对其进行优化 以便在我的特定 Intel CPU 上运行 构建过程要求我设置 march 和 mtune 标志 如果在我的处理器节点上我使用 gcc march native
  • 文本段的名称从何而来?

    传统的汇编器和更高级别的编译器使用多个内存segments 根据预期用途 因此 有数据段 堆栈段 bss 和文本段 文本段也称为代码段 Text部分 为了机器码 我问过所有我能找到的老前辈 像机器代码这样难以阅读的东西是如何被称为 文本段
  • 如何禁用浮点单元(FPU)?

    我想在 x86 系统中禁用 FPU MMX SSE 指令 并且我将为设备不可用异常实现一个处理程序 我已经提到过控制寄存器 wiki 页面 http en wikipedia org wiki Control register 看来我必须在
  • 跨 AVX 通道的最佳方式是什么?

    有些问题具有类似的标题 但我的问题涉及其他地方未涵盖的一个非常具体的用例 我有 4 个 128d 寄存器 x0 x1 x2 x3 我想将它们的内容重新组合在 5 个 256d 寄存器 y0 y1 y2 y3 y4 中 以准备其他计算 on
  • elf .rel.text 部分中 R_386_32/R_386_PC32 的含义

    为了理解重定位的概念 我编写了一个简单的 chk c 程序 如下所示 1 include
  • 如何获取 VESA BIOS 信息

    我正在跟踪Phil Opp 教程 https os phil opp com 关于用 Rust 编写一个操作系统 在稍微尝试了一下之后 我想在屏幕上显示真实的图形 我发现我应该从使用带有 VESA 的线性帧缓冲区开始 我在 osdev or
  • 为什么这个“std::atomic_thread_fence”起作用

    首先我想谈一下我对此的一些理解 如有错误请指正 a MFENCE在x86中可以保证全屏障 顺序一致性可防止 STORE STORE STORE LOAD LOAD STORE 和 LOAD LOAD 重新排序 这是根据维基百科 https

随机推荐

  • .htaccess 中的条件 PHP 版本

    在我的本地测试服务器上 我使用 PHP 5 4 然而 在实时主机上 我目前仅限于 PHP 5 3 并且必须在 htaccess 中指定它 否则默认为 5 2 所以我可以添加 Use PHP 5 3 Action application x
  • 写入记录器时发生错误。 (无法打开源“.NET Runtime”的日志。您可能没有写入权限。)

    我在 Net core 3 1 中创建了一个 Web 应用程序 并尝试使用 EF Core 访问数据库 在访问它时 我遇到以下错误 奇怪的是 它之前可以正常工作 但应用程序方面没有任何变化 at Microsoft Extensions L
  • 如何在mysql中对西里尔字母进行编码?

    这是怎么回事 我有一个问题 希望你能帮助我解决 我的一个朋友有一个简单 可靠的 html 网站 我实现了一点 php 文章的 CRUD 系统 我遇到的问题是从 mysql 数据库放置和获取西里尔字符 我接下来想要实现的目标是 在主导航中有一
  • 了解地图功能

    Python 2 文档说 内置功能 map function iterable 将函数应用于可迭代的每个项目并返回一个列表 结果 如果传递额外的可迭代参数 函数必须 接受这么多参数并应用于所有项目 并行迭代 如果一个迭代比另一个短 则假定它
  • 使用functions.php将Bootstrap添加到Wordpress

    我尝试使用以下代码将 Bootstrap 嵌入到 Wordpress 但它不起作用 需要帮忙
  • 设置用双引号括起来的单词的 CSS

    这是我的问题的后续问题如果代码包含保留字 则设置代码的 CSS 我正在尝试做什么 如果某些代码有引号或双引号 我想将字体颜色设置为红色和粗体 前任 System out println Hello world 应该将 Hello world
  • 如何使 PageView.Builder() 滚动动画从滞后变得极其流畅 - Flutter

    我使用 PageView Builder 来构建由基本文本小部件数组提供的小部件 但在调试模式下 动画感觉非常滞后 在发布或分析模式下 动画仍然滞后 但少了很多 有什么方法可以完全消除使用PageView时的动画滞后现象 这是我的代码 im
  • 如何从另一台计算机连接到 SQL Server?

    我想使用 SQL Server 2005 从家里连接到另一台 PC 我查看了 msd 但在连接之前它说我应该连接到另一台计算机 使用计算机管理但没有成功 我只能连接到我的工作组中的计算机 谢谢 路易莎 免责声明这只是一些可能对任何人都有帮助
  • 提取C/C++函数原型

    我想做这个 extract prototypes file1 c file2 cpp file3 c 并让任何脚本 程序打印给定 C C 文件中定义的所有函数的函数原型的良好列表 它必须很好地处理多行声明 有没有一个程序可以完成这项工作 越
  • Python 的 eval() 在不受信任的字符串上的安全性?

    如果我使用 eval 评估 Python 字符串 并且有一个类似以下的类 class Foo object a 3 def bar self x return x a 如果我不信任该字符串 会有哪些安全风险 尤其 Is eval strin
  • 计算不同数字数量的省时方法

    get number 返回一个整数 我将调用它 30 次并计算返回的不同整数的数量 我的计划是将这些数字放入std array
  • C++ 在编译时获取月份作为数字

    我有一个 C 项目 必须打印修订字符串 修订字符串是公司指定的 协议包括构建时间 yyyy mm dd 我过去常常将其指定为构建系统中的宏 但这不再是一个选项 因为会弄乱预编译头 在增量构建中 当日期发生变化时 我试图通过从编译器获取构建日
  • 表达式引擎 - 完全删除index.php

    一段时间以来 我一直在 htaccess 文件中使用以下代码 以使 EE URL 正常工作 而无需在 URL 中使用 index php 我发现 虽然我从爬行工具中收到一些报告 但我得到了重复的内容 如 lorem ipsum 也以 ind
  • R 插入符 / rfe 变量选择 Factor() AND NA

    我有一个数据集NAs慷慨地撒在各处 此外 它还有需要的列factors 我正在使用rfe 函数从caret包来选择变量 看来functions 论证中rfe using lmFuncs适用于具有 NA 的数据 但不适用于因子变量 而rfFu
  • 在 C# 中使用信号量

    嗨 我正在尝试使用Semaphore在我的应用程序中 我已经这样声明了 class MyThread public Thread Thrd static Semaphore sem new Semaphore 2 2 public MyTh
  • 关于 Mongoid/MongoDB 标签树结构的建议

    我正在寻找有关如何构建此数据模型的标签部分的一些建议 这是它的简化版本 一个站点有许多帖子 关系关联 mongoid 中的references many 站点有一个标签树 帖子有一系列标签 网站标签的子集 顺序无关紧要 我关心的用例是 快速
  • 尝试在 raspbian wheezy 上构建 opencv-2.4.10 时未声明 SIZE_MAX

    我正在尝试在我的 Raspberry Pi model B 喘息 上构建 opencv 2 4 10 如下这些说明但出现以下错误 解决这个问题的最佳方法是什么 14 Building CXX object modules highgui C
  • 使用socket处理生物指纹考勤机

    我正在尝试使用 Java 程序连接生物识别指纹考勤设备 我使用的设备是Biocom指纹考勤系统 然而 我正在搜索和阅读相关内容 我发现可以根据设备类型使用 SDK 这很难 不符合逻辑 而且 它不是全局解决方案 我研究了如何使用指纹设备连接
  • 使用java Scanner获取字符串中的标记数量

    Java中有没有办法获取Method Scanner获取到的字符串中token的个数 我的意思是 我可以使用s sc nextLine 获取字符串形式的输入行 但在这个字符串上我不能使用lenght 方法因为它给了我字符总数 我认为 是否有
  • x86 段寄存器在现代 CPU 和操作系统上有特殊含义/用途吗?

    从 16 位到 32 位再到 64 位 x86 CPU 历代都有各种棘手的模式和内存分段 如今 现代操作系统在现代操作模式下使用现代 CPU 您不必担心内存段 但您仍然可以在现代 CPU 上的旧操作系统上运行旧应用程序 在这种情况下 我假设