/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/null
chr_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