有人告诉我,segment:offset成对用于表示 20 位。段被移位 4 位,值加上偏移量成为物理地址。在 32 位系统上我不必再担心了,但我仍然很好奇。
- 为什么偏移分配为 16 位,而不是 4 位?
- 多个虚拟地址对应一个物理地址没有问题吗?
有人告诉我,segment:offset成对用于表示 20 位。段被移位 4 位,值加上偏移量成为物理地址。在 32 位系统上我不必再担心了,但我仍然很好奇。
您指的是上个世纪 80 年代初。8086 体系结构使用这种寻址 20 位物理内存的方式,当时是巨大的 1(一!)MByte,或“一百万字节的内存”,正如 Intel 在 /1/, p.2-7 中所称。
这些“逻辑地址”,正如英特尔在 /1/ 中所称,主要有两个用途:
“分段使构建可重定位和可重入程序变得容易。......(重定位意味着能够在几个不同的内存区域中运行相同的程序,而无需更改程序本身的地址)......”
因此,为了回答您的第一个问题,不能使用 4 位而不是 16 位的偏移量来构建每个 64kB 的段,以便在必要时重新定位。64kB 段大小是 16 位系统(如 8086)中的“自然”值。
关于您的第二个问题,如果不小心处理重叠段,例如当代码和数据重叠时,重叠段当然可能会出现问题。但英特尔明确希望段可以以最可能的方式重叠,通过赋予它们相同的值,允许在只有 64kByte 内存的系统中使用这种分段架构。
根据英特尔 (/1/, p.2-8) 的说法:“在内存总量为 64K 字节或更少的系统中,可以将所有段寄存器设置为相等并具有完全重叠的段。”
/1/:iAPX 86、88、168 和 188 用户手册,程序员参考,英特尔 1983