web-dev-qa-db-ja.com

カーネルのどこで/ dev / kmsgが初期化されますか?

ブートプロセスのどの時点で_/dev/kmsg_が初期化され、書き込み可能になるかを把握しようとしています。私のシステムでは、dmesgで発生する最初の行は_kernel/cgroup.c_のprintk(KERN_INFO "Initializing cgroup subsys %s\n", ss->name);です。逆方向にトレースしてカーネルを検索しようとしましたが、_/dev/kmsg_が初期化されている関数が見つかりませんでした。

誰か知っていますか?

3
JohnnyFromBF

/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レベルを初期化する関数。ここで、5fsです。

static char *initcall_level_names[] __initdata = {
    "early",
    "core",
    "postcore",
    "Arch",
    "subsys",
    "fs",
    "device",
    "late",
};

__define_initcallマクロは initcall 定義に展開され、 init/main.c からdo_initcallsで呼び出されます。

3
0xAX