我正在为我正在开发的操作系统设计内核(我实际上将其称为“核心”,只是为了有所不同,但它基本上是相同的)。如果我无法启动和运行多任务处理、内存管理和其他基本功能,那么操作系统本身的细节就无关紧要了,所以我需要首先解决这个问题。我有一些关于设计 malloc 例程的问题。
我认为 malloc() 要么成为内核本身的一部分(我倾向于这一点),要么成为程序的一部分,但我必须编写自己的 C 标准库实现方式,所以我开始写一个malloc。我的问题实际上在这方面相当简单,C(或C++)如何管理它的堆?
我在理论课上一直被教导的是,堆是一块不断扩展的内存,从指定的地址开始,并且在很多意义上表现得像堆栈。通过这种方式,我知道在全局作用域中声明的变量位于开头,更多的变量在各自的作用域中声明时被“推”到堆上,而超出作用域的变量则简单地留在内存空间中,但该空间被标记为空闲,因此堆可以在需要时扩展更多。
我需要知道的是,C 实际上是如何以这种方式处理动态扩展的堆的?编译后的 C 程序是否会自己调用 malloc 例程并处理自己的堆,或者我是否需要为其提供自动扩展的空间?另外,C 程序如何知道堆从哪里开始?
哦,我知道相同的概念也适用于其他语言,但我希望所有示例都采用 C/C++ 语言,因为我对这种语言最熟悉。我也不想担心其他事情,例如堆栈,因为我认为我能够自己处理这样的事情。
所以我想我真正的问题是,除了 malloc/free (它处理自身的获取和释放页面等)之外,程序还需要操作系统提供其他东西吗?
Thanks!
EDIT我对 C 如何使用与堆相关的 malloc 更感兴趣,而不是 malloc 例程本身的实际工作原理。如果有帮助的话,我在 x86 上执行此操作,但 C 是交叉编译器,所以这应该不重要。 ^_^
进一步编辑:我知道我可能会混淆术语。我被告知“堆”是程序存储全局/局部变量等内容的地方。我习惯于在汇编编程中处理“堆栈”,并且我刚刚意识到我的意思可能是这个。我的一些研究表明,“堆”更常用来指代程序为其自身分配的总内存,或者操作系统提供的内存页面总数(和顺序)。
因此,考虑到这一点,我该如何应对不断扩大的stack? (看来我的 C 理论课确实有轻微的……缺陷。)