您的位置:首页 > 其它

1.3.3 打开A20,实现32位寻址

2015-10-03 10:32 267 查看
1.3.3 打开A20,实现32位寻址

下面的动作是标志性的—打开A20!

打开A20,意味着CPU可以进行32位寻址,最大寻址空间为4GB,注意看图1-19中内存条范围的变化。从5个F扩展到8个F,即0xFFFFFFFF—4GB。


图1-19 打开A20
现在看来,Linux 0.11还显得有些稚嫩,最大只能支持16MB的物理内存,但是其线性寻址空间已经是不折不扣的4GB。

打开A20的代码如下:

//代码路径:boot/setup.s

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


点评

实模式下CPU的寻址范围为0至0xFFFFF,共1MB寻址空间,需要0~19号共20根地址线。进入保护模式后,将使用32位寻址模式,即采用32根地址线进行寻址,第21根至第32根地址线的选通,将意味着寻址模式的切换。

实模式下,当程序寻址超过0xFFFFF时,CPU将“回滚”至内存地址起始处寻址(注意:在只有20位地址线的条件下,0xFFFFF + 1 = 0x00000,最高位溢出)。例如,系统的段寄存器(如CS)的最大允许地址为0xFFFF,指令指针(IP)的最大允许段内偏移也为0xFFFF,两者确定的最大绝对地址为0x10FFEF,这将意味着程序中可产生的实模式下的寻址范围比1MB多出将近64KB(一些有特殊寻址要求的程序就利用了这个特点)。这样,此处对A20地址线的启用相当于关闭了CPU在实模式下寻址的“回滚”机制。在后续代码中也将看到利用此特点来验证A20地址线是否确实已经打开。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: