QEMU安装(qemu5.20+linux16.04)
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命令开始编译。