2、setup.s详解
一、总述
setup.s 主要作用是利用BIOS中断读取机器系统数据,并将这些数据保存在0x90000开始处,即覆盖bootsec地方;
setup将system系统模块从0x10000移到绝对地址0x0000处,接下来加载中断描述符表寄存器IDT和全局描述符表寄存器GDT,开启A20地址线,重置两个中断控制器芯片8259A,将硬件中断号重新设置为0x20-0x2f。最后控制CPU的寄存器CR0,进入32位保护模式运行,并跳转到位于system模块最前面部分的head.s程序继续运行。
二、代码详解
INITSEG = 0x9000 ! we move boot here - out of the way #boot起始位置
SYSSEG = 0x1000 ! system loaded at 0x10000 (65536). #系统起始问题
SETUPSEG = 0x9020 ! this is the current segment #setup当前段
#数据段、代码段、未初始化代码段
.globl begtext, begdata, begbss, endtext, enddata, endbss
.text
begtext:
.data
begdata:
.bss
begbss:
.text
#开始
entry start
start:
#使用BIOS中断INT10获取屏幕当前光标位置,并保存在内存0X90000处(2个字节)
#再设置一下DS段
mov ax,#INITSEG ! this is done in bootsect already, but...
mov ds,ax
mov ah,#0x03 ! read cursor pos
xor bh,bh
int 0x10 ! save it in known place, con_init fetches
mov [0],dx ! it from 0x90000.
#取扩展内存的大小值
#利用BIOS中断0x15功能号ah=0x88获取系统所含扩展内存大小并保存在0X90002处
#返回:AX=0x100000处开始扩展内存大小KB
mov ah,#0x88
int 0x15
mov [2],ax
#获取显示卡当前显示模式
#调用BIOS中断