简单的Bootloader加载箱

时间:2018-09-22 14:28:33

标签: assembly operating-system kernel nasm bootloader

我是OS开发人员之类的新手,但是我想问一下您是否有任何简单的引导程序或教程来如何加载bin文件(包含自定义OS)。

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

我有 kernel.bin ,其中包含:

kernel.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

3 个答案:

答案 0 :(得分:1)

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

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

b)引导加载程序将从哪种设备引导。从CD引导通常不同于从硬盘驱动器引导。从网络启动通常与CD和硬盘驱动器大不相同。

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

我知道我必须使用:

.PHONY:install
install:
    curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh | bash

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

答案 1 :(得分:0)

如何制作一个简单的引导程序来加载 bin,这意味着很多工作,但我尽量简洁。 我描述了如何为硬盘上的 100 MB 分区制作引导加载程序,并使用 FAT16 格式化。

第一步:

我在硬盘上创建了一个 100 MB 的分区,并以 FAT16 格式进行了格式化。我以可以选择从该分区启动的方式配置 GRUB。完成后,我从 100 MB 分区启动,然后在屏幕上显示消息“没有系统磁盘。按任意键重新启动...”这告诉我,我成功地创建了一个硬盘分区,我可以像软驱一样使用。 您可以在此处找到有关此第一步的所有详细信息: https://fromthegroundupmyway.blogspot.com/2020/12/initial-setup.html

第二步:

我创建了引导加载程序,它搜索分区的 ROOT 目录以寻找特定文件。就我而言,引导加载程序正在寻找“SOFTWARE.BIG”,它是一个普通的二进制文件。 “SOFTWARE.BIG”只是我决定给要由引导加载程序加载到 RAM 中的文件的名称,但是当您调整我的引导加载程序以制作您的引导加载程序时,如果您愿意,可以将其更改为 MYKERNEL.BIN。 您可以在此处找到有关第二步的所有详细信息: https://fromthegroundupmyway.blogspot.com/2020/12/the-template-for-shuttle2.html

第三步:

每个分区都是不同的,即使它们都使用 FAT16 作为文件系统。诸如每个扇区的字节数、每个文件簇的扇区数等,它们使分区彼此不同,但所有这些相关信息都保存在 BIOS 参数块中。我创建了一个程序,该程序根据同一程序从 BIOS 参数块读取的详细信息来调整我的引导加载程序。通过这种方式,您可以使引导加载程序适合您自己的 FAT16 分区。 您可以在此处找到有关第三步的所有详细信息: https://fromthegroundupmyway.blogspot.com/2020/12/the-builder-for-shuttle2.html

第四步:

在这里您可以找到我如何测试引导加载程序以确保它始终正常工作: https://fromthegroundupmyway.blogspot.com/2020/12/first-launch-of-shuttle2.html

答案 2 :(得分:-3)

获取Emu8086的副本,您将找到一些很好的示例,包括引导加载程序,迷你内核以及如何对其进行测试。 emu8086已停产,因此请尝试一些安全的站点来获取它。