Unix 的 boot loader 里,在最开始部分有段代码是用来打开 A20 的。什么是 A20 呢?为什么不让它默认为打开,而是每次系统启动时都要打开它呢?
原来这个是计算机的历史遗留问题。在 8088 的时候,计算机只有 20 条地址线,所以只能寻址 1 MB 的范围。PC 通常用两个 16 位寄存器寻址,一个存 selector,一个存 offset,即 selector:offset,计算得到的地址就是 selector*16+offset。这样,最大的地址就是 FFFF:FFFF,即 0x10FFEF,但是这就超过了 20 条地址线的寻址范围 1 M,所以 8088 自动把高出 1 MB 的那部分置 0,例如 0x10FFEF wrap 成 0x00FFEF,相当于是对 1 M 求模。
到了 80286 时代,PC 已经有了 24 条地址线,但是为了向下兼容性,80286 的设计目标是在实模式下保持与 8088 一样的行为。但是最终 286 出现了一个 bug,在实模式下对 0x100000 到 0x10FFEF 寻址时,实际上并没有对 1M 求余,而是真的访问了 0x100000 到 0x10FFEF 之间的内存。为了解决这个问题,IBM 发明了一个开关,用来打开或关闭 0x100000 地址位。在实模式时,关闭 0x100000 位,即使第 21 根地址线无效,进入保护模式前,再打开 0x100000 位。具体是利用键盘控制器闲置线来控制一个与门来控制,这个信号就叫做 A20。
什么是 A20
最新推荐文章于 2020-03-14 23:04:10 发布