カーネル監査システムで遊んで、私は小さな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バイト割り当てはそのヒープに合います。割り当てられたメモリをすぐに解放すると、ヒープが大きくなる必要がないため、そのシステムコールは表示されません。
バラよりカーネル内のプロセスメモリの測定値はどのくらい速く、頻繁に更新されますか?同様の実験を行います。