QEMU安装(qemu5.20+linux18.04)

发布时间 2023-07-07 00:21:08作者: 种玫瑰的小刘

 

1. QEMU下载与安装

wget https://download.qemu.org/qemu-5.2.0.tar.xz #下载qemu,版本可选
cd qemu-5.2.0/ #进入目录
tar xvJf qemu-5.2.0.tar.xz#解压文件
 ./configure
 make #编译
 make install 

 报错1:

解决:安装ninja:apt-get install ninja-build

报错2:

解决:安装gcc:sudo apt-get install gcc

报错3:

解决:sudo apt-get install pkg-config

报错4:

 解决:sudo apt-get install libglib2.0-dev

报错5:

解决: 

sudo apt-get install libmount-dev #还是不行
sudo apt-get install libpixman-1-dev #ok了

上面步骤编译成功后,得到:qemu-system-arm和qemu-system-aarch64。

前者用来模拟 32 位的 Arm cpu,比如 Arm9 /Arm11、 Cortex-A7/A9/A15 。

后者用来模拟 64 位的 Arm cpu,比如 Arm Cortex A53,A57。

可以用qemu-system-arm -machine help命令来查看所支持的开发板:

这里我们使用 vexpress-a9 这款开发板。vexpress-a9 是 Arm 公司自己设计的一款 4 核 Cortex-A9 开发板,U-Boot、Linux Kernel 和 QEMU 对这款开发板都做了完整的支持。

 2. 编译U-Boot

2.1. 下载U-Boot:

git clone https://gitlab.denx.de/u-boot/u-boot.git

下载完后,可以看到 configs 目录下有针对这款开发板的配置文件ls configs/vexpress_ca9x4_defconfig

make vexpress_ca9x4_defconfig

make CROSS_COMPILE=arm-linux-gnueabihf- all

报错:没有arm-linux-gnueabihf

解决:sudo apt install gcc-arm-linux-gnueabihf

报错:

解决: sudo apt-get install libssl-dev

最终编译生成 elf 格式的可执行文件 u-boot 和纯二进制文件u-boot.bin,其中 QEMU 可以启动的为 elf 格式的可执行文件 u-boot。

2.2.编译 Buildroot:

启动一个 Arm Linux 系统,一般都要必须的三件套:Bootloader、Linux Kernel、rootfs(根文件系统)。

下载git clone git://git.buildroot.net/buildroot

Buildroot 代码仓库默认只包含一个编译框架,真正构建 rootfs需要的各种代码包是根据你的配置选项,在编译的时候才开始下载的。

配置:Buildroot 提供了和 U-Boot、Linux Kernel 等主流开源项目一样的 menucoinfig 配置接口,可以通过make help来查询所支持的各种命令:

开发者只要执行make menuconfig命令,就能通过这个熟悉的界面去选择自己需要的各种组件,定制自己的 rootfs:

报错:

解决:sudo apt-get install libncurses5-dev

首先要配置的是 Target options 选项:

 

小端模式,选 little endian 。

这款开发板的 CPU 是 cortex-A9。我们将使用 Linaro GCC 进行编译,Linaro 的 GCC 默认都打开了 hardfloat 的支持,所以选上 VFP extension 和 EABIhf

Build options选项:

第一个选项是设置最后生成的配置文件的保存路径,buildroot 可以针对不同的板子生成特定的 defconfig 文件,默认保存在 configs 目录下。

修改各项配置后,执行make savedefconfig命令,就会生成新的 defconfig 文件:

下次编译之前,可以直接执行make ca9_mini_defconfig命令来加载已有的配置。

第二个选项设置 buildroot 下载的各种第三方包的存储路径,默认在 dl 目录下:

因为这里使用电脑上自己安装的 toolchain,所以我们这里选 External toolchain 和 Custom toolchain

然后在 Toolchain path 中填写 toolchian 在电脑上安装的位置,如果不知道具体位置,用which命令查看:

另外要注意 Toolchain prefix 这个前缀别写错。

设置 toolchain 的版本和用来编译这个 toolchain 的内核头文件的内核的版本:

Toolchain 的版本我们根据 Toolchain 的名字或者通过arm-linux-gnueabihf-gcc  -v 命令就可以查到。

编译 Toolchain 的内核头文件对应的内核的版本是什么呢?

我们在这个选项上敲 h 键,会看到下面的帮助选项:

原来这个版本可以在 toolchain 里面的 version.h 这个文件查到:

打开这个文件:

./arm-linux-gnueabihf/include/linux/version.h

查询方式如下:

vim ./arm-linux-gnueabihf/include/linux/version.h

266002对应的十六进制为 0x40f12,右移 16 位,得到的版本号为 4。这就是上面 4.0.x 的由来。

vexpress_a9 内核启动的控制台的名字叫做 ttyAMA0,所以我们还要在 :System configuration->Run a getty(login prompt) after boot选项中配置 TTY Port 为 ttyAMA0。否则文件系统挂载后无法进入控制台。

我们把编译的 rootfs 以 initramfs 的形式和 Linux Kernel 链接在一起,为了让根文件系统镜像尽量小,可以对文件系统采用 lz4 压缩,所以 Filesystem images 还要做如下配置:

到这里一个最精简的 buildroot 已经配置完成。

如果还需要其他的命令或者工具,可以在 Target Packages 下面开启:

如果你需要的某个模块,buildroot 里面没有,还可以自己添加:

比如加入上面这个补丁,就可以让 buildroot 在编译的时候自动下载 https://github.com/rockchip-linux/io.git 并编译。

退出执行make命令开始编译。