커널 포팅 (6. 실전 커널 포팅 프로젝트 / 6.2 새로운 보드용 커널 포팅 프로젝트 진행)

2025. 3. 6. 19:47프로그래밍/시스템

6.2 새로운 보드용 커널 포팅 프로젝트 진행

임베디드 시스템에서 새로운 개발 보드(ARM Cortex-A 계열)에 커널을 포팅하는 과정은 하드웨어 분석, 커널 소스 수정, 최적화 및 디버깅, 최종 배포 이미지 제작으로 구성됩니다.
이 장에서는 보드 선택, 기존 커널 소스 분석 및 수정, 성능 최적화 및 디버깅, 최종 배포 이미지 제작 방법을 설명하며,
ARMv7(32비트)과 ARMv8(64비트) 아키텍처의 차이,
DTS 파일의 경로 차이,
U-Boot에서 booti와 bootm의 선택 기준 등의 고려 사항을 반영합니다.


🔹 1️⃣ 특정 개발 보드(ARM Cortex-A 계열) 선택

새로운 보드에서 커널을 포팅하려면 사용할 하드웨어의 사양과 지원 가능한 커널 소스를 확인하는 것이 중요합니다.

보드 선택 시 고려할 사항

  • CPU 아키텍처: ARMv7 (Cortex-A7, A8) vs ARMv8 (Cortex-A53, A72)
  • 디바이스 트리(DTS) 지원 여부: 기존 커널에서 제공되는 DTS 파일이 있는지 확인
  • 부트로더(U-Boot 또는 다른 부트로더) 지원 여부: 기존 커널과 호환되는지 확인
  • 스토리지 인터페이스: eMMC, SD 카드, NAND 플래시 등 저장 장치 지원 여부
  • I/O 및 주변 장치 지원: SPI, I2C, UART, USB, GPIO 등 필수 인터페이스 제공 여부

예제 보드

보드  CPU 아키텍처 RAM  스토리지  네트워크
BeagleBone Black ARM Cortex-A8 ARMv7 (32-bit) 512MB DDR3 eMMC / microSD 10/100 Ethernet
FriendlyARM NanoPi ARM Cortex-A7 ARMv7 (32-bit) 512MB DDR3 microSD 10/100 Ethernet
NXP i.MX6ULL ARM Cortex-A7 ARMv7 (32-bit) 256MB DDR3 NAND / eMMC 10/100 Ethernet
Rockchip RK3399 ARM Cortex-A72 + Cortex-A53 ARMv8 (64-bit) 2GB LPDDR4 eMMC / microSD Gigabit Ethernet

보드의 기존 커널 지원 확인

cat /proc/cpuinfo

예제 출력:

processor   : 0
model name  : ARM Cortex-A72
Hardware    : Rockchip RK3399

이를 통해 현재 실행 중인 보드의 CPU 모델과 하드웨어 정보를 확인할 수 있습니다.

ARMv7 vs ARMv8 차이

  • ARMv7 (Cortex-A7, A8) → 32비트, ARCH=arm
  • ARMv8 (Cortex-A53, A72) → 64비트, ARCH=arm64
  • DTS 경로 차이:
    • ARMv7: arch/arm/boot/dts/
    • ARMv8: arch/arm64/boot/dts/

🔹 2️⃣ 기존 커널 소스를 분석하고 필요한 수정 적용

새로운 보드에서 커널을 포팅하려면 기존 커널 소스를 분석하고 필요한 드라이버 및 설정을 추가해야 합니다.

📌 1️⃣ 기존 커널 소스 코드 다운로드

대부분의 임베디드 보드는 SoC 벤더 또는 개발자 커뮤니티에서 제공하는 커널 소스를 가지고 있습니다.

공식 커널 저장소에서 소스 다운로드

git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux

SoC 벤더가 제공하는 커널 다운로드 예제(NXP i.MX6ULL):

git clone https://source.codeaurora.org/external/imx/linux-imx.git
cd linux-imx

사용 중인 커널 버전 확인

uname -r

출력 예시:

5.10.104-armv8

📌 2️⃣ 디바이스 트리(DTS) 수정

ARM Cortex-A 기반 보드는 디바이스 트리(Device Tree, DTS) 파일을 사용하여 하드웨어를 정의합니다.

DTS 파일 위치 (보드 아키텍처에 따라 경로 다름)

ls arch/arm/boot/dts/     # ARMv7
ls arch/arm64/boot/dts/   # ARMv8

출력 예시:

imx6ull-evk.dts  rk3399-sbc.dts  sunxi-h3.dts

DTS 파일 수정 파일: arch/arm64/boot/dts/my_board.dts (ARMv8 기준)

/ {
    model = "Custom ARM Cortex-A Board";
    compatible = "myvendor,my_board";

    memory {
        reg = <0x80000000 0x40000000>; // RAM 1GB 설정
    };

    chosen {
        bootargs = "console=ttyS0,115200 root=/dev/mmcblk0p2 rw";
    };
};

DTS 파일 빌드

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs

📌 3️⃣ 커널 설정 및 빌드

기본 커널 설정 로드

make defconfig

설정 변경 (menuconfig)

make menuconfig

커널 빌드

make -j$(nproc) Image modules dtbs

🔹 3️⃣ 최적화 및 디버깅 후 최종 배포 이미지 제작

📌 1️⃣ U-Boot에서 커널 실행

ARMv7 vs ARMv8 U-Boot 부팅 명령어 차이

  • ARMv7: bootm
  • ARMv8: booti

부팅 테스트 (ARMv8 예제)

setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p2 rw"
setenv bootcmd "tftp 0x82000000 Image; booti 0x82000000 - 0x83000000"
saveenv
reset

부팅 로그 확인

dmesg | grep "Linux version"

📌 2️⃣ 성능 최적화

CPU 및 메모리 프로파일링 (perf)

sudo perf top

커널 로그 최적화 (loglevel)

setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p2 rw loglevel=3 quiet"

I/O 성능 튜닝

echo noop > /sys/block/mmcblk0/queue/scheduler

📌 3️⃣ 최종 배포 이미지 제작

부팅 가능한 SD 카드 이미지 생성

dd if=/dev/mmcblk0 of=my_board_image.img bs=1M

압축하여 배포

gzip my_board_image.img

TFTP 서버에 업로드

scp my_board_image.img.gz user@tftp-server:/tftpboot/

✅ 정리

  1. ARMv7(32비트)과 ARMv8(64비트) 아키텍처의 차이 고려
    • DTS 파일 경로: arch/arm/boot/dts/ vs arch/arm64/boot/dts/
    • U-Boot 부팅 명령어: bootm(ARMv7) vs booti(ARMv8)
  2. 기존 커널 소스 분석 및 수정
    • 공식 커널 또는 SoC 벤더 커널 다운로드
    • DTS 수정 및 커널 빌드 수행
  3. 최적화 및 배포
    • perf, loglevel, noop 스케줄러 설정
    • SD 카드 이미지 생성 및 TFTP 서버 배포