开头声明:这是关于极客时间上《操作系统实战45讲》的学习笔记~
作为一个跨行小白,学习几个问题:
GRUB是什么?
这里二级引导器的作用又是什么?
二级引导器作为操作系统的先驱,它需要收集机器信息,确定这个计算机能不能运行我们的操作系统,对CPU,内存,显卡进行一些初级配置,放置好内存相关的文件。
二级引导器的设计(因为本人能力有限,这里对一些函数文件只做功能上的总结和解释)
1.设计了机器信息结构,用于存放后面二级引导器收集到的机器信息。
typedef struct s_MACHBSTART
{
u64_t mb_krlinitstack;//16 内存栈地址
u64_t mb_krlitstacksz;//24 内存栈大小
u64_t mb_imgpadr;//操作系统影像
u64_t mb_imgsz;//操作系统映像大小
//...
u64_t mb_bfontpadr;//操作系统字体地址
u64_t mb_bfontsz;//操作系统字体大小
u64_t mb_fvrmphyadr;//机器显存地址
u64_t mb_fvrmsz;//机器显存大小
u64_t mb_cpumode;//机器cpu工作模式
u64_t mb_memsz;//机器内存大小
u64_t mb_e820padr;//机器e820数组地址
u64_t mb_e820nr;//机器e820数组元素个数
u64_t mb_e820sz;//机器e820数组大小
//...
u64_t mb_pml4padr;//机器页表数据大小
u64_t mb_subpageslen;//机器页表个数
u64_t mb_kpmapphymemsz;//操作系统映射空间
graph_t mb_ghparm;//图形信息
}__attribute__((packed)) machbstart_t;
2.对二级引导器代码模块进行了规划,确定各模块的主要功能。

3.实现了GRUB规定的GRUB头,以便被GRUB识别,在GRUB头初始化了CPU寄存器,并且跳转到物理内存的0x200000地址处,真正进入到二级引导器中开始运行。
我们的GRUB头有两个文件组成:
- imginithead.asm
功能:既能让GRUB识别,又能设置C语言运行环境,用于调用C函数。
主要工作:初始化CPU寄存器,加载GDT,切换到CPU的保护模式。 - inithead.c
功能:查找二级引导器核心文件,然后把它放置到特定的内存地址上。
代码实现:
void inithead_entry()
{
//初始化光标,清屏
init_curs();
close_curs();
clear_screen(VGADP_DFVL);
//从eki内部,找到initldrsve.bin文件,并且拷贝到内存的指定物理地址
write_realintsvefile();
//从eki内部,找到initldrkrl.bin文件,并且拷贝到内存的指定物理地址
write_ldrkrlfile();
return;
}
4.为了二级引导器能够调用BIOS中断服务程序,我们实现了专门用来完成调用BIOS中断服务程序的realintsve.asm模块。
5.最后,我们实现二级引导器的主函数,由它调用完成其他功能的函数。
void ldrkrl_entry()
{
init_bstartparm();//收集机器环境信息的主函数
return;
}
这篇博客是《操作系统实战45讲》的学习笔记,主要探讨GRUB的作用和二级引导器的功能。二级引导器负责收集机器信息,配置CPU、内存和显卡,以确保操作系统能正常运行。内容包括二级引导器的设计思路,如机器信息结构的定义、代码模块规划、GRUB头的实现,以及如何调用BIOS中断服务程序。
建造二级引导器&spm=1001.2101.3001.5002&articleId=119714660&d=1&t=3&u=6875a71460c747e8ae6efa4c719f9a06)
427

被折叠的 条评论
为什么被折叠?



