커널의 어디에서 /dev/kmsg가 초기화됩니까?

커널의 어디에서 /dev/kmsg가 초기화됩니까?

/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다음에서 찾을 수 있습니다.printkc. 초기화 방법은 다른 가상 장치와 동일 합니다 /dev/zero./dev/nullchr_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

관련 정보