カーネルモジュールからカーネルリングバッファーを単純に読み取ろうとしています。/proc/kmsg および dmesg 出力とも呼ばれます。
周りを見回すと、これの呼び出しは sys_syslog(); のようです。私が読んだことから、dmesgはprintk.cにあるdo_syslog()を使用するsyslog()を使用します。
grep を実行すると、do_syslog() が linux/syslog.h で定義されていることがわかったので、このファイルを含めます。
テスト モジュールでの do_syslog() の実際の呼び出しは次のようになります。
read_bytes = do_syslog(2, temp_buffer, 1024, 0);
temp_buffer は、テスト用の単なる char temp_buffer[1024] です。
プログラムはコンパイルされますが、モジュールをロードしようとすると失敗します:
insmod: 'testing.ko' の挿入エラー: -1 モジュール内の不明なシンボル
dmesg から、「不明なシンボル do_syslog (err 0)」が表示されます。
なぜこれは未知のシンボルなのですか? 何かに対してリンクする必要がありますか?
メイクファイルは次のとおりです。
obj-m += testing.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules