1. setup程序的主要作用是利用ROM BIOS中断读取机器系统数据,并将这些数据保存到0x90000开始的位置(覆盖掉了bootsect程序),所取得的参数和保留的内存位置见下表。
内存地址 | 长度 (字节) | 名称 | 描述 |
0x90000 | 2 | 光标位置 | 列号(0x00-最左端),行号(0x00-最顶端) |
0x90002 | 2 | 扩展内存数 | 系统从1M开始的扩展内存数值(KB) |
0x90004 | 2 | 显示页面 | 当前显示页面 |
0x90006 | 1 | 显示模式 |
|
0x90007 | 1 | 字符列数 |
|
0x90008 | 2 | ?? |
|
0x9000A | 1 | 显示内存 | 显示内存(0x00-64k,0x01-128k,0x02-192k,0x30-256k) |
0x9000B | 1 | 显示状态 | 0x00-彩色,I/O=0x3dX;0x11-单色,I/O=0x3bX |
0x9000C | 2 | 特性参数 | 显示卡特性参数 |
0x90080 | 16 | 硬盘参数表 | 第一个硬盘的参数表 |
0x90090 | 16 | 硬盘参数表 | 第二个硬盘的参数表 |
0x901FC | 2 | 根设备号 | 根文件系统所在的设备号(bootsect.s中设置) |
然后setup程序将system模块从0x10000-0x8ffff整块向下移动到内存绝对地址0x00000处。接下来加载中断描述符表寄存器(idtr)和全局描述符表寄存器(gdtr),开启A20地址线,重新设置两个中断控制芯片8259A,将硬件中断号重新设置为0x20-0x2f。最后设置CPU的控制寄存器CR0(机器状态字),从而进入32位保护模式进行,并跳转到位于system模块最前面部分的head.s程序继续运行。
2. 执行setup.s程序后内存映像
3. 硬盘基本参数表
在PC机BIOS设定的中断向量表中,int 0x41的中断向量位置(4*0x41 = 0x0000:0x0104)存放的并不是中断程序的地址,而是第一个硬盘的基本参数表。int 0x46中断向量位置存放的是第二个硬盘的基本参数表。
4. A20地址线问题
为了兼容8088实现回环而设置的专用信号。