memory - 为什么启用/禁用A20线

标签 memory x86 operating-system bios osdev

我有一个关于A20 gate的问题。我读了一篇有关它的文章,说存在一种机制来解决地址“回绕”的问题,当新的CPU使用32位地址总线而不是较旧的20位总线时,就会出现这种问题。

在我看来,处理折回的正确方法是关闭所有位A20-A31,而不仅仅是A20。

为什么仅关闭A20位就足以解决问题?

最佳答案

最初的问题与x86 memory segmentation有关。

可以使用segment:offset来访问内存,其中segmentoffset均为16位整数。实际地址计算为segment*16+offset。在20位地址总线上,这自然会被截断为最低的20位。

当相同的代码在宽度超过20位的地址总线上运行时,这种截断可能会带来问题,因为该程序可以访问第一个兆字节以外的内存,而无需进行环绕操作。虽然本质上不是问题,但这可能是向后兼容的问题。

要变通解决此问题,他们引入了一种方法来将A20地址行强制为零,从而强制进行环绕。

您的问题是:“为什么只是A20?那A21-A31呢?”

请注意,使用16位segment:offset方案可以寻址的最高位置是0xffff * 16 + 0xffff = 0x10ffef。这适合21位。因此,行A21-A31始终为零,仅需要控制A20

关于memory - 为什么启用/禁用A20线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13893056/

相关文章:

debugging - 如何检查我的汇编 8086 程序是否运行良好

c++ - 指向二进制文件的动态数组指针

assembly - 汇编程序 : Relative Jump

floating-point - 我可以使用 AVX FMA 单元进行位精确的 52 位整数乘法吗?

c - 任务: Rewrite X86-assembler program in C

c - C之前用于操作系统开发的语言

c++ - c++释放对象内存

Windows "Handle Invalid"上的 Python 将标准输出重定向到文件时

仅 Java 操作系统

PHP数组和内存分配