实模式

当英特尔设计原始的 x86,8086(和 8088 衍生产品)时,它们包括分段,允许 16 位处理器访问超过 16 位的地址。他们通过使 16 位地址相对于给定的 16 位段寄存器来实现这一点,其中定义了四个:代码段(CS),数据段(DS),额外段(ES)和堆栈段(SS)。

大多数指令暗示使用哪个段寄存器:指令是从代码段中删除的,PUSHPOP 暗示了堆栈段,而简单数据引用暗示了数据段 - 尽管这可以被覆盖以访问任何其他段中的存储器。

实现很简单:对于每次内存访问,CPU 将采用隐式(或显式)段寄存器,将其向左移动四个位置,然后添加指示的地址:

        +-------------------+---------+
Segment | 16-bit value      | 0 0 0 0 |
        +-------------------+---------+
                   PLUS
        +---------+-------------------+
Address | 0 0 0 0 | 16-bit value      |
        +---------+-------------------+
                  EQUALS
        +-----------------------------+
Result  |  20-bit memory address      |
        +-----------------------------+

这允许各种技术:

  • 允许代码,数据和堆栈都可以互相访问(CSDSSS 都具有相同的值);
  • 保持代码,数据和堆栈彼此完全分离(CSDSSS 所有 4K(或更多)彼此分开 - 记住它乘以 16,所以这是 64K)。

它还允许奇怪的重叠和各种奇怪的事情!

当 80286 被发明时,它支持这种传统模式(现在称为实模式),但增加了一种称为保护模式(qv)的新模式。

需要注意的重要事项是在实模式下:

  • 只需将正确的值放入段寄存器并访问 16 位地址即可访问任何存储器地址。
  • 保护的程度是允许程序员将不同的内存区域分开以用于不同的目的,并且使得更难以意外地写入错误的数据 - 同时仍然可以这样做。

换句话说……根本不受保护!