강좌 & 팁
글 수 2,412
2011.05.23 05:51:29 (*.138.143.120)
40447
커널 모듈 컴파일
이 글은 커널 모듈을 컴파일을 하는데 있어서 설치 옵션에 대해서 알아봅니다.
커널을 컴파일 하다보면 원하는 작업을 모두 끝낸이후에 실제 타겟 시스템에
적용하기 위하여 설치를 하게 됩니다.
보통 우리가 알고 있는
make zImage
make modules
make modules_install
을 실행하게 되면 arm 시스템이라면 커널은 arch/arm/boot/zImage 에 위치하게 됩니다.
물론 이전에 말씀드렸다시피 빌드옵션인 O 옵션을 지정하면 커널 빌드시 컨널을 오염시키지 않고
커널을 빌드할수 있습니다.
모듈은 어떻게 될까요?
모듈역시 빌드를 하면 현재 디렉토리 위치나 O 옵션을 사용했을 경우 해당 위치에 컴파일된
바이너리가 위치하게 됩니다.
그럼 모듈을 설치할때는 어떻게 될까요?
한번 살펴보겠습니다.
제 머신의 /lib/modules 디렉토리의 내용들입니다.
root@boggle70-desktop:linux-2.6.29# ls -la /lib/modules/
합계 36
drwxr-xr-x 7 root root 4096 2011-05-23 05:52 .
drwxr-xr-x 18 root root 12288 2011-03-15 16:24 ..
drwxr-xr-x 3 root root 4096 2011-02-09 15:16 2.6.21-falinux
drwxr-xr-x 3 root root 4096 2010-12-02 15:38 2.6.24
drwxr-xr-x 5 root root 4096 2010-07-06 17:07 2.6.31-14-generic
drwxr-xr-x 7 root root 4096 2011-03-16 16:05 2.6.31-22-generic
root@boggle70-desktop:linux-2.6.29#
커널의 Makeifle 을 살펴보면 아래와 같은 내용이 있습니다.
614 #
615 # INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
616 # relocations required by build roots. This is not defined in the
617 # makefile but the argument can be passed to make if needed.
618 #
619
620 MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
621 export MODLIB
MODLIB 라는 것은 뭐 당연히 module 빌드시에 사용하게 되는 것인데
INSTALL_MOD_PATH 가 없으면 컴파일한 머신의 /lib/modules/(빌드커널버전) 에 설치됩니다.
한번 보실까요?
root@boggle70-desktop:linux-2.6.29# make O=../build/ modules_install
INSTALL drivers/net/dm9000.ko
INSTALL drivers/scsi/scsi_wait_scan.ko
DEPMOD 2.6.29-falinux
root@boggle70-desktop:linux-2.6.29#
root@boggle70-desktop:linux-2.6.29# ls -la /lib/modules/
합계 40
drwxr-xr-x 8 root root 4096 2011-05-23 06:05 .
drwxr-xr-x 18 root root 12288 2011-03-15 16:24 ..
drwxr-xr-x 3 root root 4096 2011-05-19 01:25 2.6.18_pro500-ixdp42x-arm_xscale_be
drwxr-xr-x 3 root root 4096 2011-02-09 15:16 2.6.21-falinux
drwxr-xr-x 3 root root 4096 2010-12-02 15:38 2.6.24
drwxr-xr-x 3 root root 4096 2011-05-23 06:05 2.6.29-falinux
drwxr-xr-x 5 root root 4096 2010-07-06 17:07 2.6.31-14-generic
drwxr-xr-x 7 root root 4096 2011-03-16 16:05 2.6.31-22-generic
root@boggle70-desktop:linux-2.6.29#
네... 디렉토리가 하나 늘었습니다.
바로 2.6.29-falinux 입니다. 아무런 옵션이 없기 때문에 /lib/modules 에 설치된 것니다.
이번엔 한번 옵션을 지정하고 해 봅니다.
root@boggle70-desktop:linux-2.6.29# make O=../build/ modules_install INSTALL_MOD_PATH=../modules/
INSTALL drivers/net/dm9000.ko
INSTALL drivers/scsi/scsi_wait_scan.ko
DEPMOD 2.6.29-falinux
root@boggle70-desktop:linux-2.6.29# rm -rf /lib/modules/2.6.29-falinux/
root@boggle70-desktop:linux-2.6.29#
root@boggle70-desktop:linux-2.6.29#
root@boggle70-desktop:linux-2.6.29#
root@boggle70-desktop:linux-2.6.29#
root@boggle70-desktop:linux-2.6.29# make O=../build/ modules_install INSTALL_MOD_PATH=../modules/
INSTALL drivers/net/dm9000.ko
INSTALL drivers/scsi/scsi_wait_scan.ko
DEPMOD 2.6.29-falinux
root@boggle70-desktop:linux-2.6.29# ls -la ../modules/lib/modules/
합계 12
drwxr-xr-x 3 root root 4096 2011-05-23 05:40 .
drwxr-xr-x 3 root root 4096 2011-05-23 05:40 ..
drwxr-xr-x 3 root root 4096 2011-05-23 06:08 2.6.29-falinux
root@boggle70-desktop:linux-2.6.29#
보시는 것처럼 옵션을 준 디렉토리 위치에 해당 모듈이 설치되었습니다.
일반적으로 사용하는 모듈 로딩 유틸리티에는 modprobe 와 insmode 가 있습니다.
실제 modprobe 는 insmode 를 이용하는데요
그 차이는 modprobe 의 경우 모듈 로딩시 /lib/modules/(커널버전) 위치에서 모듈을 찾고 의존성에 따라
더 필요한 모듈이 있는 경우 함께 로딩해 줍니다.
insmode 의 경우는 모듈파일의 위치를 정확히 가르쳐주어야 하고 의존성은 사용자가 직접 맞추어 주어야 합니다.
물론... modprobe 를 사용하더라도 unloading 시에 함께 내려주는 친절함은 베풀지 않습니다.