启动初始化

记录初始化过程:

BIOS初始化自检内存代码_操作系统


BIOS初始化自检内存代码_初始化_02

1、PC 机 BIOS 固件是固化在 PC 机主板上的 ROM 芯片中的,掉电也能保存,PC 机上电后的第一条指令就是 BIOS 固件中的,它负责检测和初始化 CPU、内存及主板平台,然后加载引导设备(大概率是硬盘)中的第一个扇区数据,到 0x7c00 地址开始的内存空间,再接着跳转到 0x7c00 处执行指令,在我们这里的情况下就是 GRUB 引导程序。

2、GRUB 在启动时会加载一个 grub.cfg 的文本文件,根据其中的内容执行相应的操作,其中一部分内容就是启动项。GRUB 首先会显示启动项到屏幕,然后让我们选择启动项,最后 GRUB 根据启动项对应的信息,加载 OS 文件到内存,也即eki或者bin文件。

#myOS启动项

menuentry 'HelloOS' {
	insmod part_msdos
	insmod ext2
	set root='hd0,msdos1' #我们的硬盘只有一个分区所以是'hd0,msdos1',如果出错可以更改为'hd0'
	multiboot2 /boot/HelloOS.eki #加载boot目录下的HelloOS.eki文件
	boot #引导启动
}
set timeout_style=menu
if [ "${timeout}" = 0 ]; then
  set timeout=10 #等待10秒钟自动启动
fi

3、我们决定让 GRUB 只加载一个文件。但是要把多个文件变成一个文件就需要封装,即把多个文件组装在一起形成一个文件。这个文件我们称为内核映像文件,其中包含二级引导器的模块,内核模块,图片和字库文件。

文件划分:

BIOS初始化自检内存代码_启动项_03


制作eki文件

lmoskrlimg -m k -lhf initldrimh.bin -o Cosmos.eki -f initldrkrl.bin initldrsve.bin

在这里插入图片描述

BIOS初始化自检内存代码_操作系统_04

4、grub会尝试加载eki文件【eki文件需要满足grub多协议引导头的格式要求】
这些是在imginithead.asm中实现的,所以要包括:
A、grub文件头,包括魔数、grub1和grub2支持等
B、定位的_start符号等

5、grub校验成功后,会调用_start,然跳转到_entry
A、_entry中:关闭中断
B、加载GDT
C、然后进入_32bits_mode,清理寄存器,设置栈顶
D、调用inithead_entry【C】

6、inithead_entry.c
A、从imginithead.asm进入后,首先进入函数调用inithead_entry
B、初始化光标,清屏
C、从eki文件内部,找到initldrsve.bin文件,并分别拷贝到内存的指定物理地址
D、从eki文件内部,找到initldrkrl.bin文件,并分别拷贝到内存的指定物理地址
E、返回imginithead.asm

7、imginithead.asm中继续执行
jmp 0x200000
而这个位置,就是initldrkrl.bin在内存的位置ILDRKRL_PHYADR
所以后面要执行initldrkrl.bin的内容

8、这样就到了ldrkrl32.asm的_entry
A、将GDT加载到GDTR寄存器【内存】
B、将IDT加载到IDTR寄存器【中断】
C、跳转到_32bits_mode
初始寄存器
初始化栈
调用ldrkrl_entry【C】

9、ldrkrlentry.c
A、初始化光标,清屏
B、收集机器参数init_bstartparm【C】

10、bstartparm.c
A、初始化machbstart_t
B、各类初始化函数,填充machbstart_t的内容
C、返回

11、ldrkrlentry.c
A、返回

12、ldrkrl32.asm
A、跳转到0x2000000地址继续执行

  1. 二级引导器彻底摆脱了 GRUB 的控制之后,就开始检查 CPU,获取内存布局信息,确认是不是我们要求的 CPU 和内存大小,接着初始化内核栈、放置好内核文件和字库文件,建立 MMU 页表数据和设置好图形模式,为后面运行内核做好准备。
  2. 当二级引导器完成了上述功能后,就会显示我们操作系统的 logo,这标志着二级引导器所有的工作一切正常。
  3. 进入 Cosmos,我们的二级引导器通过跳转到 Cosmos 的入口,结束了自己光荣使命,Cosmos 的入口是一小段汇编代码,主要是开启 CPU 的长模式,最后调用了 Cosmos 的第一个 C 函数 hal_start。

BIOS初始化自检内存代码_BIOS初始化自检内存代码_05