我目前正在尝试编写一个基本的引导加载程序。引导扇区是使用汇编编写的,然后它加载和调用放置在其他扇区中的一些C代码。我还写了一个简单的put函数。现在,作为下一步,我尝试实现一些基本的内存管理。
我使用以下命令来编译/运行引导加载程序:
nasm -f elf32 boot.asm -o boot.o
gcc -fno-PIC -ffreestanding -m16 -c main.c -o main.o
ld -melf_i386 --build-id=none -T link.ld main.o boot.o -o kernel.elf
objcopy -O binary kernel.elf kernel.bin
qemu-system-i386 -fda kernel.bin
我没有找到任何东西,我找到的所有汇编指南都使用底层操作系统(malloc/brk/…)
对于UEFI,您可以使用UEFI的内存管理器来分配/释放内存。
BIOS的;首先假设从0x0001000到0x0007FFFF有可用内存(如果不关心页面对齐,则更低),除了引导加载程序已经使用的区域。然后,您通过获取内存映射来询问BIOS哪些区域实际上是RAM(例如,从"int 0x15, eax= 0xe820")。请注意,这个内存映射是可变大小的(例如,可以是10个条目,每个条目20字节或200字节,也可以是300个条目,每个条目24字节或7200字节,或者…)。
一般;在非常早期的引导过程中所需的内存将被静态分配(例如,像%define STACK_ADDRESS 0x7C00
),内存映射将被获取并存储在静态分配的内存中(例如,可能在引导加载程序的"。bss"结束时)。部分);然后,您将使用您之前获得的内存映射初始化内存管理器。