我试图找出启动过程中的哪个点/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
您可以在中打印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