首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于内存分配,C malloc/calloc依赖于Linux /malloc还是相反?

关于内存分配,C malloc/calloc依赖于Linux /malloc还是相反?
EN

Stack Overflow用户
提问于 2022-03-19 14:05:02
回答 2查看 225关注 0票数 -1

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

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

或者说,"Linux内核是最低的函数“,那么当我编写一个C程序并在Linux系统中运行时,为了分配内存,我应该通过系统调用。

希望能得到答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-19 18:03:18

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

用户级别的malloc函数调用brkmalloc (取决于所使用的库和Linux版本)。

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

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

假设我们有8MB内存的系统,并且我们知道RAM的地址是0x20000000到0x20800000。

内核包含一个数组,该数组包含有关正在使用的页面的信息。假设一个“页面”的大小是0x1000 (这是使用MMU的x86系统中的页面大小)。

在旧的Linux版本中,数组名为mem_map。数组中的每个元素对应于一个内存“页面”。如果页面是空闲的,则为零。

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

如果内核需要一页内存,它会在数组中搜索值为0的元素。假设mem_map[0x123]是0。内核现在设置mem_map[0x123]=1;mem_map[0x123]对应于地址0x20123000,因此内核在address 0x20123000上“分配”了一些内存。

如果内核想在address 0x20234000上“释放”一些内存,它只需设置mem_map[0x234]=0;

在使用MMU的系统上,它是比较复杂的,但原理是相同的。

票数 0
EN

Stack Overflow用户

发布于 2022-03-19 16:26:15

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71538800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档