์ฝ˜ํ…์ธ ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

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 ๊ฐ€๋Šฅ๋ฐ˜๋“œ์‹œ Tab์œผ๋กœ ๋“ค์—ฌ์“ฐ๊ธฐ
๋ณ€์ˆ˜ ์ •์˜VAR=value โ†’ $VARVAR=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 ์‹คํ–‰