たぶん、Linuxカーネルモジュール(LKM)の作成を検討する必要があります。
ここにチュートリアルがあります:http ://www.tldp.org/LDP/lkmpg/2.6/html/
正確なプロファイリングシステムが必要な場合は、カーネルモジュールを何らかの中断、またはその他の有効なエントリポイント*に接続し、説明する必要のあるものを(多くの指示なしで!)保存できます。次に、中断後、定期的にそのデータを収集して分析します。
他のモジュールと同じ方法で、ファイルシステム内の特別なファイル(mknodeを介してユーザースペースに作成されるか、MKDEV / register_chrdevを使用した初期化内で作成)を介して情報をエクスポートできます。
上記のリンクにいくつかの情報があります。
*
たとえば、モジュールを読み取りシステムコールにアタッチする(実際の読み取りを自分の読み取りでラップする)か、ファイルをエクスポートしてオープン/クローズの試行をキャッチすることができます。
後者の使用例は次のようになります。
void f() {
int fd_prof;
fd_prof = open("/dev/profiler", O_RDONLY);
/* Do whichever thing you want to profile */
close(fd_prof);
/* Read profiled data from /dev/profiled_data or wherever you want
* to export it to */
LKMをコンパイルするときは、libcがカーネル空間に存在しないため、標準Cライブラリにアクセスできないことに注意してください。
心配しないでください。カーネル空間にsprintfのような関数が実装されています。もちろん、システムコール(読み取り、書き込み...)に直接アクセスできます(コンテキストスイッチなし)。