【笔记】Linux引导启动程序1806

*内核版本0.11,《Linux内核完全注释》引导启动程序(boot)(bootsect.s;head.s;setup.s)

笔记打卡

1 总体功能

        系统启动部分流程:PC电源打开后,80x86结构CPU自动进入实模式,并从地址0xFFFF0开始自动执行程序代码(通常是ROM-BIOS中的地址)。PC机的BIOS执行系统检测,并在物理地址0处开始初始化中断向量(1KB),此后,启动设备的第一个扇区,将bootsect.s读入内存绝对地址0x7C00(31KB)处,并跳转至此处,当它被执行时,将自己移动到内存绝对地址0x90000(576KB)处,并将启动设备中后2KB字节代码(setup.s)读入内存0x90200处,将内核的其他部分(不超过512KB)读入内存地址0x10000(64KB)开始处。setup.s调用完BIOS中断获取到一些硬件参数之后,将系统模块移动到物理内存起始位置处,进入保护模式,并跳转到该位置。启动引导时内核在内存中的位置和移动后的位置情况如图1.1所示。

【笔记】Linux引导启动程序1806_第1张图片
图1.1 启动引导时内核在内存中的位置和移动后的位置情况

2 bootsect.s程序

        ROM BIOS将扇区代码bootsect加载到内存0x7c00处并开始执行,bootsect运行期间先将自己移动到内存绝对地址0x90000开始处,进而把磁盘第2个扇区开始的4个扇区的setup模块加载到内存紧接着bootsect后面位置处(0x90200),然后利用BIOS中断0x13取磁盘参数表中当前启动引导盘的参数。接下来把磁盘上setup模块后面的system模块加载到内存0x10000开始的地方。然后确定根文件系统的设备号,若没有指定,根据所保存的引导盘每磁道扇区数判别出盘的类型和种类并保存其设备号于root_dev中。最后,长跳转到setup程序开始处(0x90200)执行setup程序。

3 setup.s程序

        首先利用ROM BIOS中断读取机器系统数据,并将这些数据保存到0x90000开始的位置(覆盖bootsect程序),所取得的参数和保留的内存位置见图3.1。进而将system模块冲0x10000-0x8ffff整块下移到内存绝对地址0x00000处。然后加载中断描述符表寄存器idtr和全局描述符表gdtr,开启A20地址线,设置8259A,设置硬件中断号0x20-0x2f,最后设置CR0,进入保护模式后跳转到system模块最前面的部分head.s执行。

【笔记】Linux引导启动程序1806_第2张图片
图3.1 setup程序读取并保留的参数

4 head.s程序

        程序从内存绝对地址0处开始,加载各个数据寄存器,重新设置中断描述符表idt,共256项,并使各个表项均指向一个只保错误的哑中断子程序ignore_int。此后,重新设置全局描述符表gdt,接着检测A20地址线是否真正启动,然后设置管理内存的分页处理机制,将页目录表放在绝对物理地址0开始处。最后,程序利用返回指令将预先放置在堆栈中的/init/main.c程序的入口弹出,运行main()程序。

你可能感兴趣的:(【笔记】Linux引导启动程序1806)