宿主机:Ubuntu16.04 x64(Linux内核4.4.0)

交叉编译工具链:gcc-arm-linux-gnueabi
arm-linux-gcc:4.4.3
QEMU:2.5.0
Linux kernel:4.4.1
busybox:1.25.1

一、准备
1.创建工作目录armv7/,进入该目录
2.下载内核源码文件linux-4.4.1.tar.xz
3.下载busybox源码文件busybox-1.25.1.tar.bz2
4. http://files.cnblogs.com/files/pengdonglin137/etc.tar.gz下载内核启动配置文件etc.tar.gz,解压

二、编译Linux内核

在armv7/目录下
1.解压linux-4.4.1.tar.xz
2.进入linux-4.4.1目录
3.执行:

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

完成后,执行:(j2表示两个线程执行)

 make zImage -j2 

最后执行:(一定要make dtbs,且启动时加上相应的dtb,否则内核启动不了)

 make dtbs 

或省略以上两步直接:

 make all 

4.在armv7/目录下新建temp/目录

5.将生成的arch/arm/boot/zImage和arch/arm/boot/dts/vexpress-v2p-ca9.dtb复制到temp/中

三、编译busybox
在armv7/目录下
1.解压busybox-1.25.1.tar.bz2
2.进入busybox-1.25.1目录
3.执行:

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

出现图形界面,做如下配置(这一步是可选的,如果执行了就可以不用执行cp /usr/arm-linux-gnueabi/lib rootfs/这一步):

Busybox Settings --->
  Build Options --->
    [*] Build BusyBox as a static binary (no shared libs)
完成后,执行:

 make

完成后,执行:

 make install

完成后,该目录下生成的_install中即是基本的busybox指令。

四、制作根文件系统
1. 先在Ubuntu主机环境下,形成目录结构,里面存放的文件和目录与虚拟arm板上linux内核运行所需要的目录结构完全一样,然后再打包成镜像(在虚拟arm板看来就是SD卡),这个临时的目录结构称为根目录。在armv7/目录下,创建bash脚本,并运行(注意这里不能使用ext4格式,否则内核启动后文件系统是只读的,原因目前不清楚):

 #!/bin/bash

 rm -rf rootfs
rm -rf tmpfs
rm -rf rootfs.ext3 mkdir rootfs
mkdir -p rootfs/proc/
mkdir -p rootfs/sys/
mkdir -p rootfs/tmp/
mkdir -p rootfs/root/
mkdir -p rootfs/var/
mkdir -p rootfs/mnt/ cp busybox-1.25./_install/* rootfs/ -arf
cp /usr/arm-linux-gnueabi/lib rootfs/ -arf
cp etc rootfs/ -arf mkdir -p rootfs/dev/
mknod rootfs/dev/tty1 c 4 1
mknod rootfs/dev/tty2 c 4 2
mknod rootfs/dev/tty3 c 4 3
mknod rootfs/dev/tty4 c 4 4
mknod rootfs/dev/console c 5 1
mknod rootfs/dev/null c 1 3 dd if=/dev/zero of=rootfs.ext3 bs=1M count=64
mkfs.ext3 rootfs.ext3 mkdir -p tmpfs
mount -t ext3 rootfs.ext3 tmpfs/ -o loop
cp -r rootfs/* tmpfs/
umount tmpfs

五、网络配置
在armv7/目录下
1.修改etc/init.d/rcS文件,在ifconfig lo 127.0.0.1 下加一句ifconfig eth0 192.168.xxx.xxx(也可以内核启动后手动运行,但这样开机自动运行比较方便)
2.依次执行以下shell指令:

 ifconfig ens33 down                       # 关闭ens33接口
brctl addbr br0 # 添加一个虚拟网桥br0
brctl addif br0 ens33 # 把ens33连接到br0上
ifconfig br0 promisc up # 以混杂模式打开br0接口
ifconfig ens33 promisc up # 以混杂模式打开ens33接口
dhclient br0 # 为br0分配ip
tunctl -t tap0 -u root # 创建一个tap0接口,只允许root用户访问
brctl addif br0 tap0 # 在虚拟网桥中增加一个tap0接口
ifconfig tap0 up # 打开tap0接口

六、系统启动运行

qemu-system-arm \
-M vexpress-a9 \
-m 512M \
-kernel temp/zImage \
-dtb temp/vexpress-v2p-ca9.dtb \
-nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
-sd rootfs.ext3 \
-net nic \
-net tap,ifname=tap0,script=no

七、后记

存在的问题:
1.显示文件系统是只读的 (已解决:文件系统格式改为ext3)
2.联网问题尝试过之前的方法,失败(已解决,宿主机内需要进行网桥、接口的配置,还要修改etc/init.d/rcS,加入一句ifconfig eth0 <ip>,<ip>是希望分配给虚拟arm板的ip)
3.ARM9选择了versatilepb (ARM926EJ-S)平台,但在启动时提示无法加载设备树,追溯问题发现是versatile-pb.dts没有编译导致dtb文件没有生成

新增问题:
1.qemu虚拟机只能与宿主机ping通,无法ping通外网
2.宿主机进行网桥、接口配置只能一条条输入shell指令完成,写成脚本运行后ping不通外网,但ifconfig信息与正确配置是一样的

基于QEMU的ARM Cortex-A9开发板Vexpress-ca9的Linux内核的编译和运行的更多相关文章

  1. VELT-0.1.5开发:使用kgdb调试Linux内核【转】

    转自:http://demo.netfoucs.com/lights_joy/article/details/44106589 VELT的全称是Visual EmbedLinuxTools,它是一个与 ...

  2. CentOS 7 利用qemu模拟ARM vexpress A9开发板

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

  3. 基于 QEMU进行 arm 仿真开发 (以 vexpress-a9 为例)

    背景 基于 QEMU 的仿真可以节省 硬件成本. 参考:<qemu-system-arm仿真vexpress-a9踩坑记>.<在Ubuntu下使用QEMU搭建arm开发环境(一)搭建 ...

  4. 【基于mini2440开发板的交叉编译环境及内核树配置.

    在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙...笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大多 ...

  5. 烧写ARM开发板系统教程----->uboot 、内核以及文件系统

    一.sd启动 将u-boot镜像写入SD卡,将SD卡通过读卡器接上电脑(或直接插入笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是 ...

  6. u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统

    http://www.linuxidc.com/Linux/2012-09/70510.htm  来源:Linux社区  作者:赵春江 uboot最主要的功能就是能够引导内核启动.本文就介绍如何实现该 ...

  7. 迅为八核cortex a53开发板android/linux/Ubuntu系统

    详情请点击了解:http://www.topeetobard.com 店铺:https://arm-board.taobao.com 核心板: 提供1G和2G内存版本,全机器焊接,杜绝手工,批量无忧. ...

  8. 【STM32】基于正点原子『探索者』开发板的烧录

    项目需要一个功能,开发板范例正好有,就买了一块,不过还是有点贵 我手边没有J-Link 用的都是串口烧录 烧录时,先打开右上的开关 如果是仿真器烧录,它无法供电,需要接12V适配器或是杜邦线供电 然后 ...

  9. 【嵌入式开发】向开发板中烧写Linux系统-型号S3C6410

    作者 : 万境绝尘 转载请著名出处 终于拿到板子了, 嵌入式开发正式开启. 板子型号 : 三星 S3C6410 基于ARM11, 指令集基于arm6指令集; 为毛不是 Cortext A9的板子; 烧 ...

随机推荐

  1. Painter's Problem poj1681 高斯消元法

    Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4420   Accepted: 2143 ...

  2. Football 概率DP poj3071

                                                                                                 Footbal ...

  3. 约会安排HDU - 4553

    寒假来了,又到了小明和女神们约会的季节.  小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复"呵呵",所以,小明的最爱就是和女神们约会.与此同时,也有很多基 ...

  4. Codeforces Round #420 (Div. 2)

    /*************************************************************************************************** ...

  5. 【vue系列之二】详解vue-cli 2.0配置文件

    上次给大家分享的是用vue-cli快速搭建vue项目,虽然很省时间和精力,但想要真正搞明白,我们还需要对其原理一探究竟. 大家拿到一个项目,要快速上手,正确的思路是这样的: 首先,如果在项目有read ...

  6. HDU1201 水题

    做多了年月日,现在基本就能水过了 18岁生日 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  7. java web 学习笔记 编码问题总结

       java web 学习笔记 编码问题总结 1.非form表单中提交的中文参数---------------------------传递给Servlet服务器时,默认以iso-8859-1解码 ...

  8. Collection和Map的默认扩容参数

    初始大小:调用无参构造函数时默认的容量 加载因子:超过 (当前容量*加载因子) 时会进行扩容 扩容因子:扩容时增加的容量为 (当前容量*扩容因子)        容器         初始容量    ...

  9. win10 uwp 访问解决方案文件

    本文讲如何访问解决方案的资源. 我们经常会把一些图片资源放在我们的解决方案,那么从这里拿出来很简单. 我在 Assets 放了图片 1.jpg 那么我要把他拿出来可以 <Image Source ...

  10. LeetCode 695. Max Area of Island (岛的最大区域)

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...