2011-03-16 34 views
1

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

我已经能够编译内核,在Bochs的运行(通过GRUB加载),并将它打印“你好,世界!”现在我试图做一个简单的内存管理器,以便我可以开始尝试其他的东西。

我发现了一些资源上的内存管理,但他们真的没有足够的代码熄灭的(在我的理解这个概念,但我是在为实际知道如何实现它的亏损)。

我尝试了一些或多或少复杂的策略,然后用一个荒谬简单的策略(只是在内存中保留一个偏移量并将其增加分配对象的大小)解决,直到需要更改。没有分割控制,保护或其他任何东西。

所以我想知道在哪里可以找到更多的信息,当我需要一个更强大的经理。我还想了解更多关于分页,分割和其他相关的事情。到目前为止,我还没有处理过分页,但是我已经在操作系统开发网站中看到过这种情况,所以我猜测我迟早会面对它。

我也看到了有关某种形式的间接指针,其中应用程序认为是由内存管理器重定向到它的真实位置的指针。对于我来说,这是相当方便的,但我相信,如果我想尝试虚拟内存或碎片整理,这似乎很重要。

而且,我应该把我的记忆抵消?我不知道最好的地方是什么,所以我随机选择了0x1000,我相信稍后当我覆盖我的内核或其他东西时它会回来。

我也想知道我应该期待的性能代价,什么内存管理结构的实际管理存储一个合理的比例应该是(例如,用于分配和释放一个大O值)。

当然,随便回答这些问题的一个子集。任何反馈非常感谢!

回答

2

如果你不知道它已经,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

在内核是一个选项之后放置堆,但是您还需要确定您正在创建的内核是否将以真实或保护模式运行。如果您处于Real模式,则只能访问1MB的内存,处于受保护状态时您可以访问完整的32位内存空间。 – linuxuser27 2011-03-17 00:33:28

+0

谢谢! osdev wiki实际上就是我开始的。而且看起来好友好。这听起来像个好主意,但是你会知道如何将变量放在内核的末尾吗?也许写一个C文件,并修改我的链接文件,以确保该文件被放置在最后? – rovaughn 2011-03-17 00:34:10

+0

@ linuxuser27 - 我知道*关于真实和受保护的模式,但我没有意识到会导致这种差异。这是内存限制,因为实模式不会为您做分页吗?有没有一种方法可以告诉我,比如,你会碰巧知道GRUB是否加载到真实或保护模式中? – rovaughn 2011-03-17 00:36:52

1

如果您使用的是与LD GCC,您可以创建一个链接脚本是在.BSS部分(这会给你内核的内存占用的完整大小)的端部限定的象征。实际上,许多内核都将此值用作GRUB的AOUT_KLUDGE标头的参数。

有关更多详细信息,请参阅http://wiki.osdev.org/Bare_bones#linker.ld,请注意链接描述文件中ebss符号的声明。