一.整体的设计

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

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

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

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