1

在 8086 中,多个逻辑地址 ( segment:offset) 可以具有相同的物理地址(001F:000F并且000F:010F是相同的地址,就像001F:000F = 01F0+000F = 01FF一样000F:010F = 01FF)。

在物理内存中,任何程序都可以看到逻辑内存地址。因此,多个程序可以在同一物理地址(尽管逻辑地址不同)位置拥有数据(字节)。为什么它们不相互碰撞?为什么我们不丢失数据???

4

2 回答 2

3

8086 可以寻址 1MB 的内存,需要 20 位来指定任何特定字节的地址。由于 8086 的寄存器只保存 16 位,因此开发了段模型,它为这 1M 个地址中的每一个赋予了许多不同的名称。正如数字4可以命名为0+41+32+2等一样,地址12345也可以表示为1234:00051233:00151230:0045等。

换句话说,每个物理地址有 64k 个不同的逻辑地址。这意味着如果一个程序正在访问1234:0005而另一个程序正在访问1233:0015,那么这两个程序将访问完全相同的内存地址。

那么我们如何防止不同的程序相互“碰撞”呢?首先,要认识到现代计算机不再使用 8086es。如果您有多个程序在实际的 8086 上运行,它们可能会相互合作,共享地址空间。

现代 CPU 不再以 1MB 分段模式(称为“实模式”)运行。如果您运行 Windows 或 Linux 之类的操作系统,CPU 使用称为虚拟内存的东西,其中每个程序都有自己的逻辑地址到物理地址的映射。在这种模式下,程序通常使用 32 位或 64 位的逻辑地址,并且程序不知道给定的逻辑地址如何映射到物理地址。任何数量的程序都可以使用同一组逻辑地址,并且物理地址不会重叠,除非程序特别安排这样做。

于 2013-08-08T06:55:41.823 回答
0

在DOS下程序不能同时运行,所以不存在碰撞问题。

在多任务操作系统中,每个进程都在操作系统指定的自己的地址空间上运行。它们的逻辑地址映射到不同的物理地址(共享内存位置除外),因此也不会发生任何冲突。

于 2013-08-08T09:46:50.610 回答