INT15 A20 Control
INT15是一个Misc Function, 很多乱七八糟的功能都被放在 INT15中实现。比较常见的有这样几个功能:1.CPU Micro Code Update ;2.VBIOS call back Function;3. A20 Control Function。 之前我并不知道INT15 A20 Control Function的功能,一次偶然机会 在debug 一个PXE网络ghost的问题 发现每次DOS下的ghost软件运行到一半就报错了, 然后利用DOS下的单步执行的功能就发现每次执行完加载HIMEM.SYS之后就挂了,而HIMEM.SYS是一个和高端内存相关的一只Driver 于是就怀疑可能和A20有关,后来按照CRB Release History Update了一个INT15CB的bin文件 bug就解了,当时因为赶时间就没有仔细去找原因,也不太明白为什么,直到最近查文档才偶然发现原来INT15 有一直A20 Control Function。A20 Control Function调用的格式如下所示:
INT 15 AX=2400 disable A20
INT 15 AX=2401 enable A20
INT 15 AX=2402 query status A20
INT 15 AX=2403 query A20 support (kbd or port 92)
A20的问题指的是早期的8088 CPU地址线只有20位,最高只能寻址0x100000的地址空间,对于超出这个地址空间的寻址会导致地址回绕的现象。后来CPU地址线发展的原来越多(24,32,36…)为了完全兼容8088实模式下的运行方式就发现一个开关用于控制A20,通常该开关使用KBC 8042的一个没有用的pin来控制,但是因为KBC的芯片并不完全兼容,后来又出现了port 0x92以及0xee 的控制方式。这些控制方式的sample code分别如下所示:
1.KBC Control
call empty_8042
mov al,#0xd1 ! command write
out #0x64,al
call empty_8042
mov al,#0xdf ! A20 on
out #0x60,al
call empty_8042
2.Port 0x92 Control
inb $0x92, %al #
orb $02, %al # "fast A20" version
outb %al, $0x92 # some chips have only this
3. Port 0XEE Control
FAST A20 GATE EEh N/A 82360SL 8
Inb FAST A20 GATE #enable A20
outb 0x00 FAST A20 GATE #disable A20
因为控制的方式并不统一,这样系统软件开启A20的实现方式也就没法统一,而唯一知晓平台A20控制方式的就只有SBIOS,于是就指定INT15的A20 Control Function 把具体的实现丢给SBIOS。
A20 - a pain from the past
Peter
2010-11-07