
Linux Kernel – 5 Kernel compilie🛠️
라즈베리파이 커널 빌드(컴파일), 커널 모듈 개발용 라이브러리 설치
* bc bison flex libssl-dev install 설치
apt-get install git bc bison flex libssl-dev

추가 필요 예상되는 패키지 설치
sudo apt-get install -y \
git bc bison flex libssl-dev \
make gcc libncurses-dev build-essential

Make Project dir + Git clone
mkdir -p project/linuxSrc
git clone --depth=1 https://github.com/raspberrypi/linux

Shell Script vs Makefile 문법 차이 요약
| 구분 | Shell Script (.sh) | Makefile (Makefile) |
|---|---|---|
| 목적 | 일반적인 작업 자동화 | 컴파일을 자동화할 때 사용 |
| 실행 방식 | bash script.sh 등으로 직접 실행 | make 명령어로 실행 (파일명은 Makefile) |
| 문법 | 순차적 명령어 실행 (if, for, while 등) | 타겟: 의존파일들\n 명령어 형식 |
| 들여쓰기 | 공백 또는 Tab 가능 | 반드시 Tab으로 들여쓰기 |
| 변수 정의 | VAR=value → $VAR | VAR=value → $(VAR) 또는 ${VAR} |
| 조건문/반복문 | if, for, while 등 Bash 문법 | 기본적으로 없음 (GNU Make의 if, foreach는 제한적) |
변수 옵션 확인

커널 컴파일
* 샘플 코드 빌드
#!/bin/bash
echo "configure build output path"
KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P)"
OUTPUT="$KERNEL_TOP_PATH/out"
echo "$OUTPUT"
KERNEL=kernel8
BUILD_LOG="$KERNEL_TOP_PATH/rpi_build_log.txt"
echo "move kernel source"
cd "$KERNEL_TOP_PATH/rpi-linux" # ← 디렉토리 이름에 맞게 수정
# ARCH 및 CROSS_COMPILE 환경 설정
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
echo "make defconfig"
make O="$OUTPUT" bcm2711_defconfig
echo "kernel build"
make O="$OUTPUT" Image modules dtbs -j4 2>&1 | tee "$BUILD_LOG"
마지막 라인 (커널 빌드 라인) 추가 설명
make O="$OUTPUT" : 모든 결과물은 $OUTPUT (out 폴더)에 넣는다.
make 에 대한 옵션 (Image, modules, dtbs)
Image : 컴파일을 다 한 후 이미지 파일로 생성한다는 의미
Image: 압축하지 않고 사용하는 이미지
zImage: 압축하여 사용 (2MB 이하로), 자체 압축 해제 루틴이 포함되어 있음 (ARM32)
modules : 모듈 컴파일 옵션 (드라이버 관련)
간단하게 모듈빌드를 위한 make 명령어는 make modules
make module : 커널 환경설정에서 모듈로 설정한 기능들을 컴파일
dtbs : dtbs 형식의 파일 생성 옵션
/boot/firmware 경로 내 파일 생성
* /boot/firmware 경로 내 dtb 파일 목록 확인

-j4 : CPU 스레드 4개 사용 선언 (PI CPU 코어 수와 동일)
2>&1 : 디버깅을 위해 표준 에러를 표준 출력 결과에 출력하기 위한 정의
| 구분 | 설명 | 파일 디스크립터 |
|---|---|---|
| 표준 출력 | 일반적인 출력 결과 (예: echo) | 1 |
| 표준 에러 | 오류 메시지 출력 (예: ls 없음) | 2 |
* 즉 stderr(2)를 stdout(1)과 같이 출력시키겠다. (에러 메시지와 일반 출력)
그 결과를 "| tee "$BUILD_LOG"" 즉 모니터와 로그 파일에 출력과 저장을 요청하는 문구
./build.sh 실행

