리눅스 커널 코드(리눅스 개발자) -> 리눅스 코드, 드라이버 코드, 샘플 코드 (SoC업체) -> 드라이버 추가 개발(BSP 업체) -> 보드 + sw 샘플 + 디바이스드라이버 포함된 리눅스 소스코드(고객)
디바이스 드라이버를 개발하려면 커널 빌드
를 한번 해두어야 편하다.
디바이스 드라이버
: 커널 안에서 디바이스 장치를 제어하는 SW
HW 개발회사는 D.D(디바이스 드라이버)를 제공해야, HW를 인식할 수 있다.
펌웨어
에서는 직접적으로 메모리에 접근하지만, OS
에서는 app을 통해 메모리에 접근하는 것은 금지되어있고, 커널로 접근 가능하다. 하지만, OS에서 커널 소스코드를 수정해 빌드할 때, 소요 시간이 약 2시간 정도 긴 시간이 필요하다.
해결책
: 커널 모듈
를 1초 정도의 짧은 시간으로 빌드한다. 쉘에서 커널 모듈을 커널에 삽입한다. OS에서는 app
을 통해 커널 모듈을 제어한다.
커널 모듈
: 커널에 들어가는 코드 덩어리
커널 모듈을 개발하기 위해서는 커널소스코드를 통해 커널을 먼저 빌드 해줘야한다.
해당 문서를 따라 설치해줍니다. 저는 Mobaxterm의 SSH
를 통해 라즈베리파이와 연결후 해당 명령어를 입력하여 설치해줍니다.
종속성 도구(디펜던시) 설치
sudo apt install git bc bison flex libssl-dev make
커널 소스코드 다운로드
해당 파일로 이동 : cd /usr/src
커널 소스코드 다운로드 : sudo git clone --depth=1 https://github.com/raspberrypi/linux
Config 파일 생성 : 나의 라즈베리파이 하드웨어 맞는 환경으로 셋팅
해당 파일로 이동 : cd linux
환경변수 셋팅 : KERNEL=kernel7l
config 파일 생성 : sudo make bcm2711_defconfig
Build : 파이 코어가 4개이므로 j4
로 셋팅
sudo make -j4 zImage modules dtbs
Build는 60분가량 소요된다.
커널이 위치할 디렉터리에 빌드 결과물을 올린다.
커널이 사용하는 D.D를 적절한 곳에 설치 : sudo make modules_install
dtb들을 SD카드(/boot)에 복사 :
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
Build된 Kernel을 SD카드에 복사 : sudo cp arch/arm/boot/zImage /boot/$KERNEL.img
uname -r 했을 때의, 커널 버전 확인 : uname -r
재부팅 후 커널 버전이 달라지면 셋팅완료! : sudo reboot
후 uname -r
을 통해 확인
커널모듈
은 동작중인 커널 소스코드에 끼어드는것이기 때문에 main 함수
는 따로 없다.
jh.c
: 커널 모듈 형태의 Device Driver
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int jh_init(void)
{
printk( KERN_INFO "OK HELLO Jaehoon\n");
return 0;
}
static void jh_exit(void)
{
printk( KERN_INFO "BYE Jaehoon\n\n");
}
module_init(jh_init);
module_exit(jh_exit);
makefile
KERNEL_SRC=/lib/modules/$(shell uname -r)/build
obj-m := jh.o
go:
make -C $(KERNEL_SRC) M=$(PWD) modules
dmesg : 커널 log 확인 방법
dmesg -w : 커널 log를 계속 띄우는 명령어로, 터미널 조작할 순 없다.
sudo insmod [파일명.ko]
: 커널 모듈을 커널에 집어넣는 명령어
sudo rmmod [파일명]
: 커널 모듈을 커널에서 제거하는 명령어
디바이스 드라이버 : HW를 제어하는 커널 모듈
modinfo [파일명.ko]
: ko 파일 확인 명령어
lsmod
: 적재된 커널 모듈 확인 명령어