• QEMU模拟mini2440开发环境


    版本和环境信息如下:

    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
    
    • 1

    首先下载适配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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    此时QEMU可执行程序已经安装在 ~//workspace/mini2440_qemu/qemu/mini2440/bin 目录下了,为了方便使用,将其添加到环境变量里:

    export PATH=$HOME/workspace/mini2440_qemu/qemu/mini2440/bin:$PATH
    
    • 1

    验证一下正确安装与否:

    qemu-system-arm --version
    
    • 1

    如果输出了QEMU的版本等信息,则安装成功。

    $ qemu-system-arm --version
    QEMU PC emulator version 0.10.50, Copyright (c) 2003-2008 Fabrice Bellard
    
    • 1
    • 2

    二、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
    
    • 1

    在让Buildroot为我们生成三个镜像前,需要对其进行一些配置。Mini2440开发板的基本所需配置已经集成在Buildroot里了(众多defconfig文件中的一个),省了不少功夫。在此基础上,我们只需再进行少许配置,就可以让Buildroot开工了。

    我们选取mini2440_defconfig来生成我们的 .config 文件,再用 make menuconfig 进一步配置:

    cd mini2440-buildroot
    make mini2440_defconfig
    make menuconfig
    
    • 1
    • 2
    • 3

    一个方便的配置窗口会跟着出现,是基于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)  ---> 
    		
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在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)
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    默认是 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)  ---> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    默认是 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)  --->
    
    • 1
    • 2
    • 3

    本文中使用的是 jffs2格式的根文件系统(也是Buildroot默认的),因为之后要制作NAND镜像,所以需要配置成一个每页512字节和16字节的 ECC的NAND类型。在 Flash Type这项,改为 NAND flash with 512B Page and 16 KB erasesize 。

    这些都配置好之后,就可以请出我们最喜欢的命令了 – make :

    make -j4
    
    • 1

    让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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    如果一切顺利, 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
    
    • 1
    • 2

    编译安装

    cd flashimg
    ./autogen.sh
    ./configure
    make
    
    • 1
    • 2
    • 3
    • 4

    要生成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
    
    • 1
    • 2
    • 3

    生成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
    
    • 1
    • 2
    • 3

    最后,启动系统,我们以NAND文件为例:

    qemu-system-arm -M mini2440 -serial stdio -mtdblock nand.bin -usbdevice mouse
    
    • 1

    启动之后,还需要配置一下(其中 mini2440=3tb 是为了使屏幕分辨率成为320240,横向显示。默认是 240320,是竖着的)

    nboot kernel
    setenv bootargs root=/dev/mtdblock3 rootfstype=jffs2 console=ttySAC0,115200
    saveenv
    bootm
    
    • 1
    • 2
    • 3
    • 4

    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开发板

  • 相关阅读:
    Rust中的智能指针:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak<T>
    leetcode 93 Restore IP Addresses详解
    AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.02.10-2024.02.15
    网关gateway - 自定义实现动态路由信息存储记载
    卷起来了!熬夜学习阿里P8全彩版并发编程图册,涨薪就在眼前
    【JavaScript高级】02-深入JS执行原理:AO、VO及作用域链
    网络系统管理 - GWServer虚拟机配置
    VUE基础知识四:事件绑定及修饰符、双向绑定
    ETW的攻与防
    DSGC:双空间图对比学习
  • 原文地址:https://blog.csdn.net/zhuwade/article/details/127701861