[Intel AI SW 아카데미] 라즈베리파이 커널

Jimeaning·2024년 2월 15일
0

Intel AIoT

목록 보기
35/38

2024.02.15 (목)

라즈베리파이 Kernel

빌드하기

디렉토리 생성 및 이동

ubuntu@ubuntu09:~/pi_bsp$ mkdir kernel ; cd kernel
ubuntu@ubuntu09:~/pi_bsp/kernel$ ls
ubuntu@ubuntu09:~/pi_bsp/kernel$
ubuntu@ubuntu09:~/pi_bsp/kernel$ sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
ubuntu@ubuntu09:~/pi_bsp/kernel$ git clone --depth=1 -b rpi-6.1.y https://github.com/raspberrypi/linux
ubuntu@ubuntu09:~/pi_bsp/kernel$ tar cvf linux.tar linux
ubuntu@ubuntu09:~/pi_bsp/kernel$ gzip linux.tar
ubuntu@ubuntu09:~/pi_bsp/kernel$ ls -l
total 462388
drwxrwxr-x 28 ubuntu ubuntu      4096  215 09:50 linux
-rw-rw-r--  1 ubuntu ubuntu 473478558  215 09:59 linux.tar.gz
ubuntu@ubuntu09:~/pi_bsp/kernel$ cp linux.tar.gz linux.tar.gz_org

압축 풀기

ubuntu@ubuntu09:~/pi_bsp/kernel$ gzip -d linux.tar.gz

압축률이 더 높음

ubuntu@ubuntu09:~/pi_bsp/kernel$ bzip2 linux.tar

확실히 사이즈가 줄었다

ubuntu@ubuntu09:~/pi_bsp/kernel$ ls -l
total 868560
drwxrwxr-x 28 ubuntu ubuntu      4096  215 09:50 linux
-rw-rw-r--  1 ubuntu ubuntu 415911238  215 09:59 linux.tar.bz2
-rw-rw-r--  1 ubuntu ubuntu 473478558  215 10:02 linux.tar.gz_org
ubuntu@ubuntu09:~/pi_bsp/kernel$ mv linux.tar.gz_org linux.tar.gz
ubuntu@ubuntu09:~/pi_bsp/kernel$ ls -l
total 868560
drwxrwxr-x 28 ubuntu ubuntu      4096  215 09:50 linux
-rw-rw-r--  1 ubuntu ubuntu 415911238  215 09:59 linux.tar.bz2
-rw-rw-r--  1 ubuntu ubuntu 473478558  215 10:02 linux.tar.gz
  • .config 만들기
ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
  • .config 수정하는 명령어
ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  • zImage : 커널, modules: 디바이스 드라이버, dtb : 디바이스 드라이버의 정보가 담긴 파일, -j4 : 4는 코어의 개수 (디폴트는 1)
ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j4

이론

운영체제

컴퓨터 시스템의 전반적인 동작을 제어하고 조정하는 시스템 프로그램들의 집합

역할

하드웨어와 응용 프로그램 간의 인터페이스 역할을 하면서 CPU, 주기억장치, 입출력 장치 등의 컴퓨터 자원을 관리

임베디드 리눅스

공개된 리눅스 커널과 각종 응용 프로그램 소스를 임베디드 시스템에서 동작하도록 최적화하여 사용하는 운영체제

특징

  • 적은 메모리 사용
  • 느린 CPU에서 동작
  • 특정한 목적의 응용 프로그램 탑재

장점

  • GPL(GNU General Public License)를 따르는 공개 소스 소프트웨어 : 검증된 운영체제
  • 모듈 지원 : 불필요한 부분을 빼고 필요한 부분 추가가 가능해 이식성 우수
  • 유닉스와 유사한 운영체제 시스템, 독립적인 POSIX 구현
  • 다양한 플랫폼 지원
  • 멀티태스킹, 가상메모리, 공유 라이브러리, 디멘트 페이징, 메모리 관리, TCP/IP 네트워킹 등을 지원

단점

  • 개발 환경 설정이 까다롭다 (CLI이다보니..)
  • 실시간성(Real Time) 기능이 취약하다
  • 메모리와 전력 소모량이 많다
  • 리눅스의 윈도우 시스템 : 다양한 윈도우 시스템이 제공되나 덩치가 크거나 안정화 작업이 필요

커널 이미지 타겟 보드로 전송

bootfs: 커널, rootfs: 디바이스 드라이버 복사하는 용

SD 카드 빼서 PC에 연결하기

ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ df
Filesystem     1K-blocks     Used Available Use% Mounted on
udev             4023340        0   4023340   0% /dev
tmpfs             812812     3016    809796   1% /run
/dev/sda5      153188848 22517616 122816896  16% /
tmpfs            4064056        0   4064056   0% /dev/shm
tmpfs               5120        4      5116   1% /run/lock
tmpfs            4064056        0   4064056   0% /sys/fs/cgroup
/dev/loop0           128      128         0 100% /snap/bare/5
/dev/loop1         64896    64896         0 100% /snap/core20/1828
/dev/loop2         75904    75904         0 100% /snap/core22/1033
/dev/loop3        508928   508928         0 100% /snap/gnome-42-2204/141
/dev/loop8         51072    51072         0 100% /snap/snapd/18357
/dev/loop4        354688   354688         0 100% /snap/gnome-3-38-2004/119
/dev/loop6         12672    12672         0 100% /snap/snap-store/959
/dev/loop5         93952    93952         0 100% /snap/gtk-common-themes/1535
/dev/loop7         65536    65536         0 100% /snap/core20/2105
/dev/loop11        41472    41472         0 100% /snap/snapd/20671
/dev/loop9        358144   358144         0 100% /snap/gnome-3-38-2004/143
/dev/loop10        47104    47104         0 100% /snap/snap-store/638
/dev/sda1         523248        4    523244   1% /boot/efi
tmpfs             812808       24    812784   1% /run/user/1000
/dev/loop12        76032    76032         0 100% /snap/core22/1122
/dev/sdb1         522232   116302    405930  23% /media/ubuntu/bootfs
/dev/sdb2       30082132  4706984  23826856  17% /media/ubuntu/rootfs
~/pi_bsp/kernel/linux$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/media/ubuntu/rootfs modules_install

/dev/sdb2 -> /media/ubuntu/rootfs 경로가 맞는지 확인하고 INSTALL_MOD_PATH 수정해주기

확장자 ko는 커널 오브젝트라는 뜻

  • 지금 쓰고 있는 커널을 kernel7l-backup 파일에 백업 받아두기
ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ sudo cp /media/ubuntu/bootfs/kernel7l.img /media/ubuntu/bootfs/kernel7l-backup.img

sudo mv /media/ubuntu/bootfs/kernel7l.img /media/ubuntu/bootfs/kernel7l-backup.img
ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ ls -l arch/arm/boot/zImage
-rwxrwxr-x 1 ubuntu ubuntu 7458816  215 10:39 arch/arm/boot/zImage

이것이 커널 이미지이다.

ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/zImage /media/ubuntu/bootfs/kernel7l.img
ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ ls -l /media/ubuntu/bootfs/kernel7l.img
-rw-r--r-- 1 ubuntu ubuntu 7458816  215 11:37 /media/ubuntu/bootfs/kernel7l.img
ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/dts/*.dtb /media/ubuntu/bootfs/

ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /media/ubuntu/bootfs/overlays/

ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ sudo cp arch/arm/boot/dts/overlays/README /media/ubuntu/bootfs/overlays/
ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ sudo vi /media/ubuntu/bootfs/config.txt

맨 아랫줄에 추가해주기

arm_64bit=0
pi@pi09:~ $ sudo vi /boot/firmware/config.txt

들어가서 주석 처리해주기

  • 커널 버전 및 빌드 시간 확인하기
pi@pi09:~ $ uname -a
Linux pi09 6.1.77-v7l+ #1 SMP Thu Feb 15 10:39:29 KST 2024 armv7l GNU/Linux

6.1.0이었는데 77로 바뀌고 빌드한 시간으로 바꼈다.

  • 디바이스 드라이버가 제대로 올라 와 있는지 확인하기(처음이라서 해주는 과정)
pi@pi09:~ $ lsmod
Module                  Size  Used by
snd_seq_dummy          16384  0
snd_hrtimer            16384  1
snd_seq                73728  7 snd_seq_dummy
snd_seq_device         16384  1 snd_seq
rpcsec_gss_krb5        28672  0
bnep                   20480  2
brcmfmac              344064  0
brcmutil               20480  1 brcmfmac
hci_uart               40960  0
btbcm                  20480  1 hci_uart
binfmt_misc            20480  1
cfg80211              835584  1 brcmfmac
bluetooth             532480  12 hci_uart,bnep,btbcm
ecdh_generic           16384  1 bluetooth
rpivid_hevc            45056  0
ecc                    40960  1 ecdh_generic
bcm2835_codec          49152  0
rfkill                 32768  6 bluetooth,cfg80211
snd_bcm2835            24576  1
bcm2835_isp            32768  0
bcm2835_v4l2           49152  0
bcm2835_mmal_vchiq     36864  3 bcm2835_isp,bcm2835_codec,bcm2835_v4l2
v4l2_mem2mem           40960  2 rpivid_hevc,bcm2835_codec
videobuf2_dma_contig    20480  3 rpivid_hevc,bcm2835_isp,bcm2835_codec
videobuf2_vmalloc      16384  1 bcm2835_v4l2
raspberrypi_hwmon      16384  0
snd_pcm               126976  1 snd_bcm2835
videobuf2_memops       16384  2 videobuf2_dma_contig,videobuf2_vmalloc
videobuf2_v4l2         32768  5 rpivid_hevc,bcm2835_isp,bcm2835_codec,bcm2835_v4l2,v4l2_mem2mem
snd_timer              36864  3 snd_seq,snd_hrtimer,snd_pcm
raspberrypi_gpiomem    16384  0
snd                    94208  9 snd_seq,snd_timer,snd_seq_device,snd_bcm2835,snd_pcm
videobuf2_common       65536  9 rpivid_hevc,bcm2835_isp,bcm2835_codec,videobuf2_dma_contig,videobuf2_vmalloc,videobuf2_memops,bcm2835_v4l2,v4l2_mem2mem,videobuf2_v4l2
vc_sm_cma              36864  2 bcm2835_isp,bcm2835_mmal_vchiq
videodev              270336  7 rpivid_hevc,bcm2835_isp,bcm2835_codec,videobuf2_common,bcm2835_v4l2,v4l2_mem2mem,videobuf2_v4l2
mc                     57344  7 rpivid_hevc,bcm2835_isp,bcm2835_codec,videobuf2_common,videodev,v4l2_mem2mem,videobuf2_v4l2
nvmem_rmem             16384  0
uio_pdrv_genirq        16384  0
uio                    24576  1 uio_pdrv_genirq
i2c_dev                16384  0
fuse                  135168  1
drm                   548864  0
drm_panel_orientation_quirks    16384  1 drm
backlight              20480  1 drm
dm_mod                139264  0
nfsd                  516096  5
ip_tables              28672  0
x_tables               36864  1 ip_tables
ipv6                  536576  74

이렇게 뜨면 잘 올라 와 있는 것

리눅스 커널 boot logo 이미지 변경

1. 이미지 가져오기
교수님이 준비하신 이미지 중 하나를 복사해서 가져왔다

ubuntu@ubuntu09:~/pi_bsp/kernel$ cp /srv/samba/logo_image/005.jpg .
ubuntu@ubuntu09:~/pi_bsp/kernel$ eog 005.jpg

명령어를 치면 이렇게 사진이 뜬다

2. gimp 다운받기

ubuntu@ubuntu09:~/pi_bsp/kernel$ sudo apt install gimp

gimp 실행하기

ubuntu@ubuntu09:~/pi_bsp/kernel$ gimp

파일 > 열기 > 005.jpg 선택 > Keep

이미지 위에서 마우스 오른쪽 클릭하고 이미지 > 변형 > 반시계 90도로 돌리기

마우스 우클릭 > 이미지 > 이미지 비율 조정 > 사슬 끊고 800*480으로 맞춰주기
반드시 800, 480이어야 함 !

Text 넣는 건 자유로 넣기

파일 > Export As > 파일 유형 선택 > PPM 이미지

내보내기 클릭 > Ascii 선택 > 내보내기

3. 변환 툴 설치

ubuntu@ubuntu09:~/pi_bsp/kernel$ sudo apt install netpbm

4. 커널 사용 이미지 변환
ppm 800x480 이미지 준비 후 (gimp)

ubuntu@ubuntu09:~/pi_bsp/kernel$ pnmquant -fs 224 005.ppm > logo_kcci_224.ppm
ubuntu@ubuntu09:~/pi_bsp/kernel$ pnmnoraw logo_kcci_224.ppm > logo_kcci_clut224.ppm

5. 복사 및 메뉴 편집

ubuntu@ubuntu09:~/pi_bsp/kernel$ cp logo_kcci_clut224.ppm linux/drivers/video/logo/

5-1. Kconfig 수정하기

vi linux/drivers/video/logo/Kconfig

아래 코드 맨 밑(71번째 줄)에 추가하기

config LOGO_KCCI_CLUT224
	bool "kcci 224-color Linux logo"
    depends on LOGO
    default y

5-2. Makefile 수정하기

vi linux/drivers/video/logo/Makefile

16 번째 줄에 추가하기

16 obj-$(CONFIG_LOGO_KCCI_CLUT224) += logo_kcci_clut224.o

5-3. logo.c 수정하기

vi linux/drivers/video/logo/logo.c

103번 줄에 추가하기

103 #ifdef CONFIG_LOGO_KCCI_CLUT224
104 	logo = &logo_kcci_clut224;
105 #endif

5-4. linux_logo.h 수정하기

ubuntu@ubuntu09:~/pi_bsp/kernel$ vi linux/include/linux/linux_logo.h
extern const struct linux_logo logo_kcci_clut224;

6. 커널 옵션 수정하기

ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig


kcci 224-color Linux logo (NEW)만 * 남겨 놓고 저장 종료

ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j4 

7. 커널 이미지 타겟(pi) 보드로 전송

ubuntu@ubuntu09:~/pi_bsp/kernel/linux$ cp arch/arm/boot/zImage /srv/nfs/

8. 타겟 보드 터미널에서 커널이미지 sd카드로 복사 및 재부팅

pi@pi09:~ $ cd /mnt/ubuntu_nfs/
pi@pi09:/mnt/ubuntu_nfs $ sudo cp zImage /boot/firmware/kernel7l.img
pi@pi09:/mnt/ubuntu_nfs $ sync

profile
I mean

0개의 댓글