Unix & Linux/Kernel

Raspberry Pi Zero W, 커널 컴파일 및 빌드

LEEHANDS 2022. 1. 13. 14:04
반응형

1. Kernel ( 커널 ) ?

운영체제 (OS) 에서 가장 코어 파트에 해당

커널은 컴퓨터의 각종 드라이버, 메모리, 프로세스 등을 관리하는 역할을 수행

일반적으로 배포판으로 제공되는 커널은 이미 일반적인 기능이 포함

라즈베리파이는 Debian 기반의 os를 사용하는데 부품과 적절히 호환될 수 있는 형태로 제공된다.

 

기본적인 커널에서 제공하지 않는 기능을 사용하고 싶을 때, 커널을 변경하여 컴파일해볼 필요가 있다.

예를들어 특정한 하드웨어를 관리하기 위한 디바이스 드라이버 (Device Driver) 를 작성할 때 커널 모듈 형태로 작성할 수 있다.

 

1-1 커널의 주요 디렉토리

- linux/kernel : 커널 핵심 소스 코드

- linux/include : 커널 소스코드의 헤더 파일

- linux/lib : 커널 내부에서 사용되는 함수 라이브러리

- linux/drivers : 하드웨어 관리목적의 디바이스 드라이버

 

 

 

 

 

 

2. Raspberry Pi 커널 크로스 컴파일 방법

2-1. 관련 종속성 (Dependencies) 및 툴 체인 (Tool Chain) 설치

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

2-2. 32 bit Kernel 을 위한 32 bit 툴체인 설치

udo apt install crossbuild-essential-armhf

2-3. 라즈베리파이 소스코드 다운로드 받기

git clone --depth=1 https://github.com/raspberrypi/linux

소스코드를 확인해보면 일반적인 리눅스 와 동일한 구조를 가지고 있다.

Kernel directoy , drivers / security 등

 

각종 드라이버 (Driver) 관련 소스를 확인하고 싶으면 아래 경로를 들어가 보면 됩니다.

커널 컴파일 후 제대로 동작하는 것을 확인하기 위해 코드를 수정합니다.

 

2-4. 소스코드 빌드하기

라즈베리파이 제로는 다음과 같은 ㅁ여령어로 config 파일을 만들 수 있습니다.

 

cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

이후에는 실제로 환경설정 파일을 토대로 빌드를 진행

커널 소스코드를 새롭게 빌드하는 것입니다. 예를들어 새로운 드라이버를 작성하고 싶다면, 드라이버 코드를 고친 뒤에 커널 소스코드를 빌드하면 그 내용이 적용되는 원리

 

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

<수십분 소요>

 

2-5. SD카드 붙이기

커널을 빌드한 후 현재 가지고 있는 라즈베리파이 에 커널을 복사해 모듈을 설치해야 합니다.

SD카드를 붙이면 FAT 파티션과 ext4 파티션이 있다.

"fdisk -l" 

을 통해 확인할 수 있다.

mkdir mnt

mkdir mnt/fat32

mkdir mnt/ext4

sudo mount /dev/sdx1 mnt/fat32

sudo mount /dev/sdx2 mnt/ext4

 

마운트를 합니다.

df -h

를 통해 용량이 충분한지 확인

 

이제 커널 모듈을 SD카드에 설치합니다. 여기서 나오는 modules_install 은 말그대로 커널 모듈을 설치하는 명령

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

만들어진 커널 이미지가 정상적으로 동작하지 않을 수 있기 때문에 현재 커널 이미지를 백업합니다.

 

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img

이후에는 SD카드의 mnt 폴더로 만들어진 커널이미지를 옮겨줍니다.

sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

이후에는 Unmount 를 진행합니다.

 

sudo umount mnt/fat32
sudo umount mnt/ext4

 

SD카드를 라즈베리파이에 꼽고 부팅합니다.

Multi Gadget Driver 사용하도록 하고 Mass strorage 기능 활성화 하도록 설정

이후에 dmesg 를 입력했을 때 다음과 같이 로그가 찍혀있는 것을 확인해 볼 수 있습니다.

 

 

2-6 커널 소스코드 수정이후 다시 빌드하는 방법

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j8
mkdir mnt mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sde1mnt/fat32
sudo mount /dev/sde2 mnt/ext4
sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
sudo cp mnt/fat32/kernel.img mnt/fat32/kernel-backup.img
sudo cp arch/arm/boot/zImage mnt/fat32/kernel.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

 

반응형