2

我正在用 C 和汇编开发一个简单的小玩具操作系统作为实验,但我开始担心自己对系统内存缺乏了解。

我已经能够编译内核,在 Bochs(由 GRUB 加载)中运行它,并让它打印“Hello, world!” 现在我开始尝试制作一个简单的内存管理器,这样我就可以开始尝试其他东西了。

我找到了一些关于内存管理的资源,但他们并没有足够的代码可以关闭(因为我理解了这个概念,但我不知道如何实现它)。

我尝试了一些或多或少复杂的策略,然后选择了一个非常简单的策略(只需在内存中保留一个偏移量并根据分配对象的大小增加它),直到需要更改。还没有碎片控制、保护或任何东西。

所以我想知道当我确实需要一个更强大的经理时,我可以在哪里找到更多信息。而且我还想了解更多关于分页、分段和其他相关内容的信息。到目前为止,我还没有处理过分页,但我在操作系统开发站点中经常提到它,所以我猜我迟早会处理它。

我还阅读了某种形式的间接指针,其中应用程序持有一个由内存管理器重定向到其实际位置的指针。我敢肯定,这对我来说还有很长的路要走,但如果我想尝试虚拟内存或碎片整理似乎很重要。

而且,我应该把我的记忆偏移量放在哪里?我不知道最好的位置是什么,所以我只是随机选择了0x1000,而且我确信稍后当我覆盖我的内核或其他东西时它会回到我身边。

我还想知道在性能方面我应该期望什么(例如分配和释放的大 O 值)以及内存管理结构与实际托管内存的合理比率是多少。

当然,请随意回答这些问题的一部分。非常感谢任何反馈!

4

2 回答 2

3

如果您还不了解它,http://wiki.osdev.org/通常是一个很好的资源,并且有多篇关于内存管理的文章。如果您正在寻找特定的内存分配算法,我建议您阅读“伙伴系统”方法(http://en.wikipedia.org/wiki/Buddy_memory_allocation)。我想您可能可以在 Internet 上找到一个示例实现。如果您可以在图书馆中找到一份副本,那么可能还值得阅读专门用于内存管理的计算机编程艺术部分(第 1 卷,第 2.5 节)。

我不知道你应该把内存偏移量放在哪里(老实说我从来没有写过内核),但我想到的一件事可能会起作用,那就是在内核的末尾放置一个静态变量,然后开始该地址之后的分配。就像是:

(In the memory manager)
extern char endOfKernel;
... (also in the memory manager)
myOffset = &endOfKernel;
... (at the end of the file that gets placed last in the binary)
char endOfKernel;

我想这是不言而喻的,但是根据您对操作系统的认真程度,您可能会想要一些有关操作系统设计的书籍,如果您在学校,参加操作系统课程不会有什么坏处。

于 2011-03-17T00:10:59.243 回答
2

如果您将 GCC 与 LD 一起使用,您可以创建一个链接描述文件,该脚本在 .BSS 部分的末尾定义一个符号(这将为您提供内核内存占用的完整大小)。许多内核实际上使用这个值作为 GRUB 的 AOUT_KLUDGE 标头的参数。

有关更多详细信息,请参阅http://wiki.osdev.org/Bare_bones#linker.ldebss ,请注意链接器脚本中的符号声明。

于 2011-03-29T17:12:15.177 回答