* 원문 링크 : https://www.raspberrypi.com/documentation/computers/linux_kernel.html

Building the Kernel

사용하는 OS 환경에서의 default compilers와 linkers는 그 OS에서 동작할 실행 파일을 빌드할 수 있도록 구성되어있다. 이를 native tools이라고 한다. 하지만, 꼭 build를 위해 native tools를 사용하지 않아도 된다. cross-compiler는 build하는 환경(host)의 code가 아닌 run할 환경(target)의 code를 build한다. 이를 cross-compilation이라 한다.

Raspberry Pi kernel의 cross-compilation은 두 가지 이유에서 유용하다.

1. 32bit OS에서 64bit kernel을 build할 수 있고 반대도 가능하다.

2. 일반 노트북에서도 Pi에서 보다 더 빠르게 cross-compile할 수 있다.

아래의 가이드는 native builds와 cross-compilation으로 구분된다. 읽는 이의 상황에 맞게 적절한 section을 선택한다. - 두 방법 사이엔 많은 공통점이 있지만 몇 가지 중요한 차이점도 있다.

Building the Kernel Locally

먼저 Raspberry Pi OS의 최신 버전을 설치한다. Pi를 boot하고 source에 접근할 수 있게 Ethernet을 연결한다.

Pi에서 log-in후 git과 build dependencies를 설치한다.

sudo apt install git bc bison flex libssl-dev make

다음으로 sources를 가져온다. 이는 시간이 소요되는 작업이다.

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

* Choosing Sources

위의 "git clone" 명령은 현재 active branch를 다운로드한다(without any history). "--depth=1" 옵션을 생략하면 모든 repository를 다운로드한다(full history of all branches). 하지만 이경우 더 많은 시간과 용량이 필요하다.

다른 branch의 code를 받고 싶다면 "--branch" 옵션을 사용한다.

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

"<branch>" 부분에 원하는 branch 이름을 적는다.

사용 가능한 branches의 정보를 확인하려면 original GitHub repository 링크를 참조한다.

* Kernel Configuration

kernel을 설정한다. 때때로 더 상세하게 설정하거나 필요한 기능을 add or remove하기 위해 다른 source의 patches를 적용하고 싶을 수 있다.

- Apply the Default Configuration

사용하는 Raspberry Pi version에 따라 다음의 명령을 실행하여 default configuration을 준비한다:

For Raspberry Pi 1, Pi Zero, Pi Zero W and Comute Module default build configuration

cd linux
KERNEL=kernel
make bcmrpi_defconfig

 For Raspberry Pi 2, Pi 3, Pi 3+ and Compute Module 3 default build configuration

cd linux
KERNEL=kernel7
make bcm2709_defconfig

- Customising the Kernel Version Using LOCALVERSION

설정한 kernel이 upstream kernel과 같은 version string을 사용하지 않도록 LOCALVERSION 변수를 사용할 수 있다. 이를 통해 "uname" 명령의 출력 결과에서 사용중인 kernel이 내가 build한 kernel임을 알 수 있고 내가 만든 modules가 "/lib/modules"의 기본 modules를 덮어쓰지 않을 수 있다.

그렇게 하기위해 다음 줄을 따라 ".config"를 바꾼다:

CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"

위 설정은 the kernel configuration instructions에서와 같이 GUI상에서 설정할 수도 있다. "General setup => Local version - append to kernel release"에 위치한다.

* Building the Kernel

kernel, modules, device tree blobs를 build하고 install한다; 이 단계는 사용하는 Pi model에 따라 시간이 많이 걸릴 수 있다.

For the 32-bit kernel:

make -j4 zImage modules dtbs
sudo make modules_install
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/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

For the 64-bit kernel:

make -j4 Image modules dtbs
sudo make modules_install
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm64/boot/Image /boot/$KERNEL.img

Note.

Raspberry Pi 2/3/4에서 "-j4" flag는 작업을 4개 코어로 분할하여 compilation 속도를 높힌다.

Cross-Compiling the Kernel

cross-compilation host로는 linux가 적합하다. 가이드의 환경은 Ubuntu다; Raspberry Pi OS도 하나의 Debian 계열 distribution이기 때문에 command lines와 더불어 많은 측면에서 유사하다.

Windows에서 VirtualBox (or VMWare)을 사용할 수도 있다. 다음 Wikihow 링크를 참조한다.

* Install Required Dependencies and Toolchain

sources를 cross-compilation으로 build하기 위해 다음을 실행하여 host에 필요한 dependencies를 다운받는다.

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

이외 다른 것이 필요하다면 comment를 작성하여 이 documentation을 변경할 수 있도록 한다.

Install the 32-bit Toolchain for a 32-bit Kernel

sudo apt install crossbuild-essential-armhf

Install the 64-bit Toolchain for a 64-bit Kernel

sudo apt install crossbuild-essential-arm64

* Get the Kernel Sources

"Building Kernel Locally > Choosing Sources"를 참고한다.

* Build sources

 

to be continue...

'개발 > linux' 카테고리의 다른 글

내가 쓰는 bash 단축키 모음  (0) 2021.12.09
커널 소스 폴더 구조  (0) 2021.11.29
리눅스 역사  (0) 2021.11.23
[기초편] Shell 이란?  (0) 2020.08.24
vi 사용법  (0) 2020.06.16

+ Recent posts