1.从系统加电起所执行程序的顺序
ROM BIOS -----> bootsect.S -----> setup.S -----> head.s -----> main.c
其中,head.s和main.c都属于system模块
main属于初始化程序,这里不讲
2.几个程序的比较
程序名 | 位置 | 语言 |
ROM BIOS | ROM | |
bootsect.S | boot/bootsect.S | as86汇编语言 |
setup.S | boot/setup.S | as86汇编语言 |
head.s | boot/head.s | GNU汇编语言 |
main.c | init/main.c | C语言 |
3.ROM BIOS的功能
(1)执行某些系统检测
(2)在物理地址0处开始初始化中断向量
(3)将启动设备的第一个扇区读入到绝对地址0x7c00处
(4)跳转到绝对地址0x7c00处
4.bootsect.S的功能
(1)把自己移到0x90000处(本来在0x7c00)
(2)从磁盘把第2-4个扇区的setup模块读入到0x90200处(紧接着bootsect)
(3)取磁盘参数表中当前启动引导磁盘的参数
(4)显示“Loading system”字符串
(5)system模块加载到0x10000处
(6)确定要文件系统的设备号
(7)跳转到setup程序开始处(0x90200)
5. setup.S的功能
(1)读取机器系统数据,并保存到0x90000开始的位置
(2)将system模块从0x10000-0x8ffff移到0x00000-0x7ffff处
(3)加载idtr和gdtr
(4)开启A20,重新设置两个中断控制芯片8259A,将硬件中断号重新设置为0x20-0x2f
(5)设置CR0(从而进入保护模式)
(6)跳转到system模块最前面部分的head.s(0x0000)
6.head.s的功能
(1)加载各个数据段的寄存器
(2)重新设置idt
(3)重新设置gdt
(4)检测A20是否已真的开启
(5)测试PC是否含有数学协处理器芯片
(6)设置管理内存的分布处理机制
(7)将预先入围在堆栈中的/init/main.c程序的入口地址弹出,运行maina()