我正在为我正在开发的OS设计内核(实际上我将其称为“核心”,但基本相同)。如果我无法启动并运行多任务,内存管理和其他基本功能,则操作系统本身的细节无关紧要,因此我需要首先进行处理。我有一些关于设计malloc例程的问题。

我认为malloc()将成为内核本身的一部分(我倾向于此)或程序的一部分,但是我将不得不编写自己的C标准库实现的方式,所以我写了一个malloc。在这方面,我的问题实际上很简单,C(或C++)如何管理其堆?

在理论课中,我一直被教导的是,堆是一块不断扩展的内存,从指定的地址开始,并且在很多方面表现得像堆栈。这样,我知道在全局范围内声明的变量才是开头,并且在它们各自的范围内声明它们时,更多的变量会被“压入”到堆中,而超出范围的变量只会保留在内存空间中,但是该空间被标记为空闲,因此堆可以根据需要扩展更多。

我需要知道的是,C实际上如何以这种方式处理动态扩展的堆?编译后的C程序是对malloc例程进行自己的调用并处理其自己的堆,还是需要为其提供自动扩展的空间?另外,C程序如何知道堆从哪里开始?

哦,我知道相同的概念也适用于其他语言,但是我希望任何示例都可以使用C/C++,因为我对这种语言最满意。我也不想担心诸如堆栈之类的其他事情,因为我认为我能够自己处理类似的事情。

因此,我想我真正的问题是,除了malloc/free(它自己处理获取和释放页面等)之外,程序还需要OS提供其他功能吗?

谢谢!

编辑我对C如何在堆中使用malloc而不是malloc例程本身的实际工作更感兴趣。如果有帮助,我可以在x86上执行此操作,但是C是交叉编译器,因此无关紧要。 ^ _ ^

进一步的编辑:我知道我可能会混淆术语。我被告知,“堆”是程序存储诸如全局/局部变量之类的东西的地方。我习惯于在汇编编程中处理“堆栈”,而我只是意识到我可能是故意的意思。我的一些研究表明,“堆”更常用于指程序为其分配的总内存,或操作系统提供的内存页面的总数(和顺序)。

因此,考虑到这一点,我该如何应对不断扩展的堆栈? (看来我的C理论课确实是轻度的……有缺陷的。)

最佳答案

malloc通常在C运行时中在用户空间中实现,它依赖于特定的OS系统调用来映射到虚拟内存的页面中。 mallocfree的工作是管理固定大小(通常为4 KB,但有时更大)的那些内存页面,并将它们切成小块,供应用程序使用。

参见例如GNU libc实现。

对于更简单的实现,请查看去年的MIT operating systems类。具体来说,请参见final lab handout,并查看lib/malloc.c。该代码使用在该类中开发的操作系统JOS。它的工作方式是读取页表(操作系统提供只读),查找未映射的虚拟地址范围。然后,它使用sys_page_allocsys_page_unmap系统调用将页面映射和取消映射到当前进程中。

关于operating-system - 除了malloc/free之外,程序还需要OS提供其他功能吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/196136/

10-16 03:41