一、A20地址线是什么
A20地址线是一种处理器内部的地址线,用于在实模式和保护模式之间进行内存寻址的切换。简单来说,当A20地址线被打开时,表示只能访问1MB以内的空间,而当A20地址线被打开时,可以访问4GB的内存空间。
注意:是否进入保护模式仅由CR0寄存器的第一位是否置1有关,与A20地址线无直接关系
二、如何开启A20地址线
打开A20地址线,只需要将0x92端口的第一个位置置1就完成了。
**(其中uint8_t为unsigned char类型,uint16_t为unsigned short类型)**
具体步骤如下:
首先通过内联汇编方式封装读端口的c函数:
//读端口函数
static inline uint8_t inb(uint16_t port){
//返回参数
uint8_t rv;
//内联汇编形式读取端口
__asm__ __volatile__(
"inb %[p], %[v]"
:[v]"=a"(rv) : [p]"d"(port)
);
return rv;
/*注意的是:
inb al, dx是intel的汇编语法,而下面的
inb %[p], %[v]是GCC的汇编语法
两者表示同一指令,但是写法不一样。源,目的操作数位置正好相反
*/
}
然后封装写端口的c函数用于修改0x92端口的值:
//写端口函数
static inline void outb(uint16_t port, uint8_t data){
/*指令格式为
outb al(数据), dx(端口)
*/
__asm__ __volatile__(
"outb %[v], %[p]"
::[v]"a"(data), [p]"d"(port)
);
/*注意的是:
outb al, dx是intel的汇编语法,而下面的
outb %[v], %[p]是GCC的汇编语法
两者表示同一指令,但是写法不一样。源,目的操作数位置正好相反
*/
}
最后在需要打开A20地址线的地方通过调用这两个函数实现打开A20地址线,如:
//开A20地址线
uint8_t v = inb(0x92);
outb(0x92, v | 0x2);
即可完成A20地址线的开启。