O /dev/kmsg representado pela estrutura kmsg_fops que possui file_operations type que representa operações padrão com um arquivo:
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,
};
Você pode encontrar a definição de kmsg_fops e operações relacionadas no printk.c . Sua inicialização e inicialização de outros dispositivos virtuais como /dev/zero , /dev/null está no chr_dev_init função.
Esta função é chamada durante o processo de inicialização do kernel do Linux, após o kernel ser inicializado e descompactado. Note que após a função chr_dev_init , o:
fs_initcall(chr_dev_init);
macro que se expande para a macro __define_initcall :
#define fs_initcall(fn) __define_initcall(fn, 5)
dois parâmetros: function que inicializará o dispositivo de caracteres e initcall level, em que 5 é fs :
static char *initcall_level_names[] __initdata = {
"early",
"core",
"postcore",
"arch",
"subsys",
"fs",
"device",
"late",
};
A macro __define_initcall expande para a definição initcall que será chamado no do_initcalls do init / main.c