实模式
当英特尔设计原始的 x86,8086(和 8088 衍生产品)时,它们包括分段,允许 16 位处理器访问超过 16 位的地址。他们通过使 16 位地址相对于给定的 16 位段寄存器来实现这一点,其中定义了四个:代码段(CS
),数据段(DS
),额外段(ES
)和堆栈段(SS
)。
大多数指令暗示使用哪个段寄存器:指令是从代码段中删除的,PUSH
和 POP
暗示了堆栈段,而简单数据引用暗示了数据段 - 尽管这可以被覆盖以访问任何其他段中的存储器。
实现很简单:对于每次内存访问,CPU 将采用隐式(或显式)段寄存器,将其向左移动四个位置,然后添加指示的地址:
+-------------------+---------+
Segment | 16-bit value | 0 0 0 0 |
+-------------------+---------+
PLUS
+---------+-------------------+
Address | 0 0 0 0 | 16-bit value |
+---------+-------------------+
EQUALS
+-----------------------------+
Result | 20-bit memory address |
+-----------------------------+
这允许各种技术:
- 允许代码,数据和堆栈都可以互相访问(
CS
,DS
和SS
都具有相同的值); - 保持代码,数据和堆栈彼此完全分离(
CS
,DS
和SS
所有 4K(或更多)彼此分开 - 记住它乘以 16,所以这是 64K)。
它还允许奇怪的重叠和各种奇怪的事情!
当 80286 被发明时,它支持这种传统模式(现在称为实模式),但增加了一种称为保护模式(qv)的新模式。
需要注意的重要事项是在实模式下:
- 只需将正确的值放入段寄存器并访问 16 位地址即可访问任何存储器地址。
- 保护的程度是允许程序员将不同的内存区域分开以用于不同的目的,并且使得更难以意外地写入错误的数据 - 同时仍然可以这样做。
换句话说……根本不受保护!