续上一篇 bootsect.s讲解
功能描述
- setup程序的主要作用是利用ROM BIOS中断读取机器系统数据,并将这些数据保存到0x90000开始的位置
- 为什么保存在0x90000开始的位置呢?因为0x90000之前保存的bootsect程序已经执行完毕,可以覆盖掉了
- 将system模块从0x10000-0x8ffff(512KB)整体向下移动到内存绝对地址0x00000处。
- 加载中断描述符表寄存器idtr和全局描述符表寄存器gdtr,开启A20地址线,重新设置两个中断控制芯片8259A,将硬件中断号重新设置为0x20 - 0x2f。
- 最后设置CPU的控制寄存器CR0,从而进入32位保护模式运行,并跳转到位于system模块最前面部分的head.s继续运行。
代码分析
- 首先是数据声明部分
INITSEG = 0x9000 ! we move boot here - out of the way SYSSEG = 0x1000 ! system loaded at 0x10000 (65536). SETUPSEG = 0x9020 ! this is the current segment .globl begtext, begdata, begbss, endtext, enddata, endbss .text begtext: .data begdata: .bss begbss: .text
- 先读取当前坐标,保存起来以备后续使用
entry start start: ! ok, the read went well so we get current cursor position and save it for ! posterity. 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 ! 返回结果保存在dx寄存器中,然后将结果保存到0x90000处。it from 0x90000.
- 获取从0x10000开始的扩展内存大小(KB)
! Get memory size (extended mem, kB) mov ah,#0x88 int 0x15 mov [2],ax ! 返回值保存在ax中,ax=从0x100000开始的扩展内存大小(KB)
- 获取显卡相关信息并保存起来
! Get video-card data: mov ah,#0x0