当我在玩内核审计系统时,我做了一个小 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
不调用内核。为什么?