assembly - 用于加载 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,从某种磁盘启动”(可能是没有分区的软盘,但可能是具有某种分区方案的硬盘);这大约是您在编写引导加载程序之前需要了解的一半。
推荐阅读
- java - 如何在前台显示windows后台进程
- c# - Unity 3d 运动不适用于相机方向
- javascript - JS/Cypress.io:如何迭代 2 组相应的数据
- python - 生成总和为一个值的偶数整数的 Numpy 数组
- ios - 根据 int 是否 > 0 显示不同的自定义表格视图单元格
- powershell - 开关还有别的吗?
- c# - 同步同一应用程序的多个实例c#
- django - 在重新启动服务器后,在 django 应用程序中缺少动态图像
- javascript - VS Code 自动格式化更漂亮
- python - Python - 如何在 ARIMA 模型中选择某些滞后?