C语言 分配内存引导程序/程序集



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

我试着写一个像malloc这样的函数,它不应该做那么多,只是提供一个免费的存储地址。我认为最简单的方法是有一个指向空闲地址的指针,并在函数调用时增加指针。我唯一的问题是把数据放在哪里。我认为最好使用最高可用地址并递减指针(以便仅在RAM满时才发生与堆栈的碰撞)。但是我怎么才能得到那个地址呢?
我使用以下命令来编译/运行引导加载程序:
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"结束时)。部分);然后,您将使用您之前获得的内存映射初始化内存管理器。

最新更新