콘텐츠로 바로가기

now0930 일지

이런저런 생각

  • 홈
  • 비공개
  • 강좌
  • 잔여 작업 조회
  • 위치

raspberry pi4 커널 컴파일

삼국지도 다 끝났고, 남는 시간에 리눅스 커널을 배워 보기로 했다. 시간 남을 땐 이게 효과가 확실하지. 전에 샀던 “디버깅을 통해 배우는 리눅스 커널의 구조와 원리”를 따라 해보기로 했다. 커널이 리눅스 심장과 같아 꼭 배울 필요는 없지만, 알면 편하게 살 수 있다. 리눅스 역시 과거 서버를 벗어나 arm에 로딩되어 여러 임베디드 리눅스로 사용되고 있다. 라즈베리 파이 역시 미친 가격으로 집에서 누구나 쉽게 구할 수 있다. 지금 IoT가 뜨고 있는데 안 배울 이유가 없다.

책에 나온 커널이 버전 4.19다. 2021. 5월 업데이트를 하면 커널 5.10을 사용한다. 일단 커널을 4.19 버전으로 강제로 맞춰야 한다.

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l GNU/Linux

책 53 페이지에 나온대로 따라했다. 15년전에 비하면 정말 편해졌다. 그 때 컴파일 옵션이 너무 많아 하드웨어 지식이 없어 무엇을 선택할 지 몰랐다.

#https://www.raspberrypi.org/documentation/linux/kernel/building.md

#필요 모듈 설치.
sudo apt install git bc bison flex libssl-dev make

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

cd linux
#KERNEL=kernel7
KERNEL=kernel7l
#make bcm2709_defconfig
make bcm2711_defconfig

책은 make bcm2709_defconfig로 컴파일 옵션을 설정했다. 아무 생각없이 따라하다 보면 usb를 하나도 인식하지 못하는 현상을 겪는다.

pi@raspberrypi:~ $ lsusb
pi@raspberrypi:~ $

이거 때문에 한동안 고민했다. make menu로 usb를 설정하는 옵션을 찾아 켜주면 될 듯 한데, 내가 많이 몰라 다른 옵션을 어떻게 설정할지 판단 못하겠다. 옵션 하나 켜겠다고 그 짓을 해야되나… usb가 막혀 키보드도 연결되지 않고, usb 메모리, 카메라 등 아무것도 연결되지 않았다. usb 4포트가 모두 불량인 줄 알고 환불할 뻔 했다.

pi@raspberrypi:~ $ cat /proc/cpuinfo
processor	: 0
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 270.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 1
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 270.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 2
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 270.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 3
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 270.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

Hardware	: BCM2711
Revision	: b03114
Serial		: 100000003d82cd51
Model		: Raspberry Pi 4 Model B Rev 1.4

책에 없지만, 웹 사이트와 여기 보드 정보를 보면 bcm2711을 사용했다. 이 옵션이 맞다. 이게 customized 제품과 대량 생산품 차이다. 이 옵션을 개인이 일일히 다 넣어주려면 힘들겠다. 표준화된 하드웨어를 사용함이 훨씬 낫다. 아무리 많이 판대도 raspberry pi 만큼 팔릴 수 있을 지 모르겠다. 단가에서 경쟁하기 어렵다고 본다.

make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

나머지를 실행한다. boot 디렉토리 파일을 덮어쓰기 전에 기존 파일을 꼭 백업해야 한다. 그냥 날려 버리면 나처럼 다시 이미지를 구워야 한다.

pi@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.127-v7l+ #2 SMP Thu May 13 15:17:29 BST 2021 armv7l GNU/Linux

1.5시간 컴파일 후 정상적으로 부팅했음을 확인했다.

cross compile을 하기로 했다. 1.5 시간이 10분으로 줄어드는 마법을 보았다. https://www.raspberrypi.org/documentation/linux/kernel/building.md 사이트에 가면 cross compile 하는 방법이 나와 있다. 그대로 따라하면 된다.

/boot 디렉토리 내용을 통째로 날렸는데, 그러면 안된다. start.elf 파일이 없다고 부팅되지 않는다.

pi@raspberrypi:/boot $ ls -l
total 27721
-rwxr-xr-x 1 root root   24270 May 15  2021 bcm2708-rpi-b-plus.dtb
-rwxr-xr-x 1 root root   24007 May 15  2021 bcm2708-rpi-b.dtb
-rwxr-xr-x 1 root root   23788 May 15  2021 bcm2708-rpi-cm.dtb
-rwxr-xr-x 1 root root   24448 May 15  2021 bcm2708-rpi-zero-w.dtb
-rwxr-xr-x 1 root root   23712 May 15  2021 bcm2708-rpi-zero.dtb
-rwxr-xr-x 1 root root   25334 May 15  2021 bcm2709-rpi-2-b.dtb
-rwxr-xr-x 1 root root   25483 May 15  2021 bcm2710-rpi-2-b.dtb
-rwxr-xr-x 1 root root   27143 May 15  2021 bcm2710-rpi-3-b-plus.dtb
-rwxr-xr-x 1 root root   26524 May 15  2021 bcm2710-rpi-3-b.dtb
-rwxr-xr-x 1 root root   25338 May 15  2021 bcm2710-rpi-cm3.dtb
-rwxr-xr-x 1 root root   41185 May 15  2021 bcm2711-rpi-4-b.dtb
-rwxr-xr-x 1 root root   18695 May 15  2021 bcm2835-rpi-a-plus.dtb
-rwxr-xr-x 1 root root   18579 May 15  2021 bcm2835-rpi-a.dtb
-rwxr-xr-x 1 root root   18982 May 15  2021 bcm2835-rpi-b-plus.dtb
-rwxr-xr-x 1 root root   18858 May 15  2021 bcm2835-rpi-b-rev2.dtb
-rwxr-xr-x 1 root root   18725 May 15  2021 bcm2835-rpi-b.dtb
-rwxr-xr-x 1 root root   18690 May 15  2021 bcm2835-rpi-cm1-io1.dtb
-rwxr-xr-x 1 root root   19173 May 15  2021 bcm2835-rpi-zero-w.dtb
-rwxr-xr-x 1 root root   18647 May 15  2021 bcm2835-rpi-zero.dtb
-rwxr-xr-x 1 root root   19558 May 15  2021 bcm2836-rpi-2-b.dtb
-rwxr-xr-x 1 root root   21027 May 15  2021 bcm2837-rpi-3-b-plus.dtb
-rwxr-xr-x 1 root root   20238 May 15  2021 bcm2837-rpi-3-b.dtb
-rwxr-xr-x 1 root root   52456 May 15  2021 bootcode.bin
-rwxr-xr-x 1 root root     121 May 15  2021 cmdline.txt
-rwxr-xr-x 1 root root    1809 May 15  2021 config.txt
-rwxr-xr-x 1 root root    7314 May 15  2021 fixup.dat
-rwxr-xr-x 1 root root    5446 May 15  2021 fixup4.dat
-rwxr-xr-x 1 root root    3191 May 15  2021 fixup4cd.dat
-rwxr-xr-x 1 root root    8454 May 15  2021 fixup4db.dat
-rwxr-xr-x 1 root root    8452 May 15  2021 fixup4x.dat
-rwxr-xr-x 1 root root    3191 May 15  2021 fixup_cd.dat
-rwxr-xr-x 1 root root   10298 May 15  2021 fixup_db.dat
-rwxr-xr-x 1 root root   10298 May 15  2021 fixup_x.dat
-rwxr-xr-x 1 root root     145 May 15  2021 issue.txt
-rwxr-xr-x 1 root root 5773448 May 15  2021 kernel7l.img
drwxr-xr-x 2 root root   16384 May 15  2021 overlays
-rwxr-xr-x 1 root root 2952928 May 15  2021 start.elf
-rwxr-xr-x 1 root root 2228768 May 15  2021 start4.elf
-rwxr-xr-x 1 root root  793084 May 15  2021 start4cd.elf
-rwxr-xr-x 1 root root 3722504 May 15  2021 start4db.elf
-rwxr-xr-x 1 root root 2981160 May 15  2021 start4x.elf
-rwxr-xr-x 1 root root  793084 May 15  2021 start_cd.elf
-rwxr-xr-x 1 root root 4794472 May 15  2021 start_db.elf
-rwxr-xr-x 1 root root 3704712 May 15  2021 start_x.elf

overlays 내용을 날리고, 새로 컴파일 버전으로 설치했고, start.elf, *.dat, bootcode.bin, *.txt를 전에 받았던 백업에서 복사했다. 다행히 잘 된다. 두 번은 하지만, 세 번은 못 하겠다. 책이 왜 스크립트를 설명했는지 이해된다.

이 글 공유하기:

  • Tweet
발행일 2021-05-13글쓴이 이대원
카테고리 생활코딩 태그 kernel, linux, raspberry, 임베디드 리눅스

댓글 남기기응답 취소

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.

글 내비게이션

이전 글

시장경제의 적들

다음 글

4장 process 로그 확인

2025 7월
일 월 화 수 목 금 토
 12345
6789101112
13141516171819
20212223242526
2728293031  
6월    

최신 글

  • 자기 회로 정리 2025-06-22
  • common mode, differential mode 2025-05-11
  • signal conditioner, 신호 처리기 2025-05-10
  • strain gage 2025-05-09
  • 칼만 필터 2025-05-01

카테고리

  • 산업계측제어기술사
  • 삶 자국
    • 책과 영화
    • 투자
  • 생활코딩
    • LEGO
    • ROS
    • tensorflow
  • 전기기사
  • 피아노 악보

메타

  • 로그인
  • 엔트리 피드
  • 댓글 피드
  • WordPress.org

페이지

  • 소개
  • 잔여 작업 조회
    • 작업 추가
    • 작업의 사진 조회
    • 작업 수정 페이지
  • 사진
    • GPS 입력된 사진
    • 사진 조회
  • 위치
    • 하기 휴가 방문지
    • 해외 출장

태그

android bash c docker driver FSM gps java kernel LEGO linux mysql network program opcua open62541 plc programmers python raspberry reinforcementLearning ros state space system program tensorflow transfer function 경제 미국 민수 삼국지 세계사 실기 에너지 역사 유전자 일본 임베디드 리눅스 전기기사 조선 중국 채윤 코딩 테스트 통계 한국사 한국어

팔로우하세요

  • Facebook
now0930 일지
WordPress로 제작.