首页 > 解决方案 > 用于加载 bin 的简单引导加载程序

问题描述

我是 OS dev 之类的新手,但我想问你是否有任何简单的引导加载程序或教程如何加载 bin 文件(包含自定义操作系统)。

我阅读了很多关于引导加载程序的教程,但大多数都以Hello World结尾并且没有说明如何加载一些 bin 文件。

我有kernel.bin其中包含:

内核.asm

bits    32
section         .text
        align   4
        dd      0x1BADB002
        dd      0x00
        dd      - (0x1BADB002+0x00)

global start
extern kernel
start:
        cli
        call kernel
        hlt

kernel.c

kernel()
{
        char* VideoMemory = (char*)0xb8000;
        VideoMemory[0] = 'M';
        VideoMemory[2] = 'y';
        VideoMemory[4] = ' ';
        VideoMemory[6] = 'O';
        VideoMemory[8] = 'S';
}

它使用 grub 作为引导加载程序,并且kernel.bin保存在/boot/目录中,但我想创建自定义引导加载程序来加载该kernel.bin

我知道如果我创建自定义引导加载程序,我只能使用前 510 个字节,因为第 511 个和第 512 个字节包含用于引导的幻数。

我知道我必须使用:

times 510 - ($ - $$) db 0
db 55h
db 0AAh

但我不知道如何告诉引导加载程序加载kernel.bin

标签: assemblyoperating-systemkernelnasmbootloader

解决方案


在编写引导加载程序之前,您需要了解 3 件事:

a) 引导加载程序将在哪个环境中执行(BIOS、UEFI 等?)

b) 引导加载程序将从何种设备引导。从 CD 引导通常与从硬盘驱动器引导非常不同;从网络启动通常与 CD 和硬盘驱动器有很大不同。

c) 引导加载程序应该加载的“东西”(内核、初始 RAM 磁盘或...)在哪里。假设您从硬盘驱动器启动;这可能涉及处理分区(“MBR 分区”,UEFI/GPT)和理解某种文件系统(FAT?Ext2?为操作系统设计的东西?)。

我知道我必须使用:

times 510 - ($ - $$) db 0
db 55h
db 0AAh

这意味着“BIOS,从某种磁盘启动”(可能是没有分区的软盘,但可能是具有某种分区方案的硬盘);这大约是您在编写引导加载程序之前需要了解的一半。


推荐阅读