Operating system 除了malloc/free,程序还需要操作系统提供其他功能吗?

Operating system 除了malloc/free,程序还需要操作系统提供其他功能吗?,operating-system,kernel,malloc,heap,osdev,Operating System,Kernel,Malloc,Heap,Osdev,我正在为我正在开发的操作系统设计内核(实际上我将称之为“内核”,只是为了与众不同,但基本上是一样的)。如果我无法启动和运行多任务、内存管理和其他基本功能,那么操作系统本身的细节就无关紧要了,所以我需要先解决这个问题。我有一些关于设计malloc例程的问题 我认为malloc()要么是内核本身的一部分(我倾向于此),要么是程序的一部分,但无论如何我都要编写自己的C标准库实现,所以我要编写一个malloc。在这方面,我的问题实际上相当简单,C(或C++)如何管理其堆 我在theorey课程中一直学到

我正在为我正在开发的操作系统设计内核(实际上我将称之为“内核”,只是为了与众不同,但基本上是一样的)。如果我无法启动和运行多任务、内存管理和其他基本功能,那么操作系统本身的细节就无关紧要了,所以我需要先解决这个问题。我有一些关于设计malloc例程的问题

我认为malloc()要么是内核本身的一部分(我倾向于此),要么是程序的一部分,但无论如何我都要编写自己的C标准库实现,所以我要编写一个malloc。在这方面,我的问题实际上相当简单,C(或C++)如何管理其堆

我在theorey课程中一直学到的是,堆是一个不断扩展的内存块,从指定的地址开始,在很多意义上表现为堆栈。通过这种方式,我知道在全局范围内声明的变量是在开始时,当它们在各自的范围内声明时,更多的变量被“推”到堆上,超出范围的变量被简单地留在内存空间中,但该空间被标记为空闲,因此如果需要,堆可以扩展得更多

我需要知道的是,C究竟是如何以这种方式处理动态扩展的堆的?编译后的C程序是自己调用malloc例程并处理自己的堆,还是需要为它提供自动扩展的空间?另外,C程序如何知道堆从何处开始

哦,我知道同样的概念也适用于其他语言,但我希望所有的例子都是C/C++的,因为我最熟悉这种语言。我也不想担心其他事情,比如堆栈,因为我认为我自己能够处理类似的事情

所以我想我真正的问题是,除了malloc/free(它自己处理获取和释放页面等)之外,程序还需要操作系统提供其他东西吗

谢谢

编辑我更感兴趣的是C如何在堆中使用malloc,而不是malloc例程本身的实际工作。如果有帮助的话,我会在x86上这样做,但C是交叉编译器,所以这不重要^_^

进一步编辑:我知道我可能会对术语感到困惑。我被告知“堆”是程序存储全局/局部变量之类的东西的地方。我习惯于在汇编编程中处理“堆栈”,我刚刚意识到我可能是指堆栈。我的一点研究表明,“heap”更常用于指程序为自己分配的总内存,或者指操作系统提供的总内存页数(和顺序)


因此,考虑到这一点,我如何处理不断扩展的堆栈?(我的C理论类似乎有点……缺陷。)

一般来说,C库处理
malloc
的实现,根据需要从操作系统请求内存(通过匿名
mmap
或在旧系统中,
sbrk
)。因此,您的内核应该通过类似于这些方法之一的方式来处理分配整个页面的问题


然后由
malloc
以一种不会过多分割空闲内存的方式分配内存。不过,我对这件事的细节不太熟悉;然而,竞技场一词浮现在脑海中。如果我能找到一个参考资料,我会更新这篇文章。

解决这个问题有多种方法

大多数C程序都有自己的malloc/free功能。那一个对小物体有效。最初(以及一旦内存耗尽),内存管理器将要求操作系统提供更多内存。实现这一点的传统方法是unix变体(Win32上的GlobalAlloc/LocalAlloc)上的mmap和sbrk


我建议您从内存提供商(如操作系统)的角度来看看(google:dlmalloc)。该分配器是一个非常好的分配器中的顶级分配器,并且对所有主要操作系统都有挂钩。如果您想知道高性能分配器对操作系统的期望,这是代码,这是您的第一选择。

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

例如,请参见实现


要获得更简单的实现,请查看去年的类。具体来说,请参阅,并查看
lib/malloc.c
。此代码使用类中开发的操作系统JOS。它的工作方式是读取页面表(由操作系统只读提供),查找未映射的虚拟地址范围。然后,它使用
sys\u page\u alloc
sys\u page\u unmap
系统调用将页面映射和取消映射到当前进程中。

是否混淆了堆和堆栈

我这样问是因为您提到了“一块不断扩展的内存”、作用域以及在声明时将变量推送到堆上。听起来你真的在谈论堆栈

在最常见的C实现中,自动变量的声明如下

int i

通常会导致在堆栈上分配i。一般来说,除非您显式地调用malloc,或者您进行的某个库调用调用了malloc,否则malloc不会参与其中


我建议阅读Peter Van Der Linden的“C编程专家”,了解C程序通常如何处理堆栈和堆的背景知识。

必读:Knuth-计算机编程艺术,第1卷,第2章,第2.5节。否则,您可以阅读Kernighan&Ritchie的《C编程》