내장 커널 모듈이 어떻게 작동하는지 혼란스럽습니다. 제가 이해한 바에 따르면, Linux 커널을 컴파일할 때 kconfig 옵션을 MODULE_NAME=y
. 그러면 예를 들어 로드할 필요가 없습니다 modprobe
. 내장 커널 모듈을 사용할 수 있습니다 cat /lib/modules/$(uname -r)/modules.builtin
.
이 명령을 실행하면 목록에 .ko
파일이 표시됩니다. 그러나 커널에 내장되어 있다면 이것이 왜 표시됩니까? 예를 들어:
~$ cat /lib/modules/$(uname -r)/modules.builtin | grep -i bsg #just picking something random
kernel/block/bsg.ko
~$ cat /boot/config-6.5.0-14-generic | grep -i bsg
CONFIG_BLK_DEV_BSG_COMMON=y #implying this is a builtin module
CONFIG_BLK_DEV_BSGLIB=y
CONFIG_BLK_DEV_BSG=y
CONFIG_SCSI_UFS_BSG=y
~$ modinfo bsg
name: bsg
filename: (builtin)
license: GPL
file: block/bsg #why "file"? Isn't it compiled inside the kernel?
...
~$ cat /lib/modules/6.5.0-14-generic/kernel/block/bsg.ko
cat: /lib/modules/6.5.0-14-generic/kernel/block/bsg.ko: No such file or directory
그래서 내 질문은 다음과 같습니다
- 내장 커널 모듈은 정확히 어떻게 되며 시스템 내 어디에 위치합니까?
- vmlinuz 내에 위치하며 어떻게든 추출됩니까?
- 파일 로 표시되지만
.ko
예상한 디렉터리에 존재하지 않는 이유는 무엇입니까?
실제로 vmlinu(x/z)에 내장되어 있다는 점을 고려하면 어떻게 "등록"되어 를 사용하여 찾을 수 있습니까 modinfo
? 커널 바이너리에 있다면 modinfo가 보여주는 것처럼 파일(블록/bsg)이 여전히 있는 이유는 무엇입니까?
답변1
내장 커널 "모듈"(실제 모듈이 아님)은 vmlinux
압축되기 전 기본 커널 바이너리의 일부입니다. 이들은 별도의 엔터티로 추출되지 않지만 나머지 커널과 함께 로드됩니다.
다른 도구와 함께 더 쉽게 사용할 수 있도록 .ko
파일로 제공됩니다 .modules.builtin
예를 들어모듈 종속성 분석에 사용됩니다. 파일 로 나열하면 .ko
모듈처럼 취급될 수 있습니다.
커널 구성요소가 내장되어 있지만 소스 파일에 모듈 선언이 포함되어 있는 경우 제공된 정보는 modules.builtin
및 에 저장됩니다 modules.builtin.modinfo
(참조:Kbuild 문서). 내장 모듈에 대한 로드 요청을 처리하고 modules.builtin
이에 대한 정보를 제공 할 수 있습니다 . 내장된 구성요소가 없습니다.modprobe
modules.builtin.modinfo
modinfo
파일 이름(로드 가능한 모듈의 경우 이는 디스크의 실제 콘텐츠를 가리킴 .ko
) 그러나 파일이 있습니다. 이는 모듈 이름을 저장하는 내장 모듈별 항목입니다.원천모듈 선언이 포함된 파일(block/bsg.c
귀하의 예에서는).