总体过程:
整体概述:
PC打开电源,CPU自动进入实模式,并从地址0xffff0开始执行程序代码,这个地址是ROM-BIOS中的地址。PC机的BIOS将执行某些系统的检测,并在物理地址0开始处初始化中断向量。并将可启动设备的第一个扇区读入内存绝对地址0x7c00处,并跳转到这个地方。
boot/bootsec.s,将由BIOS读入到内存绝对地址0x7c00处,当执行时会把自己移动到0x90000处,并把启动设备的2KB代码读入到内存0x90200处,而内核的其它部分system模块会被读入到内存地址0x10000开始处;
后面setup程序将会把SYSTEM模块移到物理内存地址起始位置,这样system模块中的代码地址和实际的物理地址一致,便于对内核代码和数据进行操作;并进入保护模式。
1、bootsect.s详解
#内核大小192KB
SYSSIZE = 0x3000
#代码段、数据段、未初始化数据段,本程序不分段,定义在一起
.globl begtext, begdata, begbss, endtext, enddata, endbss
.text
begtext:
.data
begdata:
.bss
begbss:
.text
#定义变量
SETUPLEN = 4 #setup占用的扇区数
BOOTSEG = 0x07c0 #引导扇区被加载到的原始地址
INITSEG = 0x9000 #引导扇区运行后,自身搬迁到的地址
SETUPSEG = 0x9020 #setup被加载到的地址
SYSSEG = 0x1000 #kernel被加载到的地址
ENDSEG = SYSSEG + SYSSIZE #加载内核的结束地址
ROOT_DEV = 0x306 #挂载文件系统的位置,第2个硬盘的第1个分区
entry _start
_start:
mov ax,#BOOTSEG #将DS设置成0x07c0
mov ds,ax