当我玩了一下内核审计系统时,我编写了一个小 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
开始显示来电。
是什么导致了这种行为? glibc 是否对malloc
和函数进行某种优化free
以防止无用的系统调用?
TL;DR:free
后面跟着的malloc
不会调用内核。为什么?
答案1
您的程序从初始堆开始,并且您的一个字节分配适合该堆。当您立即释放分配的内存时,堆永远不需要增长,因此您永远不会看到相应的系统调用。
看内核中进程内存测量更新的速度/频率如何?进行类似的实验。