为什么会有这篇文章

早在2011年的时候,跟当时同事一起讨论,做Linux系统开发正处于整个Linux开发中间层,没有上层的C/C++业务和数据库的开发经验。也没有底层的内核和驱动开发经验,究竟路该怎样走……基于对Linux系统开发的理解和内核的兴趣。觉得选择Linux内核开发更适合自己。于是到淘宝上买了块三星s3c2440(arm 9)开发板,学起内核开发。没有过多久。机缘巧合,正式添加了公司的内核开发部。就这样跟内核和arm打上交道了。

没有想到这一做就是3年了,arm芯片仅仅有在公司才干使用,回到家里就不能訪问了。去年(2014)開始觉得做内核久了,应该向内核社区提交patch,提升知名度和影响力。但在公司提交patch不方便。于是在家里通过qemu方式搭建于ARM A9的执行环境,进行开发和測试验证。一口气提交了好几个patch(link1,

id=c2459d35f5b8de077fde859b8c96a23f309b9ab2" target="_blank">link2, link3, link4, link5)并被社区接纳了。

近期在梳理Linux内存机制,不管是《深入理解Linux内核》还是《深入理解内核架构》这两本红宝书都无法告知你每一个细节的时候。就须要查看代码细节。改动代码。甚致做行为分析。

此时须要改动代码输出调试信息。以帮助更深入体会代码的逻辑。

这该是qemu派上场的时候。

事实上我前前后后搭建qemu+arm的执行环境已超过5次了。每次都要花上非常多时间。碰巧昨天有同事看到我再次搭建。他如搭珍宝,告诉我一定要将搭建qemu的方法告诉他。

所以,假设你想买个开发板来做arm + linux嵌入式开发,全然能够使用qemu进行开发。或者你像我一样,对内核机制关心,而不关心于详细的外设器件。最多是关心arm架构相关的功能,也能够使用qemu进行开发。

一句话:搭建qemu+arm环境,用于做内核开发和功能分析调试。

搭建好开发环境

我整个搭建过程都是在笔记本上进行的,Ubuntu 12.04系统;假设是Fodera环境。搭建过程可能略有不同。但关键步骤是不变的。

qemu模拟得最好的arm芯片,要数ARM公司的vexpress A9开发板了,本文的搭建过程都是环绕这个开发板进行的。

当然。假设你想搭其他开发板,也不难,仅仅要qemu和内核对它有成熟的支持就够了。

以下是step by step的搭建过程。建议没有特别诉求的朋友,依照下在面的步骤操作。或者先依据以下的步骤成功搭建vexpress执行环境之后。再依据自己的需求进行更改。

下载Linux内核

下载内核有两种方法,一种是用git直接下载内核代码树,方便后面的内核开发。还有一种是直接到内核社区下载相应版本号的源代码包。

我採用第一种方法,但后面发现主线上3.18版本号和后面版本号的代码,使用这样的搭建方法执行不起来。

眼下未查明问题的根因。

假设读者想高速搭建成功。建议选用3.16版本号的内核进行搭建。

方法一:使用git

git clonegit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

方法二:直接下载3.16源代码包

wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.tar.xz

安装arm的交叉编译工具链

想必做嵌入式开发的朋友,对交叉编译工具链不陌生。

假设你订制一个交叉编译工具链,建议你使用crosstool-ng开源软件来构建。但在这里建议直接安装arm的交叉编译工具链:

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

编译Linux内核

生成vexpress开发板子的config文件:

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

编译:

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

生成的内核镱像位于arch/arm/boot/zImage, 兴许qemu启动时须要使用该镜像。

下载和安装qemu模拟器

事实上Ubuntu 12.04有qemu的安装包。但由于版本号较低。对vexpress开发板支持不友好,建议下载高版本号的qemu:

wget http://wiki.qemu-project.org/download/qemu-2.0.2.tar.bz2

配置qemu前。须要安装几个软件包:

sudo apt-get install zlib1g-dev

sudo apt-get install libglib2.0-0

sudo apt-get install libglib2.0-dev

配置qemu,支持模拟arm架构下的全部单板:

./configure --target-list=arm-softmmu --audio-drv-list=

编译和安装:

make

make install

測试qemu和内核是否能执行成功

qemu已经安装好了。内核也编译成功了,到这里最好是測试一下,编译出来的内核是否OK,或者qemu对vexpress单板支持是否够友好。

执行命令非常easy:

qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/ivan/kernel_git/linux/arch/arm/boot/zImage -nographic -append "console=ttyAMA0"

假设看到内核启动过程中的打印,说明前的搭建是成功的。

这里简介下qemu命令的參数:

-M vexpress-a9 模拟vexpress-a9单板,你能够使用-M ?參数来获取该qemu版本号支持的全部单板

-m 512M 单板执行物理内存512M

-kernel /home/ivan/kernel_git/linux/arch/arm/boot/zImage  告诉qemu单板执行内核镜像路径

-nographic 不使用图形化界面,仅仅使用串口

-append "console=ttyAMA0" 内核启动參数。这里告诉内核vexpress单板执行。串口设备是哪个tty。

注意:

我每次搭建,都忘了内核启动參数中的console=參数应该填上哪个tty,由于不同单板串口驱动类型不尽同样,创建的tty设备名当然也是不同样的。

那vexpress单板的tty设备名是哪个呢? 事实上这个值能够从生成的.config文件CONFIG_CONSOLE宏找到。

假设搭建其他单板,须要注意内核启动參数的console=參数值,同样地,可从生成的.config文件里找到。

制作根文件系统

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

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

1. 根文件系统的内容

假设你看过《Linux From Scratch》。相信你会对这一步产生恐惧感。但假设一直从事嵌入式开发。就能够放下心来。根文件系统就是简单得不能再简单的几个命令集和态动态而已。为什么Linux From Scratch会有那么复杂。是由于它要制作出一个Linux发生版。但在嵌入式领域,差点儿全部的东西,都是mini版本号,根文件系统也不例外。

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

2. 根文件系统放在哪里

事实上依赖于每一个开发板支持的存储设备,能够放到Nor Flash上。也能够放到SD卡,甚至外部磁盘上。

最关键的一点是你要清楚知道开发板有什么存储设备。

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

下载、编译和安装busybox

wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2

make defconfig

make CROSS_COMPILE=arm-linux-gnueabi-

make install CROSS_COMPILE=arm-linux-gnueabi-

安装完毕后。会在busybox文件夹下生成_install文件夹。该文件夹下的程序就是单板执行所须要的命令。

形成根文件夹结构

先在Ubuntu主机环境下,形成文件夹结构,里面存放的文件和文件夹与单板上执行所须要的文件夹结构全然一样。然后再打包成镜像(在开发板看来就是SD卡)。这个暂时的文件夹结构称为根文件夹
1.  创建rootfs文件夹(根文件夹),根文件系统内的文件全部放到这里

sudo mkdir rootfs

2. 拷贝busybox命令到根文件夹下

sudo cp busybox-1.20.2/_install/* -r rootfs/

3. 从工具链中拷贝执行库到lib文件夹下

sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/

4. 创建4个tty端终设备

sudo mknodrootfs/dev/tty1 c 4 1

sudo mknod rootfs/dev/tty2c 4 2

sudo mknod rootfs/dev/tty3c 4 3

sudo mknod rootfs/dev/tty4c 4 4

制作根文件系统镜像

1. 生成32M大小的镜像

dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32

2. 格式化成ext3文件系统

mkfs.ext3 a9rootfs.ext3

3.  将文件复制到镜像中

sudo mkdir tmpfs

sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop

cp -r rootfs/*  tmpfs/

sudo umount tmpfs

系统启动执行

完毕上述全部步骤之后。就能够启动qemu来模拟vexpress开发板了,命令參数例如以下:

qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/ivan/qemu/linux/arch/arm/boot/zImage -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd a9rootfs.ext3


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

写在后面的话

通过上面的步骤。搭建出来一个最小的qemu+arm开发环境,你能够上面的基础上改动内核。或者添加一些測试程序在单板上执行,甚至使用单板的flash设备。
在此,你能够做纯arm架构的内核开发。或者与架构无关的内核开发,也能够做单板相关的驱动开发。

从零使用qemu模拟器搭建arm执行环境的更多相关文章

  1. 一步步教你如何在ubuntu虚拟机中安装QEMU并模拟arm 开发环境(二)rootfs制作

    过了,一天,周又到了,博主终于可以拿出时间来把上一次没有给大家展示完了的内容今天在这里一并展示给大家,希望和大家共同进步,共同学习,同时我也虔诚的希望各位业界的朋友把自己的工作经验拿出来大家一起分享, ...

  2. 海马玩模拟器——搭建React Native环境

    Visual Studio Emulator for Android 模拟器国内这网络环境不太用,所以使用海马玩模拟器,给大家推荐一下! 下面开始配置环境: 1)下载1.8+JDK,配置JDK环境参考 ...

  3. 使用Android Studio和Genymotion模拟器搭建Andriod开发环境

    一.Android Studio下载 1.打开http://www.android.com/ 2.依照下图步骤打开下载页面 a.在页脚部分点击“App Developer Resources” b.点 ...

  4. Ubuntu下Eclipse搭建ARM开发环境

    第一步:安装JRE 和 Eclipse 详细步骤请参考:http://blog.csdn.net/ex_net/article/details/7251664 第二步:安装arm-linux-gcc ...

  5. 从零单排Hadoop——1.搭建Hadoop开发环境

    Hadoop环境准备:ubuntu 12.05.Hadoop 2.4 一.安装ssh 由于hadoop可以配置为集群运行,因此系统需要安装ssh工具保证集群中各节点可以互相访问. 获取ssh软件: s ...

  6. 使用vsCode配合IAR搭建arm开发环境

    众所周知IAR的编辑功能就是个垃圾,但是不得不承认IAR的编译器相当的牛X,经常以稳定可靠而著称,为此我们把VSCODE强大的编辑功能和IAR结合一下来加快我们的开发周期. 一.下载VSCODE并安装 ...

  7. Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统

    Qemu搭建ARM vexpress开发环境(三)----NFS网络根文件系统 标签(空格分隔): Qemu ARM Linux 经过上一篇<Qemu搭建ARM vexpress开发环境(二)- ...

  8. Qemu搭建ARM vexpress开发环境(一)

    Qemu搭建ARM vexpress开发环境(一) 标签(空格分隔): Qemu ARM Linux 嵌入式开发离不开硬件设备比如:开发板.外设等,但是如果只是想学习研究Linux内核,想学习Linu ...

  9. Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核

    Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...

随机推荐

  1. rest_framework 认证功能

    from django.views import View from rest_framework.views import APIView from rest_framework.authentic ...

  2. 数据绑定的知识点<%%>,<%#%>,<%=%>

    1.<% %>用来绑定后台代码 如: < % for(int i=0;i<100;i++) { Reaponse.Write(i.ToString()); } %> 2. ...

  3. TPC-C测试

    TPC发布的测试标准之一,是专门针对联机事务处理系统(OLTP)的测试标准.1992年发布1.0版本.最新版本5.11,2010年发布. 测试规范中模拟了一个比较复杂并具有代表意义的OLTP应用环境, ...

  4. webpack入门与笔记

    为什要使用WebPack 现今的很多网页其实可以看做是功能丰富的应用,它们拥有着复杂的JavaScript代码和一大堆依赖包.为了简化开发的复杂度,前端社区涌现出了很多好的实践方法 模块化,让我们可以 ...

  5. 在Ubuntu上创建一个可以启动的U盘

    1.概观 使用可启动的Ubuntu USB盘,您可以: 安装或升级Ubuntu 在不触及PC配置的情况下测试Ubuntu桌面体验 在借来的机器或网吧上启动到Ubuntu 使用USB盘上默认安装的工具来 ...

  6. k近邻法(k-nearest neighbor, k-NN)

    一种基本分类与回归方法 工作原理是:1.训练样本集+对应标签 2.输入没有标签的新数据,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签. 3.一般 ...

  7. PHP实现杨辉三角形

    <?php /**** * 杨辉三角形:我的实现方式. * 下标 * 1 0 * 1 1 1 循环上一行数据1次,计算后结果追加到当前行末尾 * 1 2 1 2 * 1 3 3 1 3 * 1 ...

  8. request.getxxxxxx()的使用方法

    request.getSchema() 可以返回当前页面使用的协议,http 或是 https; request.getServerName() 可以返回当前页面所在的服务器的名字; request. ...

  9. Haproxy实现web的页面的动静分离

    一.Haproxy概述: 概述:Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,由C语言编写而成,支持会话保持.七层处理.健康检查.故障修复后自动加载.动静分离.HAProxy ...

  10. Symfony4中文文档: 安装和设置Symfony框架

    安装和设置Symfony框架 要创建新的Symfony应用程序, 首先确保使用的是PHP7.1 或更高版本并且已经安装Componser. 如果未安装, 请首先在系统上全局安装Componser. 如 ...