- 리눅스 커널에 Xenmoai 패치를 적용한 다음 빌드하여 ARM Sabre Lite의 리눅스 커널을 변경한다.
- 본 글은 Xenomai 공식 홈페이지를 참고하여 작성하였다. 출처: https://gitlab.denx.de/Xenomai/xenomai/wikis/Start_Here
설치 환경
- ‘리눅스 커널 빌드 환경 구축’ 글을 참고하여 리눅스 커널 빌드 환경을 사전에 구축해야 한다.
- ‘리눅스 커널 빌드 - ARM Sabre Lite(Kernel.org)’ 또는 ‘리눅스 커널 빌드 - ARM Sabre Lite(NXP)’ 글을 참고하여 Sabre Lite에 리눅스가 올라가야 한다.
- 호스트: Ubuntu 18.04
- 타겟: Sabre Lite에 Linux kernel 4.14.85 Xenomai-3.0.8 ipipe(Cobalt)
Xenomai란?
- Xenomai는 리눅스에 실시간성을 지원하기 위한 개발 프레임워크로서, 리눅스 커널을 패치하여 실시간성을 지원한다.
- Xenomai는 VxWorks, pSOS 그리고 Alchemy라는 자체 RTOS API를 지원하며, 이를 사용하여 실시간 태스크를 생성할 수 있다. 에뮬레이터를 사용하여 다른 RTOS의 API를 적은 오버헤드로 모방할 수 있다.
Xenomai 형태
- Xenomai는 Mercury 형태와 Cobalt 형태의 두 개의 커널 옵션을 제공한다.
Mercury(Single kernel)
- 기존 리눅스 커널의 실시간성에 의존하는 형태로 Xenomai 라이브러리를 사용하는 형태다.
- 커널이 실시간성을 가지기 위해서는 PREEMPT-RT 패치를 적용해야한 다. 즉 실시간성은 PREEMPT-RT 패치에 의존적이다.
- Xenomai가 제공하는 RTOS API를 사용할 수 있다.
Cobalt(Dual kernel)
- 리눅스와 병행 실행되는 실시간 co-kernel를 사용하여 실시간성을 보완하는 형태다.
- Cobalt라는 작은 확장 기능이 리눅스 커널 내에 빌드되어 인터럽트, 실시간 태스크 스케줄링과 같은 시간이 매우 중요한 작업을 실행한다.
- Cobalt 코어는 기존 커널보다 우선순위가 높으며, 실시간 작업을 처리할 때 기존 리눅스 커널의 lock을 공유하지 않기에 mecury 커널 보다 더 좋은 실시간성을 제공한다.
- Xenomai가 제공하는 RTOS API를 사용해야 실시간 태스크가 생성된다.
리눅스 커널 다운로드
1
2
3
4
5
# 커널 다운로드, .xz 확장자: 뛰어난 압축률
$ wget https://kernel.org/pub/linux/kernel/v4.x/linux-4.14.85.tar.xz
# 압축 해제
$ tar -xvJf linux-4.14.85.tar.xz
Xenomai 다운로드
- Xenomai ipipe(Cobalt) 패치가 지원하는 리눅스 버전하고 일치하는 경우만 ipipe 패치 적용 가능하며, 버전이 일치하지 않는 경우 패치 오류 발생한다.
- 지원하는 ARM 리눅스 커널 4.* 버전은 하단 출처에서 확인 가능하다.
출처: https://xenomai.org/downloads/ipipe/v4.x/arm/
1
2
3
4
5
6
7
8
# Xenomai 다운로드
$ wget https://xenomai.org/downloads/xenomai/stable/xenomai-3.0.8.tar.bz2
# 압축 해제
$ tar xfvj xenomai-3.0.8.tar.bz2
# Xenomai ipipe 패치 파일 다운로드
$ wget https://xenomai.org/downloads/ipipe/v4.x/arm/ipipe-core-4.14.85-arm-6.patch
Xenomai ipipe 패치 적용
1
2
# --linux=[리눅스 코드 경로], --ipipe=[ipipe 패치 경로]
$ ./xenomai-3.0.8/scripts/prepare-kernel.sh --arch=arm --linux=/home/sdy/linux-4.14.85 --ipipe=ipipe-core-4.14.85-arm-6.patch
- 성공적으로 xenomai 패치가 적용된 경우
리눅스 커널 빌드
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
$ cd linux-4.14.85
# 컴파일 의존성 삭제(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
# 해당 디렉토리에 커널 모듈 설치
$ mkdir modules
# 커널 컴파일
$ make zImage modules dtbs -j4
# 커널 모듈 설치
$ make modules_install
리눅스 커널 부팅에 필요한 파일 정리
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.85
# 링크 파일 생성
$ ln -s boot/initrd.img-4.14.85 initrd.img
$ ln -sfv boot/vmlinuz-4.14.85 vmlinuz
# scp 전송을 위한 파일 압축
$ tar -zcvf linux-4.14.85.tar.gz ./*
# 생성된 파일 목록 확인
$ ls -al
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.85.tar.gz -C /
$ sudo update-initramfs -c -k4.14.85
$ rm /home/linux-4.14.85.tar.gz
$ sudo sync && sudo reboot
# 재부팅 후 Xenomai 적용 커널 메시지 확인
$ dmesg | grep Xenomai
Comments powered by Disqus.