使用 INT 15 中断
/*
* 关闭A20
* 返回结果:
* 成功:CF=0
* AH=0
* 失败:CF=1
* AH=01 键盘控制器处于secur模式
* =86H 功能不支持
*/
movw $0x2400, %ax
int 0x15
/*
* 打开A20
* 返回结果:
* 成功:CF=0
* AH=0
* 失败:CF=1
* AH=01 键盘控制器处于secur模式
* =86H 功能不支持
*/
movw $0x2401, %ax
int 0x15
/*
* 获取A20状态
* 返回结果:
* 成功:CF=0
* AH=0
* AL=0 已关闭
* =1 已打开
* 失败:CF=1
* AH=01 键盘控制器处于secur模式
* =86H 功能不支持
*/
movw $0x2402, %ax
int 0x15
使用0x92端口
/*
* 打开
*/
inb $0x92
andb $(~0x03), %al
orb $0x02, %al
outb $0x92
/*
* 关闭
*/
inb $0x92
andb $(~$0x02), %al
outb $0x92
操作键盘控制器
call gate_a20_flush_keyboard_buffer
movb $0xd1, %al
outb $0x64
4:
inb $0x64
andb $0x02, %al
jnz 4b
movb $0xdd, %al
testb %dl, %dl
jz 5f
orb $0x02, %al
5: outb $0x60
call gate_a20_flush_keyboard_buffer
/* output a dummy command (USB keyboard hack) */
movb $0xff, %al
outb $0x64
call gate_a20_flush_keyboard_buffer
gate_a20_flush_keyboard_buffer:
inb $0x64
andb $0x02, %al
jnz gate_a20_flush_keyboard_buffer
2:
inb $0x64
andb $0x01, %al
jz 3f
inb $0x60
jmp 2b
3:
ret