操做系统-从bootloader到内核雏形

一.总体的设计

操做系统-从bootloader到内核雏形
从上图能够获得一个问题,为何不能从boot直接加载kernnel,并跳转运行?
该设计的思路
1.boot必须小于512字节,没法完成过多功能
2.kernel须要运行于32位保护模式(汇编+c语言)
3.使用loader中转:获取必要硬件信息,进入保护模式
进行的重构方案以下所示
操做系统-从bootloader到内核雏形
文件功能的定义
common.asm--常量定义,宏定义
blfunc.asm--实模式下的文件加载功能定义
boot.asm--加载loader并跳转[引导扇区]
loader.asm--在这里须要进行的操做是必要硬件初始化,加载kernel,进入保护模式,跳转到kernel执行ide

须要进行的修改
1.将以前定义的inc.asm修改为common.asm,并在makefile中的连接关系将其相关的名字进行修改
2.在loader.asm中相关的头文件进行修改
3.函数重构的实现--将其实现不一样的接口[将以前的代码进行改写,细分模块
操做系统-从bootloader到内核雏形
blfunc.asm注意事项
1.%include "blfunc.asm"必须是第一条"包含"语句
2.%include "blfunc.asm"强制从BLMain标签处开始执行
3.Buffer为必要的内存缓冲区必须在代码末尾定义函数

内核雏形构造
操做系统-从bootloader到内核雏形
经过上图可知,kernel.out加载进内存后不能直接被x86处理器运行,产生的缘由有三种
1.kernel.out是Linux系统中的可执行程序
2.Linux中的可执行程序为elf格式的文件-固定数据格式
3.处理器只认代码和数据,没法正确执行elf可执行程序
改进方法
1.提取elf文件中的代码段与数据段-删除elf文件格式信息
2.重定位提取后的代码和数据段,获得内核文件
3.加载内核文到内存-起始地址可自定义
4.跳转到内核入口地址处执行工具

在这里介绍一个工具,会有三种数据处理格式-以下图所示
操做系统-从bootloader到内核雏形
操做系统-从bootloader到内核雏形
所需的实验文件连接https://down.51cto.com/data/2468702
小结
1.实验nasm和gcc编译获得的是elf目标文件
2.ld将elf目标文件装配成为elf可执行程序
3.实验elf2kobj将可执行程序转换为内核文件
4.在实模式下加载转换获得的内核文件
5.进入保护模式后执行跳转内核起始位置处执行操作系统