内核引导启动程序
文件结构
知识补充
BIOS:
- 计算机启动最开始执行的BIOS程序,BIOS(Basic Input Output System).
- 是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息
结合boot/目录下程序讲解计算机启动流程
- PC的电源开机后,80x86结构的CPU自动进入实地址模式。
- 执行从0xFFFF0开始的程序,一般就是BIOS,再次映证BIOS是计算机启动第一个执行的程序。
- BIOS将执行系统的检测,并在物理地址0处开始初始化中断向量,这里的中断向量是BIOS中断。
- 将软盘或硬盘的第一个扇区(512字节)读入内存绝对地址为0x7C00处,并跳转到这个地方。
小结:BIOS是计算机加电后第一个执行的程序,BIOS执行完毕后会加载第一个扇区的程序到0x7C00处继续执行,这里的第一个扇区存放boot/bootsect.s,其功能下面进行讲解。
程序分析
bootsect.s(8086汇编)
- 首先理解下文件名:其名为bootsect.s,后缀名表示其为汇编程序,那么bootsect的含义呢?boot表示启动,sect是section的缩写,表示扇区,即bootsect是启动扇区的含义。
- 上面说到,BIOS执行完后会将bootsect.s加载到0x7c00处,然后开始执行bootsect.s,下面分析bootsect.s程序,不要怕,就是简单的汇编,我们日常作业写的汇编都比这难,只不过这里涉及一些硬件相关的知识和BIOS的中断调用。
功能描述:
BIOS int 0x13中断理解
简单来说:该中断将指定扇区的代码加载到内存指定位置,其本质是磁盘服务程序。
- 将自己移动到内存0x90000处,并跳转到0x90000
- 利用BIOS的int 0x13,将setup.s模块加载到0x90200处
- 利用BIOS的int 0x13(上面说过,BIOS从物理地址0处设置中断向量)取磁盘参数表中当前启动引导盘的参数
- 将system模块(链接生成的文件镜像),从磁盘加载到内存0x10000开始的地方
- 设置根文件系统
- 长跳转到setup程序,执行setup.s程序
提问:上面提到0x90000, 0x90200,0x10000,为什么非得是这三个地址呢?不能是其他吗?看下面一张程序分布图(提示:三个地址是根据每个程序的大小来定的, 0x200B == 512B == 一个扇区大小):
源码解析
由于源码篇幅比较大,我不会将所有源码贴进来,建议读者去下载本系列博客目录提供的书籍资料,以及源码压缩包,然后配合本博客一起读,笔者使用VSCode(安装x86 and x86_64 Assembly插件)阅读汇编代码。
- 数据以及标识符声明部分:
! ! SYS_SIZE is the number of clicks (16 bytes) to be loaded. ! 0x3000 is 0x30000 bytes = 196kB, more than