据我所知,C具有以下功能,例如:malloc
、calloc
、realloc
,用于分配内存。linux内核还具有以下功能:malloc
、mmap
、kmalloc
、vmalloc
。。。以分配内存。
我想知道哪个函数是最低的。如果你说;Linux内核是最低的函数,您的C程序必须用Linux内核分配内存";,那么Linux内核是如何分配自己的内存的呢?
或者如果你说;Linux内核是最低的功能&";,然后当我写一个C程序并在Linux系统中运行时,为了分配内存,我应该通过系统调用。
希望得到答案。
我想知道哪个函数是最低的。
用户级malloc
函数调用brk
或mmap
(取决于使用的库和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函数malloc
、calloc
、realloc
在C库中实现,并使用mmap
系统调用处理映射在进程地址空间中的内存页。CCD_ 23将虚拟存储器的页面与进程地址空间中的地址相关联。当进程访问这些地址时,内核将实际RAM映射到这个虚拟空间。并不是每个对malloc
的调用都映射内存页,只有那些系统已经请求了足够空间的内存页。
在内核空间中,会发生类似的过程,但调用者可以要求立即映射RAM。