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