繁体   English   中英

用于加载 bin 的简单引导程序

[英]Simple Bootloader to load 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

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

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

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

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

我知道我必须使用:

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

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

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

步骤1:

我在硬盘上创建了一个 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM