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/
✅ 정리
- ARMv7(32비트)과 ARMv8(64비트) 아키텍처의 차이 고려
- DTS 파일 경로: arch/arm/boot/dts/ vs arch/arm64/boot/dts/
- U-Boot 부팅 명령어: bootm(ARMv7) vs booti(ARMv8)
- 기존 커널 소스 분석 및 수정
- 공식 커널 또는 SoC 벤더 커널 다운로드
- DTS 수정 및 커널 빌드 수행
- 최적화 및 배포
- perf, loglevel, noop 스케줄러 설정
- SD 카드 이미지 생성 및 TFTP 서버 배포
'프로그래밍 > 시스템' 카테고리의 다른 글
커널 포팅 (마무리 및 추가 학습 자료) (0) | 2025.03.06 |
---|---|
커널 포팅 (6. 실전 커널 포팅 프로젝트 / 6.1 라즈베리파이(Raspberry Pi) 커널 포팅 실습) (0) | 2025.03.06 |
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.3 커널 디버깅 및 프로파일링) (0) | 2025.03.06 |
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.2 루트 파일 시스템 설정) (0) | 2025.03.06 |
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.1 부트로더 커스터마이징) (0) | 2025.03.06 |