我正在开发一个简单的小玩具操作系统,用C语言和汇编作为实验,但我开始担心自己缺乏对系统内存的了解。
我已经能够编译内核,在Bochs中运行它(由GRUB加载),并打印出“Hello,world!”现在我试图建立一个简单的内存管理器,这样我就可以开始尝试其他事情。
我找到了一些关于内存管理的资源,但是它们没有足够的代码可以用掉(就像我理解这个概念一样,但实际上我知道如何实现它却感到茫然)。
我尝试了一些或多或少复杂的策略,然后用一个非常简单的策略(只是在内存中保留一个偏移并增加它所分配的对象的大小),直到需要改变。没有碎片控制,保护或其他任何东西。
所以当我需要一个更强大的经理时,我想知道在哪里可以找到更多信息。我还想了解有关分页,分段和其他相关内容的更多信息。到目前为止我还没有处理过分页,但我已经看到它在OS开发网站中经常提到,所以我猜我迟早要处理它。
我还读过某种形式的间接指针,其中一个应用程序保存一个指针,该指针由内存管理器重定向到其真实位置。对我而言,这是一个很好的方法,我敢肯定,但如果我想尝试虚拟内存或碎片整理,这似乎很重要。
而且,我应该把我的记忆偏移在哪里?我不知道最佳位置是什么,所以我只是随机选择了0x1000
,我确信它会在我覆盖内核或其他东西后再回到我身边。
我也想知道我应该在性能方面做些什么(例如,分配和发布的大O值)以及内存管理结构与实际管理内存的合理比例。
当然,请随意回答这些问题的一部分。非常感谢任何反馈!
答案 0 :(得分:3)
如果您还不知道,http://wiki.osdev.org/一般来说是一个很好的资源,并且有很多关于内存管理的文章。如果您正在寻找特定的内存分配算法,我建议您阅读“伙伴系统”方法(http://en.wikipedia.org/wiki/Buddy_memory_allocation)。我想你可能会在互联网上找到一个示例实现。如果您可以在库中找到副本,那么也可能值得阅读专门用于内存管理的计算机编程艺术部分(第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;
我想这是不用说的,但是根据你对操作系统的认真程度,你可能会想要一些关于操作系统设计的书籍,如果你在学校,那么采取操作系统也不会有什么坏处类。
答案 1 :(得分:2)
如果您正在将GCC与LD一起使用,则可以创建一个链接描述文件,该脚本在.BSS部分的末尾定义符号(这将为您提供内核内存占用的完整大小)。事实上,许多内核使用此值作为GRUB的AOUT_KLUDGE标头的参数。
有关详细信息,请参阅http://wiki.osdev.org/Bare_bones#linker.ld,请注意链接描述文件中ebss
符号的声明。