제어 보드

QEMU로 임베디드 Linux 시스템 에뮬레이션

QEMU로 임베디드 Linux 시스템 에뮬레이션

 

1. 소개

임베디드 소프트웨어 개발은 ​​개발 보드, 외부 모듈 장치 등과 같은 임베디드 하드웨어 장치에 의존하지만 디버깅 작업이 주변 장치와 관련이 없는 경우 하드웨어 구매 없이 QEMU를 사용하여 커널 디버깅만 시뮬레이션할 수 있습니다.

Linux 및 Windows 호스트와 에뮬레이트된 PowerPC, ARM, MIPS 및 SPARC 대상에서 사용할 수 있습니다. QEMU는 호스트와 대상 프로세서 사이에 최소 변환 계층을 제공하는 접근 방식을 취합니다. 호스트 프로세서는 에뮬레이터를 실행하는 프로세서이고 대상 프로세서는 에뮬레이트되는 프로세서입니다.

다음은 QEMU 개발 환경을 설정하는 과정에 대한 자세한 소개입니다.

 

2. 환경

2.1 사용 환경

* 우분투-18.04.1

또는:

* PC: Windows10

* 가상 머신: VirtualBox-5.18

* 가상 OS: Ubuntu-18.04.1

* 시뮬레이션 개발 보드: vexpres

2.2 환경 설정 시 사용하는 도구

* 큐뮤-4.2.0

* linux-4.14.172(리눅스 커널)

* 유-부트-2017.05

* 바쁜 상자-1.31.1

* 팔-리눅스-gnueabi-gcc

모든 관련 파일을 /home/joe/qemu에 넣습니다.

3. 크로스 컴파일 도구 설치

# sudo apt install gcc-arm-linux-gnueabi

 

설치가 성공했는지 확인

$ arm-linux-gnueabi-gcc -v

내장 사양을 사용합니다.

COLLECT_GCC=arm-linux-gnueabi-gcc

COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/arm-linux-gnueabi/7/lto-wrapper

대상: arm-linux-gnueabi

구성: ../src/configure -v –with-pkgversion='Ubuntu/Linaro 7.5.0-3ubuntu1~18.04'–with-bugurl=file:///usr

스레드 모델: posix

gcc 버전 7.5.0(Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)

 

4. Linux 커널 구성 및 컴파일

4.1 리눅스 커널 다운로드

www.kernel.org에서 필요한 커널 버전을 다운로드합니다.

여기에서 비교적 최신의 장기 지원 커널 버전 linux-4.4.157을 다운로드합니다.

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.157.tar.xz  /qemu 디렉토리로

4.2 리눅스 커널 압축 풀기

# 타르 xvJf 리눅스-4.4.157.tar.xz

4.3 리눅스 커널 컴파일

// 커널 소스 파일 디렉토리 입력

# cd 리눅스-4.4.157

CROSS_COMPILE=arm-linux-gnueabi-ARCH=arm vexpress_defconfig 만들기

CROSS_COMPILE=arm-linux-gnueabi-ARCH=arm menuconfig 만들기

menuconfig를 실행할 때 ncurses 패키지가 누락된 것으로 표시되면 다음 명령을 실행하여 설치하십시오)

$ sudo apt-get 설치 libncurses5-dev

메뉴 구성을 입력하고 다음 설정을 지정합니다.

크로스 툴체인으로 컴파일

컴파일 성공 후 디렉토리 아래에 커널 이미지 파일 생성

arch/arm/boot, zImage 및 dtb를 별도의 폴더에 복사하여 편리하게 사용할 수 있습니다.

 

5. QEMU 도구 설치

5.1 QEMU 설치

* wget https://download.qemu.org/qemu-4.2.0.tar.xz

* tar xvJf qemu-4.2.0.tar.xz

* CD qemu-4.2.0

5.2 QEMU를 구성하기 전에 종속 패키지 설치

# 적절한 설치 zlib1g-dev
# apt 설치 libglib2.0-0 libglib2.0-dev
# apt 설치 libsdl1.2-dev
# apt 설치 libpixman-1-dev libfdt-dev

컴파일 후 파일이 지저분해지는 것을 방지하기 위해 builder 디렉토리를 컴파일의 중간 대상 경로로 생성합니다.

QEMU를 구성, 컴파일 및 설치합니다.

5.3 암 아키텍처 아래의 모든 보드를 지원하도록 QEMU 구성

# ../configure –target-list=arm-softmmu –audio-drv-list=

다음 프롬프트가 나타날 때 pixman이 누락된 경우,

sudo apt-get install libpixman-1-dev를 사용하여 설치합니다.

5.4 QEMU 버전 보기

5.5 QEMU에서 지원하는 개발 보드 보기

5.6 QEMU 실행

# qemu-system-arm -M vexpress-a9 -m 512M -kernel ./zImage -dtb ./vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

또는:

$pwd

/홈/조/퀘무

# qemu-system-arm -M vexpress-a9 -m 512M -kernel linux-.4.157/arch/arm/boot/zImage -dtb linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9. dtb -nographic -추가 "콘솔=ttyAMA0"

더 나은 테스트 및 qemu 시작을 위해 시작 스크립트 start.sh를 만들고 스크립트에 chmod +x start.sh를 실행할 수 있는 권한을 부여할 수 있습니다.

 

#! / bin / bash

 

qemu-시스템-암 \

-M vexpress-a9 \

-m 512M \

-커널 /home/joe/jemu/linux-4.4.157/arch/arm/boot/zImage \

-dtb /home/joe/jemu/linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \

-노그래픽 \

- "콘솔=ttyAMA0" 추가

 

6. 루트 파일 시스템 만들기

busybox를 사용하여 간단한 루트 파일 시스템을 만드십시오.

6.1 busybox 도구 다운로드

https://busybox.net/downloads/에서 busybox를 다운로드하십시오.

# wget https://busybox.net/downloads/busybox-1.31.1.tar.bz2

# tar xjvf busybox-1.31.1.tar.bz2

# CD 바쁜 상자-1.31.1

# defconfig를 만든다

# CROSS_COMPILE=arm-linux-gnueabi-를 만듭니다.

# 설치 CROSS_COMPILE=arm-linux-gnueabi-

설치가 성공했음을 나타내는 다음 정보가 프롬프트됩니다.

설치가 완료된 후 생성된 대상 파일은 기본적으로 ./_install 디렉토리로 설정됩니다.

 

6.2 루트 파일 시스템 생성

6.2.1 busybox 컴파일 및 설치

# mkdir 루트fs

# sudo cp -r _install/* rootfs/

6.2.2 glibc 라이브러리 추가, 루트 파일 시스템에 로더 및 동적 라이브러리 추가

# sudo cp -r _install/* rootfs/

# sudo cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib/

6.2.3 4개의 tty 터미널 장치 생성(c는 문자 장치, 4는 주 장치 번호, 1~4는 각각 보조 장치 번호)

 

6.3 SD 카드 파일 시스템 이미지 만들기

6.3.1 빈 SD 카드 이미지 생성

# dd if=/dev/zero of=rootfs.ext3 bs=1M 카운트=32

6.3.2 SD 카드를 exts 파일 시스템으로 포맷

# mkfs.ext3 루트fs.ext3

6.3.3 SD 카드에 rootfs 굽기

# sudo 마운트 -t ext3 rootfs.ext3 /mnt -o 루프

# sudo cp -rf rootfs/* /mnt/

# sudo umount /mnt

 

7. 확인

7.1 큐뮤 시작

다음 명령을 실행하여 테스트하고 컴파일된 커널이 성공적으로 실행할 수 있는지 확인합니다.

# sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel ~/qemu/zImage –dtb ~/qemu/vexpress-v2p-ca9.dtb -nographic -append “console=ttyAMA0”

또는 스크립트 사용:

 

위의 테스트에서 커널은 패닉을 보고하여 루트 파일 시스템이 부족함을 나타냅니다.

위의 문제는 x86 환경에서 생성된 비지박스 툴 때문입니다.

우리는 busybox를 설치할 때 make install을 사용했으므로 다음을 사용해야 합니다.

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-install

 

컴파일 도구는 arm 플랫폼에서 사용하는 busybox 도구를 생성합니다.

# 파일 rootfs/bin/busybox

rootfs/bin/busybox: ELF 32비트 LSB 실행, ARM, EABI5 버전 1(SYSV), 동적으로 링크됨, 인터프리터 /lib/ld-, GNU/Linux 3.2.0용, BuildID[sha1]=cbcd33b8d6c946cb19408a5e8e714de554, strippedf87

 

7.2 다시 확인

이제 Qemu는 Linux 커널을 시작하고 파일 시스템을 성공적으로 마운트했으며 직렬 터미널을 통해 간단한 기능으로 시스템과 상호 작용할 수 있습니다. 인쇄 과정에서 /etc/init.d/rcS를 실행할 수 없는 문제는 /etc/init.d/rcS 파일만 추가하면 됩니다. 파일의 내용은 프롬프트 문일 수 있습니다.

 

7.3 QEMU 종료

qemu를 종료하는 두 가지 방법

* 다른 터미널 입력에서: 모든 qemu-system-arm 종료

* Qemu 입력: Ctrl+ A; NS

QEMU: 종료됨

 

8. u-boot를 통해 Linux 커널 시작

임베디드 시스템에는 일반적으로 u-boot, kernel, rootfs 및 appfs가 포함됩니다. ARM 개발 보드에서 이러한 부품의 위치 관계는 아래 그림과 같습니다.

 

부트로더 부트 매개변수 핵심 루트프 앱프

 

Rootfs는 보드 또는 PC에서 실행할 수 있습니다.

 

8.1 U 부트 준비

8.1.1 u-boot 다운로드

http://ftp.denx.de/pub/u-boot/, 우리는 u-boot-2021.01.tar.bz2를 사용합니다.

# tar -jxvf u-boot-2018.09.tar.bz2

8.1.2 컴파일 u-boot

# vim 메이크파일

CROSS_COMPILE = arm-linux-gnueabi-

# vim config.mk

아치 = 팔

# vexpress_ca9x4_defconfig를 생성, 오류

필요 : sudo apt install 들소

sudo apt install 플렉스

then: # -j4 오류를 만듭니다.

필요: export CROSS_COMPILE=arm-linux-gnueabi-

내보내기 ARCH=암

다시: # vexpress_ca9x4_defconfig를 만듭니다.

# make -j4

 

 8.1.3 테스트, u-boot 시작

$ sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot-2021.01/u-boot –nographic

 

8.2 커널 구성 컴파일

u-boot를 사용하여 커널 이미지를 부팅합니다.

커널을 uImage 형식으로 컴파일해야 합니다.

메모리에서 uImage의 로드 주소를 지정해야 합니다.

커널을 컴파일할 때 지정: make LOADADDR=? u이미지 -j4

 

# cd /home/joe/qemu/linux-4.4.157

# LOADADDR=0x60003000 uImage -j4로 만듭니다.

 

u-boot 컴파일이 완료되면 도구 폴더 아래에 mkimage 파일이 생성되며 이 파일을 크로스 컴파일러 디렉터리 아래의 bin 폴더에 복사합니다.

$ cd qemu/linux-4.4.157

오류:

$ sudo apt install u-boot-tools

uImage 가져오기

9. QEMU 네트워크 기능 설정

u-boot 시 Qemu 가상 머신이 시작되면 uImage를 메모리에 로드해야 하며 uImage는 TFTP 서버를 통해 메모리의 지정된 주소로 다운로드할 수 있습니다.

9.1 호스트 커널이 tun/tap 모듈을 지원하는지 확인

// 브리지된 네트워크가 의존하는 두 가지 도구를 설치합니다.

# sudo apt install uml 유틸리티 브리지 유틸리티

tun 장치 파일 생성: /dev/net/tun(일반적으로 자동 생성됨)

/etc/network/interfaces 수정(네트워크 구성, 적용하려면 다시 시작)

# sudo vim /etc/network/interfaces

auto loiface lo inet loopbackauto enp0s3 // 가상 네트워크 이름 cardauto br0iface br0 inet dhcpbridge_ports enp0s3

 

절대 재부팅하지 마십시오

# 재부팅

그런 다음 Qemu의 네트워크 환경을 확인하십시오.

가상 네트워크 포트 br0은 Qemu 가상 머신과 Linux 호스트 간의 통신을 위한 네트워크 포트입니다.

 

10. TFTP 서버 설치

Qemu 시뮬레이션 개발 보드용 uImage를 시작할 때 uImage를 메모리에 다운로드하기 위한 TFTP 서버 생성

 

10.1 tftp 도구 설치

 

$ apt-get 설치 tftp-hpa tftpd-hpa xinetd

 

10.2 구성 파일 수정 및 TFTP 서버 디렉토리 설정

# sudo vim /etc/default/tftpd-hpa

......

TFTP_DIRECTORY=”/홈/조/tftpboot”

......

10.3 Linux 호스트에 tftp 디렉토리 생성

# mkdir /home/joe/tftpboot

# chmod 777 /홈/조/tftpboot

 

10.4 tftp 서비스 다시 시작

# sudo /etc/init.d/tftpd-hpa 재시작

 

10.5 u-boot에서 커널 시작 매개변수 설정

uImage 및 cexpress-v2p-ca9.dtb를 tftpboot에 복사

Qemu를 시작하여 확인

 

$ sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot-2021.01/u-boot -nographic -net nic,vlan=0 -net 탭, vlan=0,ifname=tap0 -sd rootfs. 내선3

 

이제 rootfs 디렉토리는 미러 파일로 만들 수 있는 간단한 루트 파일 시스템이며 미러 파일을 개발 보드에 굽거나 Linux 커널을 Qemu에서 u-boot로 시작하고 마운트할 수 있습니다. 미러 파일. NFS 네트워크 파일 시스템을 통해 부팅하도록 설정할 수도 있습니다.

 

11. NFS 파일 시스템 마운트

11.1 NFS 서비스 설치 및 구성

11.1.1 설치

$ sudo apt install nfs-커널-서버

 

11.1.2 구성

$ sudo mkdir /home/joe/qemu/rootfs

$ sudo chown 아무도:nogroup /home/joe/qemu/rootfs

$ sudo chmod 777 /home/joe/qemu/rootfs

$ sudo nano /etc/exports

추가: /home/joe/qemu/rootfs *(rw,sync,no_root_squash)

 

nfs 서버를 다시 시작하십시오.

$ sudo /etc/init.d/nfs-kernel-server 재시작

또는: $systemctl nfs-kernel-server 재시작

 

NFS 공유 디렉토리 생성 여부 확인

$ sudo showmount -e

NFS 네트워크 파일 시스템을 사용할 때 Linux 호스트는 시스템 방화벽을 닫아야 합니다. 그렇지 않으면 시스템이 실행될 때 이상이 발생합니다.

 

결론

이 블로그의 도움으로 QEMU에 대해 더 많이 알게 되기를 바랍니다. 위에서 설명한 모든 기술은 우리 프로그램에 대한 다양한 제출에 사용되었습니다. QEMU로 에뮬레이트하는 고정된 단일 방법은 없습니다. 다양한 기술을 탐색하고 자신에게 적합한 방법을 확인하십시오. 지식에 익숙해지면 예상치 못한 방식으로 도움이 될 수 있다는 사실에 놀랄 것입니다.

문의하기