Memory 为什么16位机器上的20个地址空间可以访问1兆字节而不是2兆字节?

Memory 为什么16位机器上的20个地址空间可以访问1兆字节而不是2兆字节?,memory,cpu-architecture,x86-16,memory-address,processor,Memory,Cpu Architecture,X86 16,Memory Address,Processor,好的,这个问题听起来很简单,但我很惊讶。在远古时代,当1兆字节是一个巨大的内存量时,英特尔试图找出如何使用16位来访问1兆字节的内存。他们提出了使用段和偏移地址值生成20位地址的想法 现在,20位给出了2^20=1048576个可以寻址的位置。现在假设我们每个地址位置访问1个字节,我们得到1048576/(1024*1024)=2^20/2^20兆字节=1兆字节。好的,我明白了 混淆就在这里,我们在古老的8086中有16位数据总线,一次可以访问2个字节而不是1个,这等于20位地址可以访问总共2兆

好的,这个问题听起来很简单,但我很惊讶。在远古时代,当1兆字节是一个巨大的内存量时,英特尔试图找出如何使用16位来访问1兆字节的内存。他们提出了使用段和偏移地址值生成20位地址的想法

现在,20位给出了2^20=1048576个可以寻址的位置。现在假设我们每个地址位置访问1个字节,我们得到1048576/(1024*1024)=2^20/2^20兆字节=1兆字节。好的,我明白了


混淆就在这里,我们在古老的8086中有16位数据总线,一次可以访问2个字节而不是1个,这等于20位地址可以访问总共2兆字节的数据,对吗?当数据总线为2字节宽时,为什么我们假设每个地址中只存储了1字节?我在这里感到困惑。

这是因为一个字节是内存寻址中的“原子”,代码必须能够访问地址空间中的所有单个字节。真正的问题是软件和兼容8位现有软件


这也可能使你感兴趣:

当你试图理解这一点时,考虑公共汽车是非常重要的。这可能更像是一个电气问题,而不是软件问题,但答案如下:

对于8086,当从ROM读取时,不使用最低有效地址行(A0),从而将地址行的数量减少到19条

如果CPU需要从奇数地址读取16位,例如0x3和0x4处的字节,它实际上将执行两次16位读取:一次从0x2读取,一次从0x4读取,并丢弃字节0x2和0x5

对于8位ROM读取,总线上的读取仍然是16位,但不需要的字节被丢弃

但对于RAM,有时只需要写入一个字节,这会变得更复杂一些。处理器上有一个称为BHE#(总线高启用)的额外输出信号。A0和BHE#的组合用于确定写入是8位还是16位宽,以及是否位于奇数或偶数地址

理解这两个信号是回答您的问题的关键。尽可能简单地说:

8位偶数存取:A0关闭,BHE关闭

8位奇数存取:A0开,BHE开

16位访问(必须为偶数):A0关闭,BHE打开

我们不能有一个A0开BHE#关的总线循环,因为对总线偶数字节的奇数访问是没有意义的

将此与您最初的理解联系起来:对于内存设备,您是完全正确的。1兆字节的16位内存芯片实际上只有19条地址线,对该芯片而言,16位是一个字节,实际上,它们没有A0地址输入

。。。几乎。16位可写存储器设备有两个额外信号(BHE#和BLE#),分别连接到CPU的BHE#和A0。这样,当8位访问正在进行时,他们知道忽略部分总线,使他们成为8/16位混合设备。ROM芯片没有这些信号

对于未启蒙的硬件,这是一个相当复杂的领域,我们在这里讨论,它确实变得非常复杂,在性能考虑方面,以及在混合了8位和16位硬件的大型系统中


这在

中有非常详细的解释,对于开发人员来说,地址可以指向任意大小的内存块,对吗。我假设,处理器模型需要一个最小的可加载到寄存器的块(字节,对吗?)才是唯一可寻址的。嗯,您能详细说明一下吗?我只是完全惊讶于可寻址字不是数据总线宽度那样的2字节。我真没想到。我做了几次计算,得到了2兆字节,然后我意识到可寻址字必须是1字节长,所以20位正好给我们1兆字节。我想知道为什么还没有人回应,也许,你们不应该把巴士牵涉进来。我怀疑您计算了类似“带宽”的东西:拥有2字节宽的总线,您可以传输比1字节宽的总线两倍的数据。但巴士仍然和地址无关。您应该能够寻址某个字节。例如,您的地址#0指向单词“AB”和#1:“CD”。你怎么能说CPU将字节“B”加载到AX“用你的文字寻址?如果我想解决一个dword或四位机怎么办?从某种意义上说,8086是一个过渡的混合处理器,设计用于擅长于伟大的新16位代码,以及可能移植到它的当前8位代码。这就是为什么它有完整的8位指令。此外,Intel有一个名为8088的变体,它有一个8位总线而不是16位总线,这将允许人们制造使用当时流行的组件的更便宜的机器。IBM 5150(原始PC)附带了8088,而不是8086。因此,它需要支持8位寻址,而不考虑其最佳字长(16位)。狭义地回答您的问题:因为8086使用8位寻址,而不是16位寻址。即使使用带有完整16位数据总线的8086(与具有8位总线的8088相比),地址也指向单个字节,而不是16位字