Linux

核心 /dev/kmsg 在哪裡被初始化?

  • July 4, 2015

我試圖弄清楚啟動過程中的哪個點/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.ckmsg_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級別的函式,其中5fs

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

__define_initcall宏擴展為initcall定義,該定義將在do_initcallsinit /main.c中呼叫

引用自:https://unix.stackexchange.com/questions/213881