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。
现在看来,Linux 0.11还显得有些稚嫩,最大只能支持16MB的物理内存,但是其线性寻址空间已经是不折不扣的4GB。
打开A20的代码如下:
点评
实模式下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地址线是否确实已经打开。
下面的动作是标志性的—打开A20!
打开A20,意味着CPU可以进行32位寻址,最大寻址空间为4GB,注意看图1-19中内存条范围的变化。从5个F扩展到8个F,即0xFFFFFFFF—4GB。
图1-19 打开A20 |
打开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地址线是否确实已经打开。
相关文章推荐
- Linux中的查看已挂载的文件系统命令
- 图的邻接链表
- HDU 2520 我是菜鸟,我怕谁(水~)
- 字符函数lpad,rpad,ltrim,rtrim,substr使用
- [Qt] qtcreator 中打开console
- wamp下配置Smarty
- linux进程间通信方式之匿名管道http://blog.csdn.net/guoyang1007/article/details/4720984
- Repeated DNA Sequences
- HTTP协议笔记
- webstorm9.3 安装less 编译css教程
- HTML初步学习10
- n皇后问题
- HDU 2519 新生晚会(水~)
- 86. Partition List (List)
- 1.3.2 设置中断描述符表和全局描述符表
- MySql存储过程 MySql存储过程详解
- 日经春秋 20151003
- JS中的定时器
- java学习笔记之动态编译
- 在eclipse右键new菜单项中添加android application