qemu搭建kernel学习环境

qemu简介

先看看维基百科的解释,什么是qemu

    QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。经由KVM(早期为kqemu加速器,现在kqemu已被KVM替换)这个开源的加速器,QEMU能模拟至接近真实电脑的速度。QEMU有两种主要运作模式:

User mode模拟模式,亦即是用户模式。QEMU能引导那些为不同中央处理器编译的Linux程序。而Wine及Dosemu是其主要目标。
System mode模拟模式,亦即是系统模式。QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。它使得为系统源代码进行测试及除错工作变得容易。其亦能用来在一部主机上虚拟数部不同虚拟电脑。

简而言之,qemu就是一个虚拟机软件,我们可以在里边跑自己构建的操作系统,这对于学习内核或者驱动开发来说真的是相当方便,可以抛开开发板,单拿一台笔记本电脑就可以学习内核测试模块代码,甚至直接做开发。真的是非常方便,废话不多说,开工。

下载安装qemu

笔者测试过ubuntu 12.10 和 ubuntu 16.04两个版本,ubuntu 12.10apt提供的qemu版本较老对arm verpress板子支持的不够好(网友前辈说的,具体哪里不好,我也不知道)。
而ubuntu 16.04 apt提供的是2.5版本的qemu,版本比较新,就不用自己编译安装了。
两种方式全凭个人喜好。

root-># lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04 LTS
Release:    16.04
Codename:   xenial

root-># qemu-system-arm -version
QEMU emulator version 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.4), Copyright (c) 2003-2008 Fabrice Bellard

ubuntu apt-get方式安装

  root-># apt-get install qemu-system-arm

使用此命令会自动解决依赖关系完成安装过程,安装完成可以通过qemu-system-arm -version
测试安装是否成功。

自己下载安装

ubuntu 的apt其实有qemu的安装包,但是版本较低对vexpress的支持不好,此处直接下载较高版本的qemu自己手动安装。
wget http://wiki.qemu-project.org/download/qemu-2.0.2.tar.bz2
首先需要安装qemu依赖的环境
apt-get install libglib2.0-dev zlib1g-dev
下载完成后安装前需要进行配置,使其支持ARM架构下的所有单板

cd qemu/
./configure --target-list=arm-softmmu --audio-drv-list=
make 
make install

下载编译内核

下载内核

可以自行到www.kernel.org上下载最新版内核

  root-># wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.16.tar.gz

编译内核

  root-># apt-get install libncurses5-dev   

  root->#tar -zxvf linux-3.16.tar.gz 
  root-># cd linux-3.16
  root-># cp arch/arm/configs/vexpress_defconfig  .config
  root-># make menuconfig CROSS_COMPILE=arm-linux- ARCH=arm
  root-># make -j4 CROSS_COMPILE=arm-linux- ARCH=arm

qemu模拟最好的arm芯片是ARM亲生的vexpress A9,本文搭建环境就以此为基础。

测试qemu和内核启动是否成功

qemu-system-arm  -M vexpress-a9 -m 512M -nographic -append "console=ttyAMA0" -kernel  /root/zImage-3.0

这里简单介绍下qemu命令的参数:

-M vexpress-a9 模拟vexpress-a9单板,你可以使用-M ?参数来获取该qemu版本支持的所有单板
-m 512M 单板运行物理内存512M
-kernel /root/zImage-3.16  告诉qemu单板运行内核镜像路径
-nographic 不使用图形化界面,只使用串口
-append "console=ttyAMA0" 内核启动参数,这里告诉内核vexpress单板运行,串口设备是哪个tty。 

发现启动到挂载根文件系统的时候出现kernel painc,说明内核已经正常启动了。然后需要制作根文件系统。

制作根文件系统

编译busybox

wget http://www.busybox.net/downloads/busybox-1.20.2.tar.bz2 
make defconfig
make CROSS_COMPILE=arm-linux-gnueabi-
make install 

安装完成后,会在busybox目录下生成_install目录,该目录下的程序就是单板运行所需要的命令。

形成根文件系统

  1. 创建rootfs目录(根目录),根文件系统内的文件全部放到这里
    sudo mkdir rootfs
  2. 拷贝busybox命令到根目录下
    sudo cp busybox-1.20.2/_install/* -r rootfs/

制作根文件系统镜像

  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启动自定义系统

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

从内核启动打印,到命令行提示符出现,到此qemu的arm环境就搭建完成了,可以 用来做内核学习了。
但是目前方式挂载的根文件系统使用起来很麻烦,每次修改完代码重新编译之后都需要重新制作文件系统镜像。因此更推荐后边的做法。

使用nfs文件系统启动

安装nfs服务程序

sudo apt-get install nfs-kernel-server

创建nfs共享文件夹

将前边创建的rootfs文件夹的权限修改为777
sudo chmod 777 /root/rootfs
修改/etc/exports文件
sudo vim /etc/exports
添加/root/rootfs *(rw,insecure,sync,no_root_squash)

启动nfs服务

sudo /etc/init.d/nfs-kernel-server start
测试一下nfs环境是否搭建成功
sudo mount -t 127.0.0.1:/root/rootfs /mnt/
ls /mnt查看是否挂载成功
sudo umount /mnt

qemu挂载nfs根文件系统

qemu-system-arm  -M vexpress-a9 -m 512M -nographic -append "console=ttyAMA0 root=/dev/nfs nfsroot=/root/rootfs rw ip=dhcp nousb" -kernel  /root/zImage-3.16

其中nfsroot=后边是nfs根文件系统位置
ip=dhcp指定qemu guest os 的ip分配方式

至此可以很方便的使用qemu挂载nfs文件系统进行内核学习和开发了。
本文错略的介绍了qemu搭建内核学习的过程,没有过多的关注细节,有兴趣的可以研究一些qemu的其他参数,qemu的网络配置,以及更详细的文件系统构建方法。

你可能感兴趣的:(ARM内核和驱动)