Linux
核心 /dev/kmsg 在哪裡被初始化?
我試圖弄清楚啟動過程中的哪個點
/dev/kmsg
被初始化並因此可以被寫入。在我的系統上,dmesg 中出現的第一行printk(KERN_INFO "Initializing cgroup subsys %s\n", ss->name);
來自kernel/cgroup.c
. 我試圖向後追溯並蒐索核心,但我沒有找到/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, };
您可以在printk.c
kmsg_fops
中找到 the和相關操作的定義。它的初始化和其他虛擬設備的初始化一樣,都在chr_dev_init函式中。/dev/zero``/dev/null
該函式在 Linux 核心初始化過程中呼叫,在核心啟動並解壓後呼叫。請注意,在
chr_dev_init
函式之後,:fs_initcall(chr_dev_init);
擴展為宏的
__define_initcall
宏:#define fs_initcall(fn) __define_initcall(fn, 5)
兩個參數:初始化字元設備和
initcall
級別的函式,其中5
是fs
:static char *initcall_level_names[] __initdata = { "early", "core", "postcore", "arch", "subsys", "fs", "device", "late", };
__define_initcall
宏擴展為initcall定義,該定義將在do_initcalls
init /main.c中呼叫