版本和环境信息如下:

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

FriendlyARM_mini2440
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。

一、QEMU for MINI2440

本文基于的开发环境是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

二、buildroot(2012.05)的使用

​ 一般说来,我们需要三样东西来正常启动一个嵌入式操作系统: 引导程序( 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的配置机制:
buildroot menuconfig
以下列出比较重要的几个编译选项,需要改动的几项:

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格式的根文件系统镜像

三、基于NAND镜像启动

用一个更强大的工具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

mini2440_qemu_uboot
输入Buildroot的密码,默认是: root

我们再一次看到了亲切的小企鹅。

mini2440_qemu_kernel
经典参考书如下:

  1. Linux Device Drivers
    请添加图片描述

  2. Understanding the Linux Kernel
    请添加图片描述

  3. Linux.System.Programming
    请添加图片描述

  4. Essential.Llinux.Device.Drivers
    请添加图片描述

  5. ARM体系结构与编程(第2版)
    请添加图片描述

  6. 鸟哥的Linux私房菜-基础学习篇(第四版)
    请添加图片描述

参考文献:

MINI2440 Dev Board Emulated by QEMU
QEMU模拟FriendlyArm的Mini2440开发板

Logo

一站式 AI 云服务平台

更多推荐