转载至http://blog.csdn.net/linyt/article/details/42504975

下载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单板支持是否够友好。

运行命令很简单:

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


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


Logo

更多推荐