커널 감사 시스템을 가지고 놀면서 나는 작은 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
핵심요약: free
다음은 malloc
커널을 호출하지 않습니다. 왜?
답변1
프로그램은 초기 힙으로 시작하고 1바이트 할당은 해당 힙에 맞습니다. 할당된 메모리를 즉시 해제하면 힙이 커질 필요가 없으므로 해당 시스템 호출이 표시되지 않습니다.
바라보다커널에서 프로세스 메모리 측정값이 얼마나 빠르고 자주 업데이트됩니까?유사한 실험을 수행하십시오.