关于内存分配,C malloc/caloc依赖于Linux mmap/malloc还是相反



据我所知,C具有以下功能,例如:malloccallocrealloc,用于分配内存。linux内核还具有以下功能:mallocmmapkmallocvmalloc。。。以分配内存。

我想知道哪个函数是最低的。如果你说;Linux内核是最低的函数,您的C程序必须用Linux内核分配内存";,那么Linux内核是如何分配自己的内存的呢?

或者如果你说;Linux内核是最低的功能&";,然后当我写一个C程序并在Linux系统中运行时,为了分配内存,我应该通过系统调用。

希望得到答案。

我想知道哪个函数是最低的。

用户级malloc函数调用brkmmap(取决于使用的库和Linux版本(。

。。。Linux内核如何分配自己的内存?

在没有MMU的系统上,这很容易:

假设我们有一个8MB RAM的系统,我们知道RAM的地址是0x20000000到0x20800000。

内核包含一个数组,该数组包含有关哪些页面正在使用的信息。比方说;页面";为0x1000(这是带有MMU的x86系统中的页面大小(。

在旧的Linux版本中,该阵列被命名为mem_map。阵列中的每个元件对应于一个存储器"1";页面";。如果页面空闲,则为零。

当系统启动时,内核本身初始化这个数组(在数组中写入初始值(。

如果内核需要一页内存,它会在数组中搜索值为0的元素。假设mem_map[0x123]为0。内核现在设置mem_map[0x123]=1;mem_map[0x123]对应于地址0x20123000;分配的";地址CCD_ 16处的一些存储器。

如果内核想要";免费的";地址为0x20234000的一些存储器,它只是设置mem_map[0x234]=0;

在带有MMU的系统上,它有点复杂,但原理是相同的。

在linux操作系统上,用户模式程序使用的C函数malloccallocrealloc在C库中实现,并使用mmap系统调用处理映射在进程地址空间中的内存页。CCD_ 23将虚拟存储器的页面与进程地址空间中的地址相关联。当进程访问这些地址时,内核将实际RAM映射到这个虚拟空间。并不是每个对malloc的调用都映射内存页,只有那些系统已经请求了足够空间的内存页。

在内核空间中,会发生类似的过程,但调用者可以要求立即映射RAM。

最新更新