zoukankan      html  css  js  c++  java
  • CentOS 7 利用qemu模拟ARM vexpress A9开发板

    听说qemu用于仿真arm很不错,今日就来试了一把。由于刚刚开始,了解的并不多。本文仅仅记录Qemu装载Linux kernel和busybox根文件系统的过程。后续将会深入了解仿真的其他内容。

    先上成果图:

    1. 安装QEMU

    QEMU是一套由Fabrice Bellard所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。Bochs,PearPC等与其类似,但不具备其许多特性,比如高速度及跨平台的特性,通过KQMEU这个开源的加速器,QEMU能模拟至接近真实电脑的速度。
    之前已有记录CentOS 7编译安装qemu的方法:
    我的版本是2.10.0

    2. 编译内核

    解压下载的kernel文件,进入解压后的文件夹,运行下面的指令编译。

    生成vexpress开发板子的config文件:
    make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm vexpress_defconfig

    编译:

    make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

    执行启动脚本

       #! /bin/bash                                                                                                                
        
       qemu-system-arm 
               -M vexpress-a9 
               -m 512M 
               -kernel /home/walt740/kernel/linux-4.13.5/arch/arm/boot/zImage 
               -dtb /home/walt740/kernel/linux-4.13.5/arch/arm/boot/dts/vexpress-v2p-ca9.dtb 
               -nographic 
               -append "console=ttyAMA0"

    3. 制作根文件系统

    到这里是否大功告成了呢? 其实在上面的测试中,你会发现内核报panic,因为内核找不到根文件系统,无法启init进程。 

    根文件系统要考虑两个方面:

    1. 根文件系统的内容

    在嵌入式领域,几乎所有的东西,都是mini版本,根文件系统也不例外。

    本文制本的根文件系统 = busybox(包含基础的Linux命令)  + 运行库 + 几个字符设备

    2. 根文件系统放在哪里

    其实依赖于每个开发板支持的存储设备,可以放到Nor Flash上,也可以放到SD卡,甚至外部磁盘上。最关键的一点是你要清楚知道开发板有什么存储设备。

        本文直接使用SD卡做为存储空间,文件格式为ext3格式

    下载、编译和安装busybox

    wget http://www.busybox.net/downloads/busybox-1.27.2.tar.bz2
    
    make defconfig

    make menuconfig
    make CROSS_COMPILE=arm-none-linux-gnueabi- #重要 make install

    安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。

    形成根目录结构

    先在CentOS主机环境下,形成目录结构,里面存放的文件和目录与单板上运行所需要的目录结构完全一样,然后再打包成镜像(在开发板看来就是SD卡),这个临时的目录结构称为根目录。
    #!/bin/bash
    
    sudo rm -rf rootfs
    sudo rm -rf tmpfs
    sudo rm -f a9rootfs.ext3
    
    sudo mkdir rootfs
    sudo cp _install/*  rootfs/ -raf
    
    mkdir -p rootfs/{lib,proc,sys,tmp,root,var,mnt}
    
    sudo cp -arf /usr/local/gcc-arm-none-eabi/arm-none-linux-gnueabi/lib rootfs/
    
    sudo cp etc rootfs/ -arf sudo rm rootfs/lib/*.a sudo mkdir -p rootfs/dev/ sudo mknod rootfs/dev/tty1 c 4 1 sudo mknod rootfs/dev/tty2 c 4 2pro sudo mknod rootfs/dev/tty3 c 4 3 sudo mknod rootfs/dev/tty4 c 4 4 sudo mknod rootfs/dev/console c 5 1 sudo mknod rootfs/dev/null c 1 3 sudo dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32 sudo mkfs.ext3 a9rootfs.ext3 sudo mkdir -p tmpfs sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop sudo cp -r rootfs/* tmpfs/ sudo umount tmpfs

    其中,etc下是启动配置文件,可以的到这里下载:

    4. 系统启动运行

    完成上述所有步骤之后,就可以启动qemu来模拟vexpress开发板了,命令参数如下:
    qemu-system-arm -M vexpress-a9 -m 512M 
    -kernel linux-kernel/linux-4.13/arch/arm/boot/zImage 
    -dtb linux-kernel/linux-4.13/arch/arm/boot/dts/vexpress-v2p-ca9.dtb 
    -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" 
    -sd a9rootfs.ext3

     

     

    从内核启动打印。到命令行提示符出现,激动人心的时刻出现了……

    如果内核报错:

    [    1.965000] Failed to execute /linuxrc (error -8).  Attempting defaults...
    [    1.990000] request_module: runaway loop modprobe binfmt-464c
    [    2.000000] Starting init: /sbin/init exists but couldn't execute it (error -8)
    [    2.020000] request_module: runaway loop modprobe binfmt-464c
    [    2.030000] Starting init: /bin/sh exists but couldn't execute it (error -8)
    [    2.040000] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
    [    1.955000] request_module: runaway loop modprobe binfmt-464c
    //该错误是由于没有配置交叉编译工具  
    配置busybox时,在配置中发现busybox setting->build options->
    在cross compile prefix中写入arm-none-linux-gnueabi-

     

    这个错误可在编译阶段排除  make CROSS_COMPILE=arm-none-linux-gnueabi- #重要

    5. qemu 退出方法

    此时先按CTRL+A组合键并且放手后再按X键退出QEMU。

    ----------------------------------------------------------------------------

    搭建的过程看似简单,可也遇到了不少麻烦,很多都是通过百度/bing解决的。

     

    参考:

    从零使用qemu模拟器搭建arm运行环境

    用Qemu模拟vexpress-a9 (二) --- 创建根文件系统

    qemu 退出方法

     Kernel panic - not syncing: No working init found.

    用Qemu模拟vexpress-a9(一) --- 搭建Linux kernel调试环境

     
  • 相关阅读:
    Python编写AWS Version 4 signing (AWS4-HMAC-SHA256) for execute-api
    四种方法解决scrollview嵌套listview,listview高度确定问题
    ActionBarActivity详解
    Deepin 15.3 下罗技蓝牙键盘连接
    Flink Program Guide (10) -- Savepoints (DataStream API编程指导 -- For Java)
    Flink Program Guide (9) -- StateBackend : Fault Tolerance(Basic API Concepts -- For Java)
    Flink Program Guide (8) -- Working with State :Fault Tolerance(DataStream API编程指导 -- For Java)
    Flink Program Guide (7) -- 容错 Fault Tolerance(DataStream API编程指导 -- For Java)
    Flink Program Guide (6) -- 窗口 (DataStream API编程指导 -- For Java)
    Flink Program Guide (5) -- 预定义的Timestamp Extractor / Watermark Emitter (DataStream API编程指导 -- For Java)
  • 原文地址:https://www.cnblogs.com/BinBinStory/p/7633296.html
Copyright © 2011-2022 走看看