一、背景

1、当你需要基于arm + linux框架开发需求(如驱动,应用程序,调试等)时,但是没有相应的物理开发环境,只有一台装了虚拟机linux系统的X86电脑。如果是这种情况,可以继续往下看。

2、需要linux系统上安装虚拟机qemu,在qemu上运行arm环境。

3、一套完整的arm + linux启动流程,主要包括u-boot,kernel和rootfs这三元组。其中在qemu中,可以跳过u-boot来启动内核,挂载文件系统。

基于以上几个组成部分,完成安装。

二、安装

1、准备工作,先运行以下命令行,否者会出现

sudo apt-get update

无法定位软件包问题。

2、安装交叉编译工具链,可以通过arm-linux-gnueabi-gcc -v命令查看安装情况

sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install g++-arm-linux-gnueabi

3、安装虚拟环境qemu

3.1、安装需要的工具包

sudo apt-get install build-essential pkg-config zlib1g-dev
sudo apt-get install libglib2.0-0 libglib2.0-dev
sudo apt-get install libsdl1.2-dev
sudo apt-get install libpixman-1-dev libfdt-dev
sudo apt-get install autoconf automake libtool
sudo apt-get install librbd-dev
sudo apt-get install libaio-dev
sudo apt-get install flex bison

3.2、安装qemu

wget https://download.qemu.org/qemu-5.0.0.tar.xz
tar -xf qemu-5.0.0.tar.xz
cd qemu-5.0.0/
sudo ./configure --prefix=/usr/local/qemu-5.0.0 --target-list=arm-softmmu --audio-drv-list=
sudo make
sudo make install
ls /usr/local/bin/ -al
sudo ln -s /usr/local/qemu-5.0.0/bin/* /usr/local/bin/

3.3、查看安装结果

qemu-img -V
qemu-system-arm -M help

4、安装kernel

4.1、安装需要的开发包

sudo apt-get install libncurses-dev

4.2、安装kernel

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.214.tar.gz
tar -xf linux-4.14.214.tar.gz
cd linux-4.14.214/
vi Makefile                 #手动替换ARCH = arm  CROSS_COMPILE = arm-linux-gnueabi-
make vexpress_defconfig     #选择vexpress平台开发板
make zImage -j4
make modules -j4
make dtbs
pwd
find -name zImage

5、制作rootfs

5.1、编译busybox

wget https://busybox.net/downloads/busybox-1.32.1.tar.bz2
tar -xf busybox-1.32.1.tar.bz2
cd busybox-1.32.1/
vi Makefile             #设置ARCH和CROSS_COMPILE
make menuconfig         #默认安装在_install目录下
make -j4
make install
ls _install/ -al

5.2、制作rootfs准备

mkdir rootfs
cp busybox-1.32.1/_install/* rootfs/ -rf
cd rootfs/
mkdir lib
cp /usr/arm-linux-gnueabi/lib/* ./lib/ -rf
mkdir dev
cd dev/
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4
sudo mknod -m 666 console c 5 1
sudo mknod -m 666 null c 1 3
cd ..
mkdir etc tmp sys var proc
mkdir -p mnt/nfs
cd etc
vim inittab     #填充数据
vim profile
vim fstab
mkdir init.d
cd init.d
vim rcS

其中inittab文件数据

::sysinit:/etc/init.d/rcS
#::respawn:-/bin/sh
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

profile文件数据

PS1='dyh@vexpress:\w# '
export PS1

fstab文件数据

proc         /proc           proc    defaults                0       0
tmpfs           /tmp            tmpfs   defaults                0       0
sysfs           /sys            sysfs   defaults                0       0
tmpfs           /dev            tmpfs   defaults                0       0
var             /dev            tmpfs   defaults                0       0
ramfs           /dev            ramfs   defaults                0       0

rcS文件数据

#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=/lib
export PATH LD_LIBRARY_PATHmount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
mdev -s
mkdir -p /var/lockecho "-----------------------------------"echo " welcome to A9 vexpress board"echo "-----------------------------------"

5.3、填充rootfs文件

cd ..
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
sudo mount -t ext3 rootfs.ext3 /mnt -o loop
ls /mnt
mount
sudo cp rootfs/* /mnt/ -rf
sudo umount /mnt

6、一切准备充分,可以尝试启动。退出:ctrl+A; x

qemu-system-arm -M vexpress-a9 -m 1024M -kernel /home/dyh/project/qemu/tools/linux-4.14.214/arch/arm/boot/zImage -dtb /home/dyh/project/qemu/tools/linux-4.14.214/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3

7、安装u-boot。可以正常启动内核,u-boot无关紧要

wget https://ftp.denx.de/pub/u-boot/u-boot-2021.01.tar.bz2
tar -xf u-boot-2021.01.tar.bz2
cd u-boot-2021.01/
vi Makefile          #替换ARCH
vi config.mk         #替换CROSS-COMPILE
make vexpress_ca9x4_defconfig
make -j4
cd ..
find -name u-boot
qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel /home/dyh/project/qemu/tools/u-boot-2021.01/u-boot

8、怎么把文件传入arm开发板虚拟环境中呢?安装nfs

8.1、以上安装内核是,nfs功能内核已经默认支持

8.2、安装需要的开发包

#安装nfs服务器
sudo apt-get install nfs-kernel-server
#建立虚拟网络设备uml-utilities 虚拟网桥桥接工具bridge-utils
sudo apt-get install uml-utilities bridge-utils

8.3、打开nfs的server功能

sudo edit /etc/exports                       #填充数据
sudo /etc/init.d/rpcbind restart            #重启nfs服务
sudo /etc/init.d/nfs-kernel-server restart  #重启nfs服务

exports文件添加内容

#添加nfs共享目录,其中192.168.33.100是arm开发板的IP地址
/home/dyh/project/qemu/nfs -rw -network 192.168.33.100

8.4、查看打开结果,需要关闭防火墙

#查看nfs server目录共享目录是否创建
showmount -e
#查看防火墙命令
sudo ufw status
sudo ufw enable
sudo ufw disable

8.5、配置网络

sudo edit /etc/network/interfaces            #填充数据(ubuntu 20.04之前版本)
sudo edit /etc/netplan/01-network-manager-all.yaml    #填充数据(ubuntu 20.04)
sudo edit /etc/qemu-ifup                    #填充数据
sudo edit /etc/qemu-ifdown
sudo chmod 777 /etc/qemu*                   #修改权限

interfaces文件添加内容

auto br0                    #创建网桥
iface br0 inet dhcp         #配置br0网桥为dhcp模式
bridge_ports eth0           #网桥br0建立在eth0上

01-network-manager-all.yaml文件添加内容。创建tap0,挂网桥br0

network:version: 2renderer: NetworkManagerethernets:eth0:dhcp4: yestap0:dhcp4: nobridges:br0:dhcp4: nointerfaces:- tap0

qemu-ifup文件内容

#!/bin/shecho sudo tunctl -u $(id -un) -t $1           #sudo tunctl -u dyh -t tap0
sudo tunctl -u $(id -un) -t $1                #创建虚拟网卡
echo sudo ifconfig $1 0.0.0.0 promisc up      #sudo ifconfig tap0 0.0.0.0 promisc up
sudo ifconfig $1 0.0.0.0 promisc up           #把tap0设置成混杂模式
echo sudo brctl addif br0 $1                  #sudo brctl addif br0 tap0
sudo brctl addif br0 $1                       #让br0成为tap0的端口
echo brctl show
brctl show                                    #查看网桥情况
#其中192.168.33.135是PC端的IP地址
sudo ifconfig br0 192.168.33.135

qemu-ifdown文件内容

#!/bin/shecho sudo brctl delif br0 $1        #sudo brctl delif br0 tap0
sudo brctl delif br0 $1             #删除网桥关系
echo sudo tunctl -d $1              #sudo tunctl -d tap0
sudo tunctl -d $1                   #删除虚拟网卡eth1
echo brctl show
brctl show

9、最终启动ARM开发板,制作个shell脚本

#! /bin/sh
qemu-system-arm     \-M vexpress-a9 -m 1024M        \-device virtio-net-device,netdev=tap0 \-netdev tap,id=tap0,ifname=tap0      \-kernel /home/dyh/project/qemu/tools/linux-4.14.214/arch/arm/boot/zImage   \-dtb /home/dyh/project/qemu/tools/linux-4.14.214/arch/arm/boot/dts/vexpress-v2p-ca9.dtb    \-nographic     \-append "root=/dev/mmcblk0 rw console=ttyAMA0" \-sd /home/dyh/project/qemu/tools/rootfs.ext3

10、挂载nfs,提高开发效率。此时PC目录/home/dyh/project/qemu/nfs和开发板/mnt/nfs目录相通

mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.33.135:/home/dyh/project/qemu/nfs /mnt/nfs

11、测试小程序

GitHub - dyh-git/kernel_ko: 内核的ko驱动

x86的PC机上运行ARM架构开发板相关推荐

  1. 运行在TQ2440开发板上以及X86平台上的linux内核编译

    一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的"linux-2.6.30.4_20100531.tar.bz2"源码包. 解压(天嵌默 ...

  2. android jni arm x86,使用houdini(Android模拟器)在基于x86的AVD上运行ARM库

    我有一个ARM编译库.我无法访问源代码.我想在我自己的应用程序中使用这个库.该应用程序应该在基于x86的AVD上运行(出于性能原因).使用houdini(Android模拟器)在基于x86的AVD上运 ...

  3. ARM嵌入式开发板推荐

    arm嵌入式主板具有低成本.高性能.低功耗的特点,是一个嵌入在设备里面做控制.数据处理使用的CPU板,承担着"大脑"的角色,主要是作为工控主板使用.短短几年,ARM嵌入式的异军突起 ...

  4. 配置eclipse为ARM嵌入式开发板编程

    配置eclipse为ARM嵌入式开发板编程 1-计算机环境 操作系统:window10 编程软件:Eclipse IDE for C and C++ Developers - 2022-09 Wind ...

  5. 移植中文TTS(ekho)到ARM linux开发板

    移植ekho到arm linux,实现将中文转换为.wav格式的语音文件. 移植开源库libsndfile到arm linux开发板 1. 下载压缩源码包libsndfile-1.0.28.tar.g ...

  6. 基于SOM-TL437x核心板研发的一款TI ARM Cortex-A9开发板 6JTAG仿真器接口

    前    言 TL437x-EVM是广州创龙基于SOM-TL437x核心板研发的一款TI ARM Cortex-A9开发板,采用核心板+底板方式,尺寸为180mm*130mm,核心板采用4*60pin ...

  7. 树莓派基于c语言开发板,在树莓派等基于ARM的开发板运行.NET Core程序

    前言 本人的技术栈基本上C#方向上面的,又对树莓派之类的开发特别感兴趣,奈何C语言学的一知半解,很多东西都没法做.所以瞅上了.NET Core,毕竟跨平台,自己也熟悉C#. 依赖 首先是安装依赖.之所 ...

  8. linux 运行arm,在Ubuntu下编译运行arm架构程序

    Ubuntu本身是不支持arm架构的,但是可以通过qemu来执行,编译可以使用gcc对于arm的交叉编译器. 下面的命令是用来安装qemu和gcc for arm的: sudo apt install ...

  9. QEMU 模拟Arm A9开发板

    一.在Deepin 中编译Qemu4, 1.下载Qemu4源码 wget https://download.qemu.org/qemu-4.0.0.tar.xz 2.解压缩 tar xvJf qemu ...

最新文章

  1. 第一天--来个占位符,让自己有一席之地
  2. Jenkins 服务重启方法
  3. 主线程如何等待多线程完成 返回数据_多线程基础体系知识清单
  4. ASP.NET MVC XML绑定Action参数列表
  5. 网络编程——第一篇 基础之进程线程
  6. POJ 3553 Light Switching Game 博弈论 nim积 sg函数
  7. CSS3学习笔记总结,你值得拥有(呕心沥血之作,涵盖CSS3所有知识点)
  8. hadoop-2.7.2 分布式集群搭建
  9. 施密特正交化的几何解释
  10. 简述流水线基本工作原理 计算机,自动化专业计算机技术基础作业题(50题)
  11. ppt插入相对路径视频
  12. android大屏适配_Android屏幕适配
  13. oracle 回收站
  14. 【QQ机器人】来认领一只派蒙Bot吧:QQ娱乐机器人,免费开源、易搭建、20余种功能集成、可扩展
  15. 笔记本电脑显卡性能排行榜
  16. JAVA 油站管理系统_加油站管理系统
  17. 计算机名和ip不匹配,错误:主机名/ IP不匹配证书的altnames Node.js的
  18. 第一行代码-第二版(郭霖著)笔记十一(Material Design)
  19. android simpleperf工具介绍
  20. 【Ansible】 Ansible 模块 setup 与 stat 模块用法

热门文章

  1. ecs搭建mysql和云数据库_阿里云ECS搭建自己的关系型数据库mysql RDS主从复制
  2. 第三范式 (3NF)定义
  3. 微博基础数据接口 (Rest API)
  4. 论文查重主要是查什么?
  5. Java 注释(Java Doc Comment)与注解(Annotation)
  6. JavaSE之注释规范、文档注释及注解
  7. MYSQL基础:binlog使用基础: 1:开启binlog与常用命令介绍
  8. IE6下不能识别trim方法的解决办法(javascript)
  9. OpenCV 之distanceTransform()
  10. Python读取CSV文件写入Mysql数据库