为什么会有这篇文章

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

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

    原文链接: http://blog.csdn.net/linyt/article/details/42504975 为什么会有这篇文章 早在2011年的时候,跟当时同事一起讨论,做Linux系统开发正 ...

  2. 使用Ubuntu+qemu模拟器搭建arm运行环境

    我的环境: VMware Ubantu8.2-19ubuntu1 Linux内核 3.13.0-32-generic 1.下载Linux内核 wget https://www.kernel.org/p ...

  3. linux实验——使用qemu模拟器搭建arm运行环境

    目录 文章目录 **我的环境:** VMware Ubantu14.04 64位 Linux内核 4.4.0-137-generic 步骤 下载Linux内核 因为内核版本过高,影响后面搭建,下载li ...

  4. 搭建ARM交叉编译环境

    搭建ARM交叉编译环境 文章目录 搭建ARM交叉编译环境 前言 一.安装arm交叉编译工具 二.运行可执行程序[坑点] 三.调试程序 前言 通过前一篇关于risc_v交叉编译环境的搭建,想必大家已经对 ...

  5. 【LVGL】使用PC 模拟器搭建LVGL开发环境

    目的 本文档主要记录在windows环境下使用模拟器搭建LVGL开发环境的各个步骤 开发环境 windows7 资源 lvgl官网:https://lvgl.io/ simulator:https:/ ...

  6. 在Ubuntu下使用QEMU搭建arm开发环境(一)搭建基本开发环境

    马上就要开学了,开学后就会开始arm+Linux的学习,因为马上就要去学校了,就没有买板子,打算去了学校再买,但是想学习的心是迫切的(O(∩_∩)O哈哈~),在网上浏览的时候发现了QEMU这个&quo ...

  7. 用QEMU搭建arm开发环境之三:编译BusyBox建立最简单的文件系统

    1.BusyBox简介 BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件(注:不同版本可能包含的数量不一样).BusyBox 包含了一些简单的工具,例如ls.cat和echo等等, ...

  8. 在Ubuntu下使用QEMU搭建arm开发环境(三)使用u-boot加载Linux内核

    嵌入式启动概述 嵌入式boot loader 功能类似于PC的BIOS.硬件检测是否正常 加载操作系统镜像到RAM 设置不同的启动方式 常见的启动方式 NOR/NAND flash启动 从SD卡启动 ...

  9. 一零零九、Docker搭建 全集群 环境配置

    目录 纯Docker部分 Docker结合Hadoop部分 环境搭建篇 Docker入门传送门 基于传统的hadoop搭建方式,将hadoop搭建前的虚拟物理机准备部分使用docker容器替代,后续 ...

最新文章

  1. RTEMS 4.9.4 bootcard.c 中的 boot_card 函数分析
  2. DDoS攻击的大量增加给企业带来了新的威胁——Vecloud
  3. 添加chorme插件时出现“程序包无效”
  4. 关于 Redis 的一些新特性、使用建议和最佳实践
  5. 一个有第三方ebuild的网站
  6. django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17).
  7. RPC远程过程调用之Hessian 基于HTTP
  8. 录入班级学生姓名科目成绩_如何利用钉钉发布考试成绩
  9. 机器学习项目必经十大磨难,看看自己渡过几劫了?
  10. 透过表象看本质!?之三——Kalman滤波
  11. puppet一键部署lnmt
  12. 微型计算机机安装硬盘教程,装机DIY之硬盘安装方法 不同硬盘安装方法图解教程...
  13. 51单片机中哪些SFR可以位寻址?
  14. 常用git 命令备忘
  15. php增加sqlserver扩展
  16. 微信小程序3(WXSS模板样式和全局局部配置)
  17. Android Graphics Tests 程序学习01
  18. Xcode 打开总是无法响应问题
  19. SpiderMonkey 简介和使用
  20. 如何在手机上使用脚本

热门文章

  1. python是个啥-初识python: 面向对象是个啥?
  2. python下载教程1001python下载教程-请教vs2017下怎么使用python
  3. python入门到精通需要学多久-python学习从入门到精通要多久
  4. python要不要装pycharm-subli(python要不要装pycharm)
  5. python怎么读文件名-python读取文件名并改名字的实例
  6. mybatis中的mapper设计与原理
  7. LeetCode Power of Two
  8. mysql 变量赋值方法
  9. 进程通信学习笔记(System V消息队列)
  10. 数论总结 (常用定理+ 模板)