[커널] OS 커널 빌드 이유 및 셋팅

정재훈·2022년 5월 9일
0

Kernel

목록 보기
1/8

Device Driver 개발 준비

리눅스 커널 코드(리눅스 개발자) -> 리눅스 코드, 드라이버 코드, 샘플 코드 (SoC업체) -> 드라이버 추가 개발(BSP 업체) -> 보드 + sw 샘플 + 디바이스드라이버 포함된 리눅스 소스코드(고객)

D.D(디바이스 드라이버)란?

디바이스 드라이버를 개발하려면 커널 빌드를 한번 해두어야 편하다.
디바이스 드라이버 : 커널 안에서 디바이스 장치를 제어하는 SW

HW 개발회사는 D.D(디바이스 드라이버)를 제공해야, HW를 인식할 수 있다.

커널 빌드 이유

펌웨어에서는 직접적으로 메모리에 접근하지만, OS에서는 app을 통해 메모리에 접근하는 것은 금지되어있고, 커널로 접근 가능하다. 하지만, OS에서 커널 소스코드를 수정해 빌드할 때, 소요 시간이 약 2시간 정도 긴 시간이 필요하다.

해결책 : 커널 모듈를 1초 정도의 짧은 시간으로 빌드한다. 쉘에서 커널 모듈을 커널에 삽입한다. OS에서는 app을 통해 커널 모듈을 제어한다.
커널 모듈 : 커널에 들어가는 코드 덩어리
커널 모듈을 개발하기 위해서는 커널소스코드를 통해 커널을 먼저 빌드 해줘야한다.

OS 커널 빌드

라즈베리파이 커널 빌드 문서

해당 문서를 따라 설치해줍니다. 저는 Mobaxterm의 SSH를 통해 라즈베리파이와 연결후 해당 명령어를 입력하여 설치해줍니다.

  1. 종속성 도구(디펜던시) 설치
    sudo apt install git bc bison flex libssl-dev make

  2. 커널 소스코드 다운로드
    해당 파일로 이동 : cd /usr/src
    커널 소스코드 다운로드 : sudo git clone --depth=1 https://github.com/raspberrypi/linux

  3. Config 파일 생성 : 나의 라즈베리파이 하드웨어 맞는 환경으로 셋팅
    해당 파일로 이동 : cd linux
    환경변수 셋팅 : KERNEL=kernel7l
    config 파일 생성 : sudo make bcm2711_defconfig

  4. Build : 파이 코어가 4개이므로 j4로 셋팅
    sudo make -j4 zImage modules dtbs

Build는 60분가량 소요된다.

  1. 커널이 위치할 디렉터리에 빌드 결과물을 올린다.
    커널이 사용하는 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

  2. uname -r 했을 때의, 커널 버전 확인 : uname -r

  3. 재부팅 후 커널 버전이 달라지면 셋팅완료! : sudo rebootuname -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: 적재된 커널 모듈 확인 명령어

profile
여러 방향으로 접근하는 개발자

0개의 댓글