x86 实模式下的段大小

2024-04-24

我对实模式下段的大小有一个疑问,因为它们不能超过 64K,但可以小于那个。 http://support.microsoft.com/kb/120069

我的问题是这些段大小和基地址是如何初始化的?就像保护模式下有 GDT 和 LDT 一样。实模式段也可以重叠、不相交或相邻。 http://www.c-jump.com/CIS77/ASM/Memory/lecture.html

就像BIOS有一些保留区域用于特定的东西,如启动代码、视频缓冲区等,汇编程序是否需要做类似的事情?


实模式下的段限制为 64K,即使在 386 或更高版本的 CPU 上,您可以通过前缀使用 32 位地址大小. e.g. mov ax, [edx + ecx*4]在实模式下仍然限制为 64 KiB 的偏移量。

如果超过此限制,则会在 286+ 上引发 #GP 异常。 (或者#SS如果该段是 SS)。
8086 没有 #SS 或 #GP 例外,它没有一般保护或其他保护,只是使用Sreg << 4添加到偏移量以形成线性地址。

16 位地址大小可以通过字或更宽的访问超过 64K 段限制seg:FFFF。在8086上,高字节来自seg:0000(在计算第二个内存总线事务的新线性地址之前,将逻辑地址中的偏移量包装起来,而不是访问该段的 64K 线性范围之外)。
在 286 及之后,#GP or #SS在这种情况下也适用于数据和指令。https://www.os2museum.com/wp/does-eip-wrap-around-in-16-bit-segments/ https://www.os2museum.com/wp/does-eip-wrap-around-in-16-bit-segments/

一般来说,寻址模式如[bx + si + 1]以 16 位换行。 (和push wordSP=0 则换行至 SP=FFFEh,只要堆栈对齐就没有问题)。所以只有使用代码0x67地址大小前缀(在 386 中添加)用于寻址模式,例如[eax]可以超出实模式下的段限制,但段末尾的字或更宽的访问除外。

在 8086 上,在最高可能地址的 64K 范围内开始的段在 1MiB 处环绕,如果禁用 A20,则在更高版本的 CPU 上。否则,它们会扩展超过 1MiB 的地址,例如FFFF:FFFF段:关闭=0x10ffef线性。看什么是段以及如何在 8086 模式下寻址它们? https://stackoverflow.com/questions/42861524/what-are-segments-and-how-can-they-be-addressed-in-8086-mode/42864071#42864071


虚幻模式:386实模式的平面内存模型

如果切换到保护模式并设置段寄存器,CPU 会在内部缓存段描述(基址 + 限制),甚至切换回 16 位实模式。这种情况称为虚幻模式 https://wiki.osdev.org/Unreal_Mode.

在 16 位模式下写入段寄存器仅将段基址设置为value << 4不改变限制,因此虚幻模式对于CS以外的细分市场来说有些持久。 CS:EIP 很特殊,特别是当您需要避免在从中断或其他情况返回时将 EIP 截断为 16 位时。请参阅前面链接的 osdev wiki。

push http://felixcloutier.com/x86/PUSH.html/pop/call/ret use SS:ESP or SS:SP根据B当前堆栈段描述符中的标志;地址大小前缀仅影响诸如push word [eax] vs. push word [si].

当您在实模式下将值写入段寄存器时,GDT / LDT 将被忽略。该值直接用于设置缓存的段基址,根本不作为选择器。

(每个段都是独立的;虚幻模式不是像受保护模式与实模式那样的实际模式;CPU 处于实模式。例如,写入 FS 寄存器,会将该段恢复到正常的实模式行为(除了其限制),但不会改变其他的。它只是处于实模式下的名称,具有更大限制的缓存段描述符,因此您可以使用 32 位地址大小来获得更大的平面地址空间。通常使用 base=0 和 limit= 4G)

AFAIK,没有办法在实模式下查询段的内部限制值。lsl http://felixcloutier.com/x86/LSL.html直接从内存中的 GDT / LDT 中的描述符加载段限制值,而不是从内部值加载(所以这不是您想要的),并且无论如何它在实模式下不可用。

有关有意或无意地将片段从虚幻模式中取出的更多详细信息,请参阅对此答案的评论。

支持 286 和 386 CPUa LOADALL操作说明 https://en.wikipedia.org/wiki/LOADALL它可以设置实模式下的段限制,但后来的 CPU 没有它。评论者表示,SMM(系统管理模式)也许能够在现代 x86 上做类似的事情。

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

x86 实模式下的段大小 的相关文章

随机推荐

  • Elasticsearch 对字符串排序未返回预期结果

    当对包含多个单词的字符串字段进行排序时 Elasticsearch 会拆分字符串值并使用最小值或最大值作为排序值 即 当对值为 老虎之眼 的字段进行升序排序时 排序值为 Eye 当按降序排序时 排序值为 Tiger 假设我的索引中有 老虎之
  • C# 可以在列表框中显示图像吗?

    C 简而言之 我可以在列表框中显示图像吗 我有一个用户列表 我想在某些名称旁边显示一个绿色勾号 这可能吗 Thanks 以下代码显示如何在列表框中进行自定义绘图 using System Windows Forms using System
  • 如何找出文件的编码? C#

    好吧 我需要找出我在某个目录中找到的哪些文件是 UTF8 编码的 或者是 ANSI 编码的 以更改我稍后决定的其他编码 我的问题是 我如何确定文件是 UTF8 还是 ANSI 编码 这两种编码实际上都可以在我的文件中使用 没有可靠的方法来做
  • 将 Objective-C 代码转换为 C++ 以检测 OS X 上的用户空闲时间

    我正在开发 Qt C 应用程序 我需要简单的函数来在 Mac OS X 上以秒为单位检索用户空闲时间 我发现这个代码用于检测用户空闲时间 include
  • 如何确定主线程上运行的内容 + 减慢 UI 速度?

    我在我的应用程序中添加了新的数据加载功能 它的目的是将大型数据库的内容从移动设备传输到后端并进行处理 在我在此管道中运行的每个函数中 该函数的全部内容都在一个 dispatch async 这会分派到非主线程 我还通过日志验证了这些功能是否
  • 自动增量不适用于具有复合键的实体类

    我希望我的复合键元素之一自动递增 并且我正在为实体类使用嵌入键 因此我无法使用生成值注释来解决问题 因为 GeneratedValue使用时注释被忽略 Embeddable or EmbeddedId 你不能使用 GeneratedValu
  • DC.js 到 React 的转换

    有 dc js 反应转换的示例吗 对折线图 表格和时间滑块 带画笔的条形图 感兴趣 任何帮助 将不胜感激 Thanks 这是将 DC js 转换为 React 的开始 使用的库的版本如下 package json dependencies
  • Visual Studio 调试器提示和技巧(适用于 C/C++ 项目)

    我对有关在 Visual Studio 调试器中调试 C C 项目的提示和技巧感兴趣 我最近发现 如果您有一个指向某种数据类型的指针 比如说 char ptr 那么您可以使用以下语法在监视窗口中将其视为数组 ptr 10 这将显示 ptr
  • 从安装项目重新启动系统

    我正在使用 Visual Studio 创建一个安装项目 我想在安装成功完成后重新启动系统 我想要一次的努力 我不想每次在将设置交付给客户之前使用任何外部工具 实用程序修改设置 我可以调整安装项目本身吗 我怎样才能做到这一点 您可以使用 O
  • MatSort 未定义 - Angular 5

    我正在尝试在我的角度应用程序中实现材质表 分页和过滤器工作正常 但我无法对表格进行排序 我对 MatSort 的引用是未定义的 我确实将其导入到 AppModule 中 import MatTableModule from angular
  • 安卓版本设置

    我希望我的 Xamarin Android 应用程序支持 API 级别 16 及更高级别 但我对 Visual Studio 的属性窗格中存在三种不同的版本设置感到困惑 属性的名称是 Compile using Android versio
  • (Windows Phone 10) 是否可以在 Windows Phone 10 中以编程方式编辑、添加新联系人?

    我想在 Windows Phone 10 中以编程方式实现功能编辑和添加联系人 是否可以 有相关样本吗 以下是用于创建联系人的代码片段 public async Task AddContact String FirstName String
  • 加盐哈希 - 为什么文献中将盐视为夏娃已知的盐?

    标题说明了一切 我不明白 为什么你不应该像密码一样保密你的盐 或者我误解了什么 盐被视为公开的主要是因为没有必要保密 盐的目的主要是使字典攻击变得更加困难 不太实用 在字典攻击中 攻击者对字典中的常用单词进行哈希处理 并 如果他是认真的 用
  • 什么时候适合使用关联类型而不是泛型类型?

    In 这个问题 https stackoverflow com q 32053402 155423 出现了一个问题 可以通过将使用泛型类型参数的尝试更改为关联类型来解决 这引发了一个问题 为什么关联类型在这里更合适 这让我想了解更多 The
  • 如何将文件从 S3 下载到 iPhone 应用程序?

    我是 iPhone 开发新手 我正在开发一个 iPhone 应用程序 需要打开存储在 Amazon S3 服务上的文件 如何将文件从 S3 下载到我的 iPhone 应用程序 我尝试过亚马逊的SDK 但他们似乎没有提供下载和保存文件的方法
  • PHP 输出缓冲回调产生空白屏幕

    这是代码 ob start array dispatcher outputCallback include file ob end flush function outputCallback string if ob get level 1
  • Nodejs Hapi - 如何启用跨源访问控制

    我正在使用 HapiJs Restful Web 服务并尝试启用 cors 以便任何来自不同域的客户端都可以使用我的服务 我在服务器连接对象中尝试了 cors true 但没有成功 你放在哪里cors true 你能添加一些代码吗 不知道你
  • 如何将 BYTE 数组转换为 char 数组以使用套接字 C++ 发送

    我有一些问题 我编写客户端服务器应用程序 其中使用 win 套接字发送和接收信息 在我的项目中需要发送BYTE数组到客户端 并在客户端上将此 char 数组转换为BYTE 我该如何创建它 请帮助我 因为send 函数只能发送char 谢谢
  • 替换精灵中的图像-iPhone的cocos2d游戏开发

    我想改变精灵图像 举例来说 mainSprite Sprite spriteWithFile redFile png self addChild mainSprite 在这里 Sprite 已经添加到图层中 我有可以访问它的 mainSpr
  • x86 实模式下的段大小

    我对实模式下段的大小有一个疑问 因为它们不能超过 64K 但可以小于那个 http support microsoft com kb 120069 我的问题是这些段大小和基地址是如何初始化的 就像保护模式下有 GDT 和 LDT 一样 实模