版本和环境信息如下:
PC平台: ubuntu20.04
Docker版本: 20.10.18
Docker ubuntu镜像: ubuntu14.04
qemu版本: 0.10.50 https://repo.or.cz/qemu/mini2440.git
Kernel版本: Linux 2.6.31 https://repo.or.cz/linux-2.6/mini2440.git
UBoot版本:v2012.02 https://repo.or.cz/u-boot-openmoko/mini2440.git
busybox版本: 1.22.1 https://busybox.net/downloads/busybox-1.22.1.tar.bz2
buildroot版本: 2012.05 https://github.com/WeitaoZhu/mini2440-buildroot
flashimg: https://github.com/cailiwei/flashimg
GCC版本: gcc-3.4.5-glibc-2.3.6
交叉编译工具链: arm-linux-gun-
代码阅读工具:vim+ctags+cscope
ARM9已然是15几年前的技术,为什么这里记录如何使用QEMU模拟FriendlyArm的Mini2440开发板。 主要是为LInux初学者不必购买ARM9开发板,同样也可以学习ARM9, LInux驱动与内核相关的东西。帮助初学者快速上手ARM与Linux。
本文介绍了如何编译u-boot、linux kernel,然后用qemu启动u-boot和linux kernel,达到与开发板上一样的学习效果!
由于mini2440是属于15年前的技术。对其支撑比较好的开发环境是ubuntu14.04。大家可以安装ubuntu14.04虚拟机便可以满足大家的需求。我的虚拟机是ubuntu20.04,为了更好的满足我的需求,我使用docker 安装ubuntu14.04。
本文基于的开发环境是docker Ubuntu 14.04, 需要安装 git, 如果还没有git,请安装:
sudo apt-get install git git-core
首先下载适配Mini2440的QEMU虚拟机,然后编译,安装QEMU:
cd ~
mkdir mini2440_qemu/
cd mini2440_qemu
git clone git://repo.or.cz/qemu/mini2440.git qemu
cd qemu
./configure --target-list=arm-softmmu --prefix=$HOME/workspace/mini2440_qemu/qemu/mini2440
make
make install
此时QEMU可执行程序已经安装在 ~//workspace/mini2440_qemu/qemu/mini2440/bin 目录下了,为了方便使用,将其添加到环境变量里:
export PATH=$HOME/workspace/mini2440_qemu/qemu/mini2440/bin:$PATH
验证一下正确安装与否:
qemu-system-arm --version
如果输出了QEMU的版本等信息,则安装成功。
$ qemu-system-arm --version
QEMU PC emulator version 0.10.50, Copyright (c) 2003-2008 Fabrice Bellard
一般说来,我们需要三样东西来正常启动一个嵌入式操作系统: 引导程序( bootloader),内核镜像和根文件系统镜像。那我们是不是接下来需要下载一个bootloader(比如u-boot);下载可用版本的linux内核(当然要适配mini2440);一点一点生成自己的根文件系统,再制作成jffs2, yaffs2之类的格式呢?哦,对了,还有编译这三样东西的 交叉编译工具链 Cross-compiler toolchain 要制作。这些操作没有一定的Linux功底,初学者没有详细的指导一般很难自己生成。
目前有一款超好用的开源软件buildroot,类似一个软件工程。自动帮你完成以上编译流程生成你需要的镜像文件。
接着下载Buildroot:
git clone https://github.com/WeitaoZhu/mini2440-buildroot.git
在让Buildroot为我们生成三个镜像前,需要对其进行一些配置。Mini2440开发板的基本所需配置已经集成在Buildroot里了(众多defconfig文件中的一个),省了不少功夫。在此基础上,我们只需再进行少许配置,就可以让Buildroot开工了。
我们选取mini2440_defconfig来生成我们的 .config 文件,再用 make menuconfig 进一步配置:
cd mini2440-buildroot
make mini2440_defconfig
make menuconfig
一个方便的配置窗口会跟着出现,是基于Kconfig的配置机制:
以下列出比较重要的几个编译选项,需要改动的几项:
Toolchain
Toolchain --->
Toolchain type (Buildroot toolchain) --->
*** Kernel Header Options ***
Kernel Headers (Manually specified Linux version) --->
(3.0.4) linux version
Custom kernel headers series (3.0.x) --->
在Toolchains目录里,须要选取Linux内核版本的适配的编译链版本。默认是设置为 3.3.x。后面的Kernel(内核版本)我使用的是3.3.7,所以没问题,这里不用改也可以。当然也可以使用诸如 3.0.x这样的版本,只要跟之后的Kernel版本适配就好了。
Bootloaders
Bootloaders --->
[*] U-Boot
(mini2440) U-Boot board name
U-Boot Version (Custom tarball) --->
(http://repo.or.cz/w/u-boot-openmoko/mini2440.git/snapshot/dev-mini2440-stable.tar.gz)
默认是 U-boot, 也可以选用其他版本的Bootloader。本文就用默认的U-boot。
Kernel
Kernel --->
[*] Linux Kernel
Kernel version (Custom version) --->
(3.0.4) Kernel version
() Custom kernel patches
Kernel configuration (Using a defconfig) --->
(mini2440) Defconfig name
Kernel binary format (uImage) --->
默认是 3.0.4,因为之前Toolchains目录选择的是 3.3.x版本,所以这里须要改选,比如 3.3.7版本。
Filesystem images
Filesystem images --->
[*] jffs2 root filesystem
Flash Type (NAND flash with 512B Page and 16 kB erasesize) --->
本文中使用的是 jffs2格式的根文件系统(也是Buildroot默认的),因为之后要制作NAND镜像,所以需要配置成一个每页512字节和16字节的 ECC的NAND类型。在 Flash Type这项,改为 NAND flash with 512B Page and 16 KB erasesize 。
这些都配置好之后,就可以请出我们最喜欢的命令了 – make :
make -j4
让Buildroot忙活去吧。如果中间出现错误,一般是没装必要的东西,照错误提示安装就好,然后接着 make。 视电脑速度和网速而定,我的情况是大概30分钟后 make 完成。为了节约时间大家可以直接获取已经下载好的Buildroot所需的packages。把下面对应的packages拷贝到mini2440-buildroot的dl目录下便可。
git clone git@github.com:WeitaoZhu/mini2440_qemu.git
$ tree
.
├── kernel
│ ├── linux-2.6.31.tar.xz
│ ├── linux-3.3.7.tar.xz
│ ├── mini2440-linux-2.6.tar.gz
│ └── mini2440-stable-v2.6.31.tar.gz
├── tools
│ ├── binutils-2.22.tar.bz2
│ ├── busybox-1.22.1.tar.bz2
│ ├── e2fsprogs-1.42.9.tar.gz
│ ├── expat-2.1.0.tar.gz
│ ├── fakeroot_1.18.2.orig.tar.bz2
│ ├── gcc-4.7.3.tar.bz2
│ ├── gdb-7.4.1.tar.bz2
│ ├── gmp-5.1.3.tar.xz
│ ├── kmod-16.tar.xz
│ ├── lzo-2.06.tar.gz
│ ├── lzop-1.03.tar.gz
│ ├── m4-1.4.17.tar.xz
│ ├── mpc-1.0.2.tar.gz
│ ├── mpfr-3.1.2.tar.xz
│ ├── mtd-utils-1.5.0.tar.bz2
│ ├── pkgconf-0.8.9.tar.bz2
│ ├── u-boot-2014.01.tar.bz2
│ ├── uClibc-0.9.33.2.tar.xz
│ └── zlib-1.2.8.tar.xz
└── uboot
├── dev-mini2440-stable.tar.gz
└── mini2440-uboot.tar.gz
如果一切顺利, make 结束后,在 mini2440-buildroot目录的 output/images/ 子目录下可以找到生成的三个文件:
u-boot.bin : bootloader的镜像
uImage : u-boot格式的(用mkp_w_picpath命令生成的)Linux内核镜像
rootfs.jffs2 : jffs2格式的根文件系统镜像
用一个更强大的工具flashimg来生成最终版的 nand.bin 。更方便,且不容易出错。
强大的工具 – Flashimg
flashimg是一个由网友 Fabrice Jouhaud 开发的软件,可以很快捷地生成NAND或NOR镜像文件。我们首先下载 flashimg:
cd ~
git clone https://github.com/cailiwei/flashimg
编译安装
cd flashimg
./autogen.sh
./configure
make
要生成NAND或NOR镜像文件,可以先把之前Buildroot替我们生成的三个文件 : u-boot.bin, uImage和rootfs.jffs2 拷贝到 flashimg文件夹下:
cp ~/workspace/mini2440_qemu/mini2440-buildroot/output/images/rootfs.jffs2 ~/flashimg
cp ~/workspace/mini2440_qemu/mini2440-buildroot/output/images/u-boot.bin ~/flashimg
cp ~/workspace/mini2440_qemu/mini2440-buildroot/output/images/uImage ~/flashimg
生成NAND或NOR镜像文件:
./flashimg -s 64M -t nand -f nand.bin -p uboot.part -w boot,u-boot.bin -w kernel,uImage -w root,rootfs.jffs2 -z 512
./flashimg -s 2M -t nor -f nor.bin -p uboot.part -w boot,u-boot.bin -w kernel,uImage -w root,rootfs.jffs2
最后,启动系统,我们以NAND文件为例:
qemu-system-arm -M mini2440 -serial stdio -mtdblock nand.bin -usbdevice mouse
启动之后,还需要配置一下(其中 mini2440=3tb 是为了使屏幕分辨率成为320240,横向显示。默认是 240320,是竖着的)
nboot kernel
setenv bootargs root=/dev/mtdblock3 rootfstype=jffs2 console=ttySAC0,115200
saveenv
bootm
输入Buildroot的密码,默认是: root
我们再一次看到了亲切的小企鹅。
经典参考书如下:
MINI2440 Dev Board Emulated by QEMU
QEMU模拟FriendlyArm的Mini2440开发板