[授权发表]利用 qemu 模拟嵌入式系统制作全过程

本文详细介绍了如何利用QEMU模拟嵌入式系统,包括环境搭建、配置Kernel、使用Busybox制作initramfs镜像的过程。首先,通过安装必要的工具和下载kernel、uboot、busybox源码,然后配置Kernel并编译。接着,使用busybox生成initramfs,并创建自定义的init脚本来启动shell。通过这个教程,读者可以学习到嵌入式Linux系统的基本构建步骤。
摘要由CSDN通过智能技术生成

利用qemu模拟嵌入式系统制作全过程

by Pingbo Wen of TinyLab.org
2013/08/31

最初发表:泰晓科技 – 聚焦嵌入式 Linux,追本溯源,见微知著!
原文链接:利用 qemu 模拟嵌入式系统制作全过程
评论说明:为更好地聚合大家的讨论,请到上面原文的评论区回复。


这篇文章将介绍如何用 Qemu 来搭建一个基于 ARM 的嵌入式 Linux 系统。通过该文章可以学习到如何配置和交叉编译 Kernel,如何配置 Busybox 并编译,如何制作 Initramfs,如何制作根文件系统,如何定制自己的 Uboot,如何通过 Uboot 向 Kernel 传递参数等。开始干活!

零、环境搭建

在实现我们的目标之前,我们需要搭建自己的工作环境。在这里,假设你的主机上已经有gcc本地编译环境,并运行Ubuntu 12.10。但是这并不影响在其他的linux平台上进行,只要修改一下对应的命令就可以了。

首先,我们需要下载一个ARM交叉工具链。你可以在网上下载源码自己编译,也可以下载已经编译好的工具链。在工具链中有基本的ARM编译工具,比如:gcc, gdb, addr2line, nm, objcopy, objdump等。可能你会问,这些工具本机不是已经有了么?如果不出意外,我想你的主机应该是x86架构的。不同的架构,有不同的指令集,你不能拿一个x86的执行文件放到一个ARM机器上执行。所以我们需要一个能够在x86架构上生成ARM可执行程序的GCC编译器。有很多预先编译好的ARM工具链,这里使用的是CodeSourcery[1]。更多关于toolchain的信息可以在elinux.org找到[2]。下载下来后,直接解压,放到某个目录,然后配置一下PATH环境变量,这里是这样配置的:

export PATH=~/arm-2013.05/bin:$PATH

配置完ARM交叉工具链后,我们需要下载一些源码,并安装一些软件。 命令如下: ``` # install qemu sudo apt-get install qemu qemu-kvm qemu-kvm-extras qemu-user qemu-system # install mkimage tool sudo apt-get install uboot-mkimage # install git sudo apt-get install git # prepare related directory mkdir -pv ~/armsource/{kernel,uboot,ramfs,busybox} # download latest kernel stable code to kernel dir git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git ~/armsource/kernel # download latest u-boot code to uboot dir git clone git://git.denx.de/u-boot.git ~/armsource/uboot # download latest busybox code to busybox dir git clone git://busybox.net/busybox.git ~/armsource/busybox ```

一、配置kernel

环境搭建完后,我们就正式进入主题了。现在我们需要配置kernel源码,编译,并用qemu运行我们自己编译的kernel。这样我们就能够对我们的kernel进行测试,并做出对应的修改。

进入kernel源码目录,我们需要找最新的kernel稳定版本。在写这篇文章的时候,最新的稳定版本是3.10.10。我们可以通过git切换到3.10.10。由于我们编译的内核需要运行在ARM上,所以我们应该到arch/arm/configs下找到对应我们设备的kernel配置文件。但是我们没有实际意义上的设备,而是用qemu模拟的设备,所以我们应该选择qemu能够模拟的设备的配置文件。这里我们选择常用的versatile_defconfig。 对应的命令如下: ``` cd ~/armsource/kernel # checkout a tag and create a branch git checkout v3.10.10 -b linux-3.10.10 # create .config file make versatile_defconfig ARCH=arm ```

配置完了,我们就可以编译了。编译的时候,我们可以用多个线程来加速编译,具体用多少个就要看你主机的配置了。这里我们用12个线程编译,命令如下:

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

注意,如果交叉编译环境没有配置好,这个地方会提示找不到对应的gcc编译器。这里-j12是指定编译线程为12个,ARCH是指定目标架构为arm,所用的交叉编译器arm-none-linux-gnueabi-。

OK,kernel已经编译好了,那么我们需要用qemu把它跑起来。关于qemu的具体使用,请看qemu的官方文档[3],这里直接给出命令:

qemu-system-arm -M versatilepb -kernel arch/arm/boot/zImage -nographic

这里-M是指定模拟的具体设备型号,versatile系列的pb版本,-kernel指定的是对应的内核,-nographic是把qemu输出直接导向到当前终端。

好,命令成功执行了。但是,好像没有任何有效输出。我们通过C-a x来退出qemu。编译的kernel好像不怎么好使,配置文件肯定有问题。打开.config配置文件,发现传递给kernel的参数没有指定console,难怪没有输出。我们定位到CMDLINE,并加入console参数:

CONFIG_CMDLINE="console=ttyAMA0 root=/dev/ram0"

保存.config,重新编译kernel,并用qemu加载。现在终于有输出了。如果不出意外,kernel应该会停在找不到根文件系统,并跳出一个panic。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值