当我在玩内核审计系统时,我做了一个小 C 程序:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv){
void *t;
while(1){
t = malloc(1);
free(t);
}
return 0;
}
并应用以下过滤器进行审核:
-a always,exit -F arch=b32 -S open,openat -F exit=-EACCES -F key=access
-a always,exit -F arch=b64 -S open,openat -F exit=-EACCES -F key=access
-a always,exit -F arch=b32 -S brk
-a always,exit -F arch=b64 -S brk
编译并运行后,我注意到sys_brk
审计日志中没有出现。此外,它也没有出现在 中strace
,甚至malloc
被调用(用 ltrace 检查)。最后,我删除了免费和呼叫sys_brk
开始出现。
是什么导致了这种行为?malloc
glibc 是否对函数进行了某种优化free
以防止无用的系统调用?
TL;DR:free
后面跟malloc
不调用内核。为什么?
您的程序从一个初始堆开始,您的一个字节分配适合该堆。当您立即释放分配的内存时,堆永远不需要增长,因此您永远不会看到相应的系统调用。
请参阅内核中进程内存测量的更新速度/频率如何?进行类似的实验。