繁体   English   中英

分配 Memory 引导加载程序/程序集

[英]Allocate Memory Bootloader/Assembly

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

我尝试写一个function 像malloc,应该不会那么多,只是提供一个免费的存储地址。 我认为最简单的方法是只拥有一个指向空闲地址的指针,并增加 function 的调用指针。我唯一的问题是将数据放在哪里。 我认为最好使用最高可用地址并递减指针(这样只有在 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 的 memory 管理器来分配/释放 memory。

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

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

暂无
暂无

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

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