分配内存 Bootloader/Assembly

Allocate Memory Bootloader/Assembly

我目前正在尝试编写一个基本的引导加载程序。引导扇区是使用汇编编写的,然后它会加载并调用其他扇区中的一些 C 代码。我还编写了一个简单的 puts 函数。 现在作为下一步,我尝试实现一些基本的内存管理。

我试着写一个像malloc这样的函数,应该不会做那么多,只是提供一个空闲的存储地址。我认为最简单的方法是只拥有一个指向空闲地址的指针,并在函数调用时增加指针。我唯一的问题是在哪里放置数据。我认为最好使用最高可用地址并递减指针(这样只有在 RAM 已满时才会发生与堆栈的冲突)。但是我如何获得该地址?
我正在使用以下命令 compile/run 引导加载程序:

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

我什么都没找到,我找到的所有汇编指南都使用了底层 OS (malloc/brk/...)

对于 UEFI,您可以只使用 UEFI 的内存管理器 allocate/free 内存。

对于BIOS;您首先假设从 0x0001000(如果您不关心页面对齐,则稍微低一点)到 0x0007FFFF 之间有可用内存,除了您的引导加载程序已经使用的区域。然后您通过获取内存映射(例如,来自“int 0x15,eax=0xE820”)询问 BIOS 哪些区域实际上是 RAM。请注意,此内存映射的大小可变(例如,可以是 10 个条目,每个条目 20 字节或 200 字节,或者可以是 300 个条目,每个条目 24 字节或 7200 字节,或...)。

一般;启动初期所需的内存将被静态分配(例如 %define STACK_ADDRESS 0x7C00),内存映射将被获取并存储在静态分配的内存中(例如可能在引导加载程序的“.bss”部分的末尾);然后您将使用您之前获得的内存映射初始化内存管理器。