/dev/kmsg 在内核的哪个位置被初始化?

/dev/kmsg 在内核的哪个位置被初始化?

我试图找出启动过程中的哪个点/dev/kmsg被初始化并因此可以被写入。在我的系统上,dmesg 中出现的第一行printk(KERN_INFO "Initializing cgroup subsys %s\n", ss->name);来自kernel/cgroup.c.我尝试向后追踪并搜索内核,但没有找到/dev/kmsg正在初始化的函数。

有人知道吗?

答案1

/dev/kmsgkmsg_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您可以在中打印k.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)

两个参数:将初始化字符设备和initcall级别的函数,5其中fs

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

__define_initcall扩展为初始化调用定义将在do_initcalls将从中初始化/main.c

相关内容