• 전체강좌

    Kernel 소스 코드를 빌드해서 올려보자.(feat. Raspberry pi 4)

    twitter facebook

    안녕하세요? 착한이입니다.


    Raspberry Pi 4는 Rasbian 운영체제를 지원합니다.

    지난 강좌에서 Rasbian을 사용하지 않고

    최신 uboot를 빌드해서 Raspberry Pi 4에 올려 보았습니다.

    본 강좌에서는 Raspberry Pi 4 용 kernel 소스 코드를 빌드해서

    Raspberry Pi 4에 올려 보겠습니다.

    Linux kernel 스터디할 때, 도움이 될 것입니다.


    uboot 소스 코드를 빌드해서 올려보자.(feat. Raspberry pi 4) 강좌 보기

    http://www.wearedev.net/?m=bbs&bid=lecture&cat=Linux&uid=284


    1. kernel 빌드 개발 환경 구축하기


    kernel을 빌드하기 위해서는 uboot 처럼 Linux Host 시스템과 ARM64용 Cross Compiler 가 필요합니다.

    본 강좌에서는 Host 시스템으로 Ubuntu 20.04 운영체제를 사용하였으며,

    Cross Compiler 는 ARM64용을 사용하였습니다.


    개발 환경 구축은 uboot와 동일하므로, 이전 강좌의 "uboot 빌드 개발 환경 구축하기" 를 참고 부탁 드립니다.

    http://www.wearedev.net/?m=bbs&bid=lecture&cat=Linux&uid=284


    개발 환경 구축이 완료 되었다면, kernel 소스 코드를 다운로드 합니다.


    2. kernel 소스 코드 다운로드 하기


    Raspberry Pi 4용 kernel 소스 코드는 다음 사이트에서 다운로드 가능합니다.

    Linux 버전별로 소스 코드가 제공되고 있으며,

    본 강좌에서는 5.15 버전을 사용하였습니다.


    https://github.com/raspberrypi/linux


    터미널을 실행하고 다음 명령어로 kernel 소스 코드를 다운로드 합니다.


    git clone --depth=1 -b rpi-5.15.y https://github.com/raspberrypi/linux.git


    다운로드가 완료되면 linux 폴더가 생성됩니다.

    해당 폴더 아래에 다음 그림과 같이 kernel 소스 코드가 있으며,

    이를 분석하면 kernel을 이해하는데 도움이 됩니다.

    차후 강좌에서 Device Driver 분석 및 추가 하는 것에 대해 알아 보겠습니다.




    kernel 소스 코드가 다운로드 되었으니 이제 빌드해 보겠습니다.


    3. kernel 빌드하기


    터미널창을 실행하고 kernel 소스 코드를 다운로드 한 폴더(linux)로 이동합니다.

    강좌에서는 ~/Study/linux 폴더에 kernel 소스 코드가 있습니다.


    다음 명령어를 실행하여, Cross compiler 경로를 설정합니다.

    uboot 강좌와 같이 ~/Study/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu 폴더에

    Cross compiler 를 저장해 두었습니다.

    본인의 경로에 맞게 수정해서 적용해 주시면 됩니다.


    export ARCH=arm64

    export CROSS_COMPILE=~/Study/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-


    다음 명령어로 kernel를 Raspberry Pi 4 용으로 설정하고 빌드할 수 있습니다.


    make bcm2711_defconfig


    이 명령어를 실행하면 arch/arm64/configs/bcm2711_defconfig 파일의 내용을 기반으로

    linux 폴더 아래에 .config 파일이 생성됩니다

    이 파일을 보면 kernel에 포함된 항목들을 볼 수 있습니다.

    bcm2711_defconfig 파일을 본인이 원하는대로 수정할 수도 있습니다.

    이 부분은 차후 강좌에서 알아 보도록 하겠습니다.


    다음 명령어를 실행하여 kernel을 빌드합니다.


    make -j8


    여기서 -j8는 CPU Core 수를 의미합니다. Octa Core의 경우 -j8를 하면 되고

    본인 PC의 CPU Core 수를 지정하면 됩니다.

    kernel 빌드 시간은 PC 사양에 따라 차이가 있을 수 있습니다.

    빌드가 완료되면 다음 파일을 microSD 카드에 복사해서 사용하면 됩니다.


    arch/arm64/boot/Image

    arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb


    빌드된 kernel 이미지 파일(Image)의 크기는 약 22MB 정도이며,

    포함되는 구성되는 요소에 따라서 달라질 수 있습니다.

    microSD 카드의 boot 파티션의 크기는 이미지 파일보다 커야 합니다.


    다음으로 빌드된 kernel로 부팅하는 방법에 대해 알아 보겠습니다.


    4. Raspberry Pi 4에서 kernel 부팅하기


    빌드된 kernel로 부팅하기 위해서는 다음과 같이 microSD 카드를 준비해야 합니다.


    4-1. microSD 카드 파티션 나누기


    uboot 강좌에서와 같이 microSD 카드를 파티션 나누고 포멧해야 합니다.

    이미 파티션을 나눈 상태라면 그대로 사용해도 됩니다.


    http://www.wearedev.net/?m=bbs&bid=lecture&cat=Linux&uid=284


    4-2. kernel 설치하기


    Raspberry Pi 4 용 펌웨어 파일과 빌드된 kernel을 microSD 카드에 설치해야 합니다.

    펌웨어 파일은 다음 사이트에서 다운로드 가능합니다.


    https://github.com/raspberrypi/firmware


    펌웨어 boot 폴더의 다음 파일을 microSD 카드의 boot 파티션에 복사합니다.


    bootcode.bin

    start4.elf


    그리고 빌드된 kernel 이미지(Image 파일)와 Device tree (bcm2711-rpi-4-b.dtb) 파일도

    microSD 카드의 boot 파티션에 복사합니다.

    다음 경로의 파일을 복사하면 됩니다.


    arch/arm64/boot/Image

    arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb


    Image 파일을 복사한 후에 파일명을 kernel8.img 로 변경합니다.

    그리고 텍스트 편집기로 config.txt 파일을 생성하고


    다음 내용을 입력합니다.

    enable_uart=1

    arm_64bit=1


    config.txt 파일도 microSD 카드의 boot 파티션으로 복사합니다.


    마지막으로 텍스트 편집기로 cmdline.txt 파일을 생성하고

    다음 내용을 입력합니다.

    console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootwait


    cmdline.txt 파일도 microSD 카드의 boot 파티션으로 복사합니다.


    여기까지 했다면, boot 파티션에는 다음의 파일들이 저장되어 있을 것입니다.

    bootcode.bin

    start4.elf

    kernel8.img

    bcm2711-rpi-4-b.dtb

    config.txt

    cmdline.txt


    4-3. kernel 실행하기


    microSD 카드를 Raspberry Pi 4의 슬롯에 장착하고 전원을 연결합니다.

    PC에서 Serial로 kernel이 부팅되는 것을 확인할 수 있습니다.

    다음 그림과 같이 로그가 출력됩니다.

    로그를 보면 kernel이 부팅하면서 Device Driver가 로딩되는 것을 확인할 수 있습니다.



    아직은 kernel 부팅 중에 Rootfs가 없어서 에러가 발생합니다.

    Rootfs 부분은 다음 강좌에서 알아 보겠습니다.


    여기까지 kernel 소스 코드를 빌드해서 Raspberry Pi 4에 올려서 실행시켜 보았습니다.

    kernel 소스 코드가 공개되어 있으므로, Device Driver 를 개발해서 추가하거나 분석하시면서 다양한 기능을 테스트 해 보실 수 있습니다.

    Raspberry Pi 4로 kernel 스터디 하시는데 도움이 되었으면 합니다.

    문의 사항 있으시면 댓글로 남겨 주세요. ^^

    그럼 다음 강좌에서 뵙겠습니다.


    --------------------------------------------------------

    유튜브 채널 방문과 구독 신청 부탁 드립니다.

    http://www.youtube.com/c/WeAreDev