ブートプロセスのどの時点で_/dev/kmsg
_が初期化され、書き込み可能になるかを把握しようとしています。私のシステムでは、dmesgで発生する最初の行は_kernel/cgroup.c
_のprintk(KERN_INFO "Initializing cgroup subsys %s\n", ss->name);
です。逆方向にトレースしてカーネルを検索しようとしましたが、_/dev/kmsg
_が初期化されている関数が見つかりませんでした。
誰か知っていますか?
/dev/kmsg
は、ファイルを使用した標準操作を表すkmsg_fops
タイプのfile_operations
構造体によって再プリセットされます。
const struct file_operations kmsg_fops = {
.open = devkmsg_open,
.read = devkmsg_read,
.write_iter = devkmsg_write,
.llseek = devkmsg_llseek,
.poll = devkmsg_poll,
.release = devkmsg_release,
};
kmsg_fops
および関連する操作の定義は、 printk.c にあります。 /dev/zero
、/dev/null
としての他の仮想デバイスの初期化と初期化は、 chr_dev_init 関数にあります。
この関数は、カーネルが起動して解凍された後、Linuxカーネルの初期化プロセス中に呼び出されました。 chr_dev_init
関数の後、次のことに注意してください。
fs_initcall(chr_dev_init);
__define_initcall
マクロに展開されるマクロ:
#define fs_initcall(fn) __define_initcall(fn, 5)
2つのパラメーター:charデバイスとinitcall
レベルを初期化する関数。ここで、5
はfs
です。
static char *initcall_level_names[] __initdata = {
"early",
"core",
"postcore",
"Arch",
"subsys",
"fs",
"device",
"late",
};
__define_initcall
マクロは initcall 定義に展開され、 init/main.c からdo_initcalls
で呼び出されます。