我正在用 C 和汇编语言开发一个简单的小玩具操作系统作为实验,但我开始担心自己缺乏对系统内存的了解。
我已经能够编译内核,在 Bochs 中运行它(由 GRUB 加载),并让它打印“Hello, world!”现在我开始尝试制作一个简单的内存管理器,以便我可以开始尝试其他东西。
我找到了一些有关内存管理的资源,但他们实际上没有足够的代码可供使用(因为我理解了这个概念,但我不知道如何实现它)。
我尝试了一些或多或少复杂的策略,然后采用了一种极其简单的策略(只需在内存中保留一个偏移量并按分配对象的大小增加它),直到需要更改为止。还没有碎片控制、保护或任何东西。
所以我想知道当我确实需要一个更强大的经理时我可以在哪里找到更多信息。我还想了解更多有关分页、分段和其他相关内容的知识。到目前为止,我还没有处理过分页,但我在操作系统开发网站上经常看到它,所以我猜我迟早要处理它。
我还了解了某种形式的间接指针,其中应用程序保存一个由内存管理器重定向到其实际位置的指针。我确信这对我来说还有很长的路要走,但如果我想尝试虚拟内存或碎片整理,这似乎很重要。
而且,我应该将内存偏移量放在哪里?我不知道最好的位置是什么,所以我只是随机选择了0x1000
,并且我确信当我覆盖我的内核或其他东西时它会回到我身边。
我还想知道在性能方面我应该期望什么(例如分配和释放的大O值)以及内存管理结构与实际托管内存的合理比率是多少。
当然,您可以随意回答其中的一部分问题。非常感谢任何反馈!
最佳答案
如果您还不知道,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;
我想这是不言而喻的,但是根据您对操作系统的认真程度,您可能需要一些有关操作系统设计的书籍,如果您在学校,学习操作系统也没什么坏处类。
关于memory-management - 简单的玩具操作系统内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5333029/