x86 保护模式下段寄存器的用途是什么?

2024-01-30

我需要修改一些dll,但我不知道段寄存器到底是做什么的(DS, SS,...)处于保护模式。我在学校学到了真正的 16 位模式,其中段寄存器乘以 16 加上普通寄存器中的偏移量给出了物理内存中的有效地址。在保护模式下,有一些平面内存模型和虚拟内存,其中每个进程“拥有”4GB内存,因此如果寄存器有32位,那么我只能通过“偏移”寄存器来寻址虚拟内存的每个字节。那么哪些puroses有处于保护模式的段寄存器,例如

mov eax, dword ptr ds:[20037DA0] 

一些历史背景

8086 总是每个段使用固定的 64KiB 窗口,其起始地址通过(段寄存器 * 16)计算。从80286开始,内存中有一些特殊的表(GDT和LDT)。这些表包含段的起始地址、长度和访问权限。段寄存器(CS、DS、ES、SS - 以及自 80386 起:FS、GS)包含这些表的索引。

因此,理论上操作系统可以按照自己想要的方式设置段的偏移量和长度:在 8086 DS=0x0123 上意味着:段是从地址 0x01230 开始的 64KiB。在 32 位模式下 DS=0x0123 可能意味着:段从地址 0xABCD 开始,长度为 0xEF 字节 - 这取决于操作系统创建的 GDT 和 LDT 表的内容。尝试访问此范围之外的段(如果长度

现在的情况

然而,大多数现代 32 位操作系统实际上不再使用段寄存器。由于访问权限问题,它们的值根据模式(内核或用户)设置。起始地址通常为 0,长度为 4GiB。

真正的内存保护是使用MMU 完成的,因此某些内存区域在用户模式下无法访问。在现代操作系统中,MMU 绝对是必不可少的。它将“绝对”虚拟地址映射到真实物理地址,检查是否存在访问权限违规。

有一个例外:某些操作系统(例如 Windows 和 Linux)使用 FS 和/或 GS 段来真正指向不同的内存区域。

因此,在 64 位模式下,x86 处理器仅将 CS 寄存器用于访问权限问题,而 FS 和 GS 可用于向每个地址添加偏移量。据我所知,DS、ES 和 SS 没有被使用,而寄存器 FS 和 GS 的内容并不重要,但有一些特殊的寄存器可以显式地给出要添加到使用 FS 或 GS​​ 的操作中的偏移量。

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

x86 保护模式下段寄存器的用途是什么? 的相关文章

  • 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

    我遇到了当前正在开发的应用程序的问题 问题是应用程序在启动时在后台运行一段时间后崩溃 并且仅在这种情况下 在应用程序被杀死时启动应用程序不会导致调试器或手机崩溃 无论是否进行调试 在后台启动应用程序大约 5 10 分钟都不会导致崩溃 在后台
  • 汇编编程语言:程序仅当输入为 ESC 时退出,并在退出前要求确认(y/n),否则循环

    我只是汇编语言编程的初学者 我们的第一个任务是让程序仅在输入为 ESC 时退出 退出之前请求确认 y n 否则循环 我知道 ESC 在 ASCII 代码中具有等效值 但我对插入位置或是否需要添加更多内容感到困惑 请帮我 这是程序 model
  • 如何在 Ubuntu 14.04 LTS 中安装 ia32-libs (Trusty Tahr)

    我昨天安装了 Ubuntu 14 04 Trusty Tahr 一切看起来都还好 但是当我尝试编译一些C代码时 我遇到了以下错误 该错误似乎是由于操作系统缺乏 32 位架构支持造成的 错误输出如下 usr bin ld i386 archi
  • C/C++ 中的简单“Hello World”内联汇编语言程序

    我使用 devcpp 和 borland c 编译器 asm mov ax 4 I O Func mov bx 1 Output func mov cx name address of the string mov dx 6 length
  • x86 平台中的 KVM 影子页表处理

    据我了解 在没有硬件支持来宾虚拟到主机物理地址转换的处理器上 KVM 使用影子页表 当来宾操作系统修改其页表时 会构建和更新影子页表 硬件中有没有专门的指令 以x86为参考 来修改页表 除非有特殊说明 否则不会对VMM 造成陷阱 Linux
  • 为什么这个 C++ 包装类没有被内联掉?

    EDIT 我的构建系统出了问题 我还在弄清楚到底是什么 但是gcc产生了奇怪的结果 尽管它是 cpp文件 但是一旦我使用了g 然后它按预期工作 对于我一直遇到麻烦的事情来说 这是一个非常精简的测试用例 其中使用数字包装类 我认为会内联 使我
  • 为什么这个“std::atomic_thread_fence”起作用

    首先我想谈一下我对此的一些理解 如有错误请指正 a MFENCE在x86中可以保证全屏障 顺序一致性可防止 STORE STORE STORE LOAD LOAD STORE 和 LOAD LOAD 重新排序 这是根据维基百科 https
  • 在 REP MOVSW 之前 PUSH CS / POP DS 的目的是什么?

    为什么在下面的代码中我们压入代码段 PUSH CS 然后将其弹出到数据段 POP DS 我将这些行明确指定为 line1 和 line2 请告诉我 MOVSW 在这里是如何工作的 IF HIGHMEMORY PUSH DS MOV BX D
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load
  • 为 Visual Studio 应用程序设置平台目标的目的是什么?

    对于任何 VS 项目 都可以在该项目的构建属性中设置平台目标 您可以将其设置为任何 CPU x86 x64 或 Itanium 我的问题是 如果我将此值设置为 x86 是否意味着我无法在 x64 计算机上运行该项目 如果是这样 为什么还要使
  • 为什么 Solaris 汇编器生成的机器代码与 GNU 汇编器在这里不同?

    我为 amd64 编写了这个小汇编文件 对于这个问题来说 代码的作用并不重要 globl fib fib mov edi ecx xor eax eax jrcxz 1f lea 1 rax ebx 0 add rbx rax xchg r
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 为什么当大小大于 50 时,该程序花费的时间会呈指数级增长?

    所以我正在为类编写一个 ARM 汇编快速排序方法 我对大部分内容都有了解 除了复杂性没有意义 我们将其与我们制作的另一种冒泡排序方法进行比较 它对于具有 1 个参数和 10 个参数的示例表现更好 然而 我什至无法比较 100 个参数测试 因
  • 使用 Easy 68K (68000) 组装范围内的随机数

    我正在使用 Easy 68K 模拟器创建一个简单的黑杰克游戏 需要使用随机数来分配牌 我的牌必须在 2 到 11 的范围内 我似乎每次都得到相同的数字 但它不在我预期的范围内 我的卡值需要以 D3 结束 因此我有以下随机数代码 CLR L
  • 寄存器寻址模式与直接寻址模式

    我在试卷中遇到过这个问题 它指出 哪种给定的寻址模式更快 为什么 寄存器寻址方式 直接寻址方式 现在根据我的说法 寄存器寻址模式应该更快 因为寄存器是计算机中最快的存储位置 这是正确答案吗 请帮忙 谢谢 两种寻址模式之间的区别是 地址的来源
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情

随机推荐

  • 将多个事件分组到单个 ics 文件中(icalendar 流)

    我想根据 RFC 将多个事件分组到单个 ICS 文件 iCalendar 流 中 这是可以做到的 但我不知道如何做到 谁能帮助我或给我一个例子 rfc 是这样说的 但是 多个 iCalendar 对象可以按顺序分组一起在 iCalendar
  • 为什么文档指示 CALayer 动画必须位于 UIView 动画块中?

    我目前正在阅读苹果的核心动画指南 https developer apple com library mac documentation Cocoa Conceptual CoreAnimation guide CreatingBasicA
  • 如何更改启动屏幕大小?

    我在 C 上使用 WPF 我添加了一个 png图像并将其配置为启动屏幕 这个png文件的分辨率是1100x800像素 问题是我的应用程序将支持许多分辨率的屏幕 所以这个尺寸的启动屏幕对于小屏幕 如 1366x768 屏幕 来说太大了 如果我
  • 注意:未定义的偏移量:0 in

    我收到这个 PHP 错误 这是什么意思 Notice Undefined offset 0 in C xampp htdocs mywebsite reddit vote tut src votes php on line 41 从这段代码
  • 在 angular2 的一个组件中添加多个 templateUrl

    angular2 允许使用反引号 编写多行 html 代码 但是当使用 templateUrl 时 我不知道如何添加多个 html 文件 当我尝试这个时 Component selector my app template h1 view1
  • 将内部带有字节数组的结构传递给互操作方法

    我遇到一种情况 必须将结构传递给 C 方法 在我的 C 文件中声明为 extern 然而这个结构相当复杂 我已经成功地使用了 AllocHGlobal 的方法 但我想了解是否可以通过仅传递对结构的引用来使其以这种方式工作 StructLay
  • Android - 创建适配器时出现 NullPointerException

    我正在为列表视图创建一个数组适配器 一切正常 我有 2 个片段 操作栏顶部有 2 个按钮 可在这 2 个片段之间进行更改 我的问题是 如果我在这些frag之间移动得太快 当我打开fragOne 切换到fragTwo 然后快速移回fragOn
  • LinearLayout 留下太多空白。为什么?

    我正在编写一个 Android 应用程序 帮助小孩子学习数学 它向用户提出一些问题 用户会回答这些问题 如果他 她全部答对 将获得奖品 现在我需要在中告诉用户这一点ResultsActivity 它是这样的
  • Windows 窗体:播放声音,但不是从头开始

    我想在我的设备中播放曲目 wav 文件 Windows Forms Application 但我不希望它从头开始播放 而是从曲目中的某个点开始播放 假设 10 秒 从头开始播放曲目没有问题 private void playSimpleSo
  • OpenCV 错误:Python 中的未知错误代码 -49

    我正在尝试使用 cv2 在 python 3 6 中学习人脸检测 我按照书上给出的src进行操作 我已经安装了opencv python 3 2 0 by pip xml 和 jpg 文件都与 python 代码位于同一路径中 from n
  • 拉拉维尔。如果数据库正在播种,则禁用观察者方法

    我的用户模型有一个观察者 在我的观察者 gt 创建的事件中我有一些代码 public function created User user sendEmail 因此 我们的想法是 当创建用户时 系统将向用户发送帐户已创建的电子邮件通知 问题
  • 如何使用 mvn site:site 生成站点?

    我想用mvn生成一个站点 但是我无法配置它来生成index html 我可以运行不同的报告 例如 mvn javadoc javadoc generates target site apidocs mvn cobertura cobertu
  • 如何处理 UI 的 Lambda/API 网关的 Cognito 身份验证重定向?

    当我进入 Cognito 身份验证页面时 https example auth us east 1 amazoncognito com login response type token client id xxxxxxxxxxxxxxxx
  • Mongodb:$in 运算符与大量单个查询

    我知道 MongoDB 能够每秒处理大量请求 但假设我必须根据给定的 id 查询集合的大量文档 什么听起来更好 在 id 属性上使用我想要获取的所有 id 创建 in 或者循环 findOne 查询 我肯定会使用 in 查询并提供 ids
  • 如何从 SqlAlchemy 创建和恢复备份?

    我正在编写一个 Pylons 应用程序 并尝试创建一个简单的备份系统 其中每个表都被序列化并压缩成一个文件 供管理员下载 并在发生不良情况时用于恢复应用程序 我可以使用以下命令很好地序列化我的表数据SqlAlchemy 序列化器 https
  • 如何通过 JavaScript/JQuery 将 HTML 文档添加到
    中?

    如何将 HTML 文档添加到 div div 通过 JavaScript JQuery 这就是我到目前为止所拥有的 emailBodyIninclude html
  • Azure Functions - 事件中心不触发函数

    我有一个 Azure 基础架构 2 个 HTTP 函数 gt 事件中心 gt 2 个函数 gt 表存储 因此两个 http 函数将消息发送到事件中心 以及两个由事件中心中的消息触发的函数 其中之一将消息保存在表存储中 基础结构每天由 Azu
  • 如何寻址 OData Url 中使用复合身份密钥的实体?

    我有一个实体订单项具有OrderId and 产品编号整数字段 这两个字段构成身份密钥 主密钥对于这张表 我想用OData Web API通过服务公开此类实体并能够选择订单项目他们的实例复合ID 的格式应该是什么URL 是否有处理此类场景的
  • Spark重新分区落入单个分区

    我正在学习spark 当我使用以下表达式在pyspark shell中测试repartition 函数时 我观察到一个非常奇怪的结果 之后所有元素都落入同一个分区repartition 功能 在这里 我用了glom 了解 rdd 内的分区
  • x86 保护模式下段寄存器的用途是什么?

    我需要修改一些dll 但我不知道段寄存器到底是做什么的 DS SS 处于保护模式 我在学校学到了真正的 16 位模式 其中段寄存器乘以 16 加上普通寄存器中的偏移量给出了物理内存中的有效地址 在保护模式下 有一些平面内存模型和虚拟内存 其