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

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

/dev/kmsg起動プロセスのどの時点で初期化されて書き込むことができるかを調べようとしています。私のシステムでdmesgに現れる最初の行はprintk(KERN_INFO "Initializing cgroup subsys %s\n", ss->name);から来ますkernel/cgroup.c。カーネルを追跡して検索してみましたが、初期化され/dev/kmsgている関数が見つかりませんでした。

知っている人はいますか?

ベストアンサー1

/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以下にあります。printkc。初期化方法は他の仮想デバイスと同じです/dev/zero/dev/nullchr_dev_init機能。

この関数は、Linuxカーネルの初期化プロセス中に、カーネルが起動して解凍された後に呼び出されます。このchr_dev_init機能の後に注意してください。

fs_initcall(chr_dev_init);

__define_initcallマクロに展開されるマクロ:

#define fs_initcall(fn)         __define_initcall(fn, 5)

2つのパラメータ:initcall文字デバイスとレベルを初期化する関数、5ここでfs

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

これは__define_initcall次のように拡張されます。初期化呼び出し定義はdo_initcalls次のとおりです。初期化/main.c

おすすめ記事