우선 앞전 실습에서 설정한 빌트인 메뉴를 해제해 줘야 한다.
이 메뉴를 *
에서 M
(모듈)로 수정한다. 그러면 이제 우리의 디바이스 드라이버 소스가 빌트인이 아닌 모듈로 컴파일 되는 것이다.
ubuntu@ubuntu14:~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules -j4
모듈을 컴파일 하고 싶으면 build
할 때 modules
를 줘야한다.
원래는 모듈만 컴파일 하면 되는데, 빌트인 옵션을 해제한 버전으로 커널을 다시 빌드해야 하기 때문에 zImage 옵션도 넣어서 커널을 한번 더 빌드해주겠다.
다시한번 말하지만 모듈만 컴파일 할 수 있다.
이렇게 해서 .ko(kernel object)
파일을 생성하는게 목표이다.
원래 디바이스 드라이버 폴더에 보면 .ko
파일이 없다.
ubuntu@ubuntu14:~/pi_bsp/kernel/linux/drivers/char/kcci_ledkey$ ls -l
합계 44
-rw-rw-r-- 1 ubuntu ubuntu 157 2월 29 09:53 Kconfig
-rw-rw-r-- 1 ubuntu ubuntu 42 2월 29 10:12 Makefile
-rw-rw-r-- 1 ubuntu ubuntu 142 2월 29 10:04 built-in.a
-rw-rw-r-- 1 ubuntu ubuntu 11458 2월 29 09:46 ledkey_dev.c
-rw-rw-r-- 1 ubuntu ubuntu 38 2월 29 10:43 ledkey_dev.mod
-rw-rw-r-- 1 ubuntu ubuntu 11124 2월 29 10:43 ledkey_dev.o
-rw-rw-r-- 1 ubuntu ubuntu 39 2월 29 10:43 modules.order
하지만 위의 모듈 컴파일 과정을 마치고 다시 커널 내 디바이스 드라이버 폴더를 보면 .ko
커널 오브젝프 파일이 생성된 것을 확인할 수 있다.
ubuntu@ubuntu14:~/pi_bsp/kernel/linux/drivers/char/kcci_ledkey$ ls -l
합계 72
-rw-rw-r-- 1 ubuntu ubuntu 157 2월 29 09:53 Kconfig
-rw-rw-r-- 1 ubuntu ubuntu 42 2월 29 10:12 Makefile
-rw-rw-r-- 1 ubuntu ubuntu 142 2월 29 10:04 built-in.a
-rw-rw-r-- 1 ubuntu ubuntu 11458 2월 29 09:46 ledkey_dev.c
-rw-rw-r-- 1 ubuntu ubuntu 12904 2월 29 10:51 ledkey_dev.ko
-rw-rw-r-- 1 ubuntu ubuntu 38 2월 29 10:43 ledkey_dev.mod
-rw-rw-r-- 1 ubuntu ubuntu 1860 2월 29 10:50 ledkey_dev.mod.c
-rw-rw-r-- 1 ubuntu ubuntu 4288 2월 29 10:51 ledkey_dev.mod.o
-rw-rw-r-- 1 ubuntu ubuntu 11124 2월 29 10:43 ledkey_dev.o
-rw-rw-r-- 1 ubuntu ubuntu 39 2월 29 10:43 modules.order
// 새로 빌드된 커널 이미지 라즈베리파이로 옮겨서 다시 부팅하기
(생략)
// 커널 오브젝트 파일 옮기기
ubuntu@ubuntu14:~/pi_bsp/kernel/linux$ ls -l drivers/char/kcci_ledkey/ledkey_dev.ko
ubuntu@ubuntu14:~/pi_bsp/kernel/linux$ cp drivers/char/kcci_ledkey/ledkey_dev.ko /srv/nfs/
pi@pi14:/lib/modules $ ls -l
합계 20
drwxr-xr-x 3 root root 4096 12월 5일 10:07 6.1.0-rpi7-rpi-v6
drwxr-xr-x 3 root root 4096 12월 5일 10:06 6.1.0-rpi7-rpi-v7
drwxr-xr-x 3 root root 4096 12월 5일 10:06 6.1.0-rpi7-rpi-v7l
drwxr-xr-x 3 root root 4096 12월 5일 10:06 6.1.0-rpi7-rpi-v8
drwxr-xr-x 3 root root 4096 2월 21일 10:31 6.1.77-v7l+
pi@pi14:~ $ uname -a
Linux pi14 6.1.77-v7l+ #22 SMP Thu Feb 29 10:50:56 KST 2024 armv7l GNU/Linux
우리가 쓰는 커널 버전이 6.1.77-v7l+
이기 때문에 /lib/modules/
경로에 6.1.77-v7l+
폴더 안에다가 디바이스 드라이버 커널 오브젝트를 넣어줘야 한다.
// 경로 확인
pi@pi14:/lib/modules/6.1.77-v7l+/kernel/drivers/char $ pwd
/lib/modules/6.1.77-v7l+/kernel/drivers/char
// 디바이스 드라이버를 담을 폴더 추가
pi@pi14:/lib/modules/6.1.77-v7l+/kernel/drivers/char $ mkdir kcci_ledkey
pi@pi14:/lib/modules/6.1.77-v7l+/kernel/drivers/char $ cp /mnt/ubuntu_nfs/ledkey_dev.ko .
// 업데이트 전 모듈 의존성 확인
pi@pi14:/lib/modules/6.1.77-v7l+ $ vi modules.dep
// 모듈 의존성 업데이트
pi@pi14:/lib/modules/6.1.77-v7l+ $ sudo depmod -a
// 업데이트 후 모듈 의존성 확인
pi@pi14:/lib/modules/6.1.77-v7l+ $ vi modules.dep
맨 아래에 아무것도 없었는데 아래를 보면 새로 한줄이 추가되었다.
// 모듈 로드
pi@pi14:/lib/modules/6.1.77-v7l+ $ sudo modprobe ledkey_dev
// 모듈 적재 확인
pi@pi14:~ $ sudo cat /proc/devices
...
230 ledkey_dev
...
잘 실행되는 것을 확인할 수 있다.