x86 - x86 实模式下的段大小

标签 x86 memory-segmentation real-mode

我对实模式下段的大小有一个疑问,因为它们不能超过 64K,但可以是 less than that.我的问题是这些段大小和基地址是如何初始化的?就像在保护模式下有 GDT 和 LDT 一样。 Real mode segments can also overlapped,disjoint or adjacent.就像 BIOS 有一些保留区域用于特定的东西,比如引导代码、视频缓冲区等,汇编程序需要做这样的事情吗?

最佳答案

在实模式下,分段地址硬连线到内存中。要获得物理地址,您可以使用以下等式:

physical address = segment * 16 + offset

段地址和偏移地址都是 16 位。通过使用这个等式,您可以创建一个 20 位地址并毫无问题地访问低 640kB 的 RAM。

没有包含某些段所在位置的表。
问题是您必须同时设置段寄存器和偏移寄存器才能访问任何地址。因此,您可以通过一个简单的循环访问最多 64k 的 RAM 字节,该循环仅增加偏移寄存器,这使得对更大缓冲区的内存访问不如平面模型舒适。

关于x86 - x86 实模式下的段大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17786357/

相关文章:

c++ - 基于 compare_exchange 的循环是否受益于暂停?

assembly - 如果我们在内存地址末尾请求多字节数据会发生什么?

x86 - 使用 GDB 读取 MSR

c - 堆栈、数据和指令段在哪里实现?

assembly - 在不同处理器(x86程序集)上运行代码

assembly - 如何在 Linux 驱动程序中切换到实模式

assembly - 为什么我的堆栈指针仅以16的倍数递增?

c - C 中的类型转换是如何实现的?

c - 有谁知道为什么我得到 SIGSEGV,执行 0x90 导致段错误