Home 리눅스 커널 빌드 - ARM Sabre Lite(Kernel.org)
Post
Cancel

리눅스 커널 빌드 - ARM Sabre Lite(Kernel.org)

  • Kernel.org에서 다운받은 리눅스 커널 빌드 후 ARM Sabre Lite의 리눅스 커널 버전을 변경한다.
  • 본 글은 여러 블로그를 참고하여 작성하였다.
  • 만약 리눅스 커널에 PREEMPT_RT 패치를 적용하고 싶다면, PREEMPT_RT 패치가 해당 리눅스 커널 버전을 지원해야한다. 리눅스 커널 버전은 https://kernel.org/pub/linux/kernel에서 확인 가능하고, PREEMPT_RT 패치 가능한 리눅스 커널 버전은 http://cdn.kernel.org/pub/linux/kernel/projects/rt에서 확인 가능하다.

설치 환경

  • ‘리눅스 커널 빌드 환경 구축’ 글을 참고하여 리눅스 커널 빌드 환경을 사전에 구축해야 한다.
  • ‘리눅스 커널 포팅 - ARM Sabre Lite’ 글을 참고하여 Sabre Lite에 리눅스를 설치해야 한다.
  • 호스트: Ubuntu 18.04(x86-64)
  • 타겟: Sabre Lite에 커널 버전을 Linux Kernel 4.14.87(해당 리눅스 버전의 PREEMPT_RT 패치 적용)로 변경

리눅스 커널 다운로드

1
2
3
4
5
# 커널 다운로드, .xz 확장자 : 뛰어난 압축률
$ wget https://kernel.org/pub/linux/kernel/v4.x/linux-4.14.87.tar.xz

# 압축 해제
$ tar -xvJf linux-4.14.87.tar.xz

PREEMPT_RT 패치 다운로드 및 적용

  • PREEMPT_RT 패치는 리눅스의 실시간성을 개선하는 패치로서, 패치 적용 여부는 선택사항이다.
1
2
3
4
5
6
$ wget http://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/patch-4.14.87-rt49.patch.xz

# PREEMPT_RT 패치 진행
$ cd linux-4.14.87
$ xzcat ../patch-4.14.87-rt49.patch.xz | patch -p1
$ cd ..

PREEMPT_RT 패치가 적용된 리눅스 커널 빌드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 디렉토리명 변경
$ mv linux-4.14.87 linux-4.14.87-rt49
$ cd linux-4.14.87-rt49

# 컴파일 의존성 삭제(mrproper + remove editor backup and patch files)
$ sudo make distclean

# 환경 변수 선언
$ export KERNEL_SRC=PWD
$ export ARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabihf-
$ export INSTALL_MOD_PATH=KERNEL_SRC/modules

# Sabre Lite 컴파일 옵션 적용
$ make imx_v6_v7_defconfig

# 커널 컴파일 설정으로 하단과 같이 수정한다. 미리 적용된 설정이 존재한다.
$ make menuconfig

# 커널 dmesg 저장 버퍼 크기 변경
$ CONFIG_LOG_BUF_SHIFT = 19

# PREEMPT_RT 적용
$ CONFIG_PREEMPT_RT_FULL = y

# 고상도의 타이머 적용
$ CONFIG_HIGH_RES_TIMERS = y

# PREEMPT_RT의 실시간성을 떨어뜨리는 Preempt, Object 디버그 옵션 해제
$ CONFIG_DEBUG_PREEMPT = n
$ CONFIG_DEBUG_OBJECTS = n

# PREEMPT-RT의 실시간성을 떨어뜨리는 Lock Debugging(spinlocks, mutexes, etc. . . ) 디버그 옵션 해제
$ CONFIG_PROVE_LOCKING = n
$ CONFIG_DEBUG_LOCK_ALLOC = n
$ CONFIG_DEBUG_SPINLOCK = n
$ CONFIG_DEBUG_MUTEXES  = n
$ CONFIG_DEBUG_RT_MUTEXES = n

출처: https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/preemptrt_setup

1
2
3
# 모듈 삽입시 insmod: can't insert '.ko': invalid module 발생하는 오류는 커널 버전과 모듈 버전이 일치하지 않는 경우
# 해당 문제를 해결하기 위해 해당 옵션을 해제
$ CONFIG_LOCALVERSION_AUTO = n

출처: https://zinlee.tistory.com/entry/kernel-insmod-cant-insert-ko-invalid-module-format-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95%EC%9B%90%EC%9D%B8-%EC%9D%B4%EC%9C%A0

1
2
3
4
5
6
7
8
# 커널 설정을 종료한 다음 모듈 디렉토리 생성
$ mkdir modules

# 커널 모듈 빌드
$ make zImage modules dtbs -j4

# 커널 모듈 설치
$ make modules_install

출처: https://www.linuxquestions.org/questions/linux-general-1/vmlinuz-and-initrd-img-symbolic-links-4175609938/
https://m.blog.naver.com/PostView.nhn?blogId=lovespreads&logNo=221205221338&proxyReferer=https%3A%2F%2Fwww.google.com%2F
https://boundarydevices.com/customizing-ubuntudebian-kernels/
https://kldp.org/node/95521
https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/preemptrt_setup

리눅스 커널 부팅에 필요한 파일 정리

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ cd modules
$ mkdir boot

# imx6 관련 rdts, dtb 파일 복사
$ cp ../arch/arm/boot/dts/imx6* ./boot

# zImage 파일 이동
# zImage는 vmlinuz과 같은 파일
$ cp ../arch/arm/boot/zImage ./boot/vmlinuz-4.14.87-rt49

# 링크 파일 생성
$ ln -s boot/initrd.img-4.14.87-rt49 initrd.img
$ ln -sfv boot/vmlinuz-4.14.87-rt49 vmlinuz

# scp 전송을 위한 파일 압축
$ tar -zcvf  linux-4.14.87-rt49.tar.gz ./*

# 생성된 파일 목록 확인
$ ls -al

image

1
2
3
# scp를 사용하여 타겟으로 파일 전송
# ex) sudo scp -r /home/sdy/linux-4.14.87-rt49/modules/linux-4.14.87-rt49.tar.gz ubuntu@168.188.127.63:/home
$ sudo scp -r /home/<username>/linux-4.14.87-rt49/modules/linux-4.14.87-rt49.tar.gz ubuntu@<ip>:/home

타겟에 리눅스 커널 설치

1
2
3
4
5
6
7
8
9
10
11
12
# 처음 리눅스 커널 변경할 때 한 번만 실행
$ sudo apt-get purge -y linux-boundary-* linux-header-* linux-image-* qcacld-module

$ sudo tar --numeric-owner -xf /home/linux-4.14.87-rt49.tar.gz -C /
$ sudo update-initramfs -c -k4.14.87-rt49

$ rm /home/linux-4.14.87-rt49.tar.gz

$ sudo sync && sudo reboot

# 변경된 커널 버전 확인
$ uname -a

image

rt-tests(real-time task latency 측정)

  • 리눅스의 실시간성을 측정하는 테스트다.
  • PREEMPT_RT 패치를 적용하지 않은 경우보다 최대 latency와 평균 latency가 개선된 것을 확인할 수 있다.
1
2
3
4
5
6
$ git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
$ cd rt-tests
$ git checkout stable/devel/v1.0.1
$ make -j4
$ sudo make install
$ sudo ./cyclictest -l100000 -m -n -a0 -t1 -p99 -i400 -h400

출처: https://m.blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=221170259817&proxyReferer=https%3A%2F%2Fwww.google.com%2F
https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git

This post is licensed under CC BY 4.0 by the author.

리눅스 커널 빌드 - ARM Sabre Lite(NXP)

리눅스 커널에 시스템 호출 구현 - ARM Sabre Lite(Kernel.org)

Comments powered by Disqus.

Trending Tags