在 8086 中可以访问的最大内存容量(以字节为单位)是多少?



程序可以占用的最小内存空间是多少?

我知道8086中的每个寄存器的最大容量为16位

8086有一个20位的线性/物理地址空间,所以1mb的RAM + ROM +设备内存。

8086上唯一可用的模式是后来的cpu称为"实模式"的模式,其中两个16位半的逻辑地址seg:off映射为线性地址(seg<<4) + off。这个计算可以稍微超过1MiB,并且在后来的cpu/系统上,封装到20位可能会被禁用(A20门),尽管这对于其他设置段基数不同的模式非常有用,允许访问更多的内存。

Michael Petch评论说,一些外接卡提供了一个64K的窗口到大量的物理内存,比如高达32MiB。这就像"银行兑换"一样。为了访问该空间的不同部分,程序必须执行I/O操作,例如out指令。从逻辑上讲,这有点像对硬盘驱动器或SSD的分页,只是存储直接到额外的内存,所以您可以从修改过的存储切换,而不需要先回写。当然,性能是非常不同的,切换银行的延迟远远低于在旋转硬盘驱动器上写+读64K。但是它对软件来说是不透明的,所以它不会像拥有大量的内存来运行一个不知道这个附加内存扩展卡的程序那样工作。


最小程序大小取决于操作系统。在DOS下,包含C3(ret)的1字节.com文件将干净地执行,返回到DOS放入其内存映像中的退出系统调用。我不知道不同版本的DOS需要多少空间来实际加载它;大概至少有一个512字节的磁盘扇区加上PSP(程序段前缀)的空间。

在裸机上,具有无限循环的2字节ROM (jmp $,即jmp rel8=-2)可能会执行,尽管您只能通过在它重新获取代码时观察地址行来知道,因为它当然不能做任何事情。(您可能需要一个cli,尽管可能CPU启动时禁用了中断)

如果它是连接在8088上的所有东西,它只需要解码地址行的低位,以便在8位总线上分别提供每个字节。如果连接到8086上,它不需要解码任何地址行,只需要一个时钟和读取信号,就像16位一样,但是会并行地获取两个字节。或者你可以把8086的16个引脚硬连接到电源和地上。

8086处理器可以使用分段内存模型寻址1MB内存。一个内存段可以包含代码或数据(或两者都包含),一个给定的内存段最大可达64K。

在实践中,一些内存空间被中断向量表、BIOS和诸如显卡内存缓冲区之类的设备占用。可寻址RAM的确切数量取决于硬件配置。

虽然1MB是8086可直接寻址的内存限制(或以后处理器的真实模式),但可以使用银行交换技术将额外的内存映射到该地址空间的窗口中。

在MS-DOS中,银行交换的第一个标准实现被称为LIM (Lotus, Intel, Microsoft)。它允许将物理内存映射到地址空间中4个最高的16KB内存块中的每一个,这被称为上部内存区(UMA)。

后来的规范扩展内存规范(XMS)允许将扩展物理内存映射到可用的地址空间的任何地方。

当时的游戏机也采用了类似的技术。

相关内容

  • 没有找到相关文章

最新更新