自制操作系统笔记(N)建造二级引导器

这篇博客是《操作系统实战45讲》的学习笔记,主要探讨GRUB的作用和二级引导器的功能。二级引导器负责收集机器信息,配置CPU、内存和显卡,以确保操作系统能正常运行。内容包括二级引导器的设计思路,如机器信息结构的定义、代码模块规划、GRUB头的实现,以及如何调用BIOS中断服务程序。

开头声明:这是关于极客时间上《操作系统实战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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值