虚拟机:Virtual Box4.2.6 和VMware Workstation6.5.2(这两种虚拟机都成功实作过)
开发环境:Linux版本2.6.32,采用Ubuntu10.04
arm-linux-gcc版本:3.4.1
Busybox版本:1.7.0
开发板:飞凌嵌入式S3C2440
开发板linux内核版本:linux2.6.28
一、概念:
Linux不像windows有C、D、E、F等盘符概念,它是以速树状结构管理所有目录和文件,其他分区挂接在某个目录上,这个目录就被称为
挂接点,然后可以通过这个目录来访问这个分区上的文件。根文件系统被挂接在根目录“/"上,在根目录下就有根文件系统的各个目录。
与windows下C盘类似,Linux需要在一个分区上存放系统启动说必须的文件(如内核映象文件,内核启动后运行的第一个程序(init),shell,应用程序依赖的库等),这些必须的文件合称为根文件系统,它存放在一个分区中。linux启动后首先挂接这个分区,称为挂接根文件系统。
二、安装配置Busybox
首先需要安装并配置busybox,这里使用busybox-1.7.0.tar.bz2,将其放在虚拟机/home/book目录下解压:
输入解压命令:
tar xjf busybox-1.7.0.tar.bz2,然后进入解压后的文件夹
,找到
INSTALL这个文件
,并复制到共享文件夹:
通过windows下的软件打开该文件,里面写有安装busybox的步骤:
1.首先再回到busybox解压后目录,make menuconfig
然后出来一个配置busybox选项窗口,类似配置内核窗口一样
这里主要按照韦东山视频和书本里面配置方式,主要添加一个Tab补全键功能,一般默认的busybox木有这个功能,配置这个功能会给嵌入式开发研究带来极大便利
然后需要修改busybox里面的Makefile文件,vi Makefile后将交叉编译器修改为arm-linux-
2.然后执行第二步:make,结果出现了2个error
通过百度查找分别找到答案:
(1)miscutils/taskset.c:17: error: parse error before ‘*‘ token
miscutils/taskset.c:18: warning: function declaration isn‘t a prototype miscutils/taskset.c: In function `__from_cpuset‘:
miscutils/taskset.c:22: error: `CPU_SETSIZE‘ undeclared (first use in this function) miscutils/taskset.c:22: error: (Each undeclared identifier is reported only once miscutils/taskset.c:22: error: for each function it appears in.)
miscutils/taskset.c:26: warning: implicit declaration of function `CPU_ISSET‘ miscutils/taskset.c:26: error: `mask‘ undeclared (first use in this function) miscutils/taskset.c: In function `taskset_main‘:
miscutils/taskset.c:47: error: `cpu_set_t‘ undeclared (first use in this function) miscutils/taskset.c:47: error: parse error before "mask"
miscutils/taskset.c:68: warning: implicit declaration of function `CPU_ZERO‘ miscutils/taskset.c:68: error: `new_mask‘ undeclared (first use in this function) miscutils/taskset.c:69: error: `CPU_SETSIZE‘ undeclared (first use in this function) miscutils/taskset.c:71: warning: implicit declaration of function `CPU_SET‘ miscutils/taskset.c:78: error: `mask‘ undeclared (first use in this function)
make[1]: *** [miscutils/taskset.o] Error 1 make: *** [miscutils] Error 2
解决方法:make menuconfig
找到[Miscellaneous Utilities],去掉[task set]
(2)解决了(1)的问题再make又有了问题(2)
再次百度得知答案:
然后再make就成功了!!!
3.接下来是make install,但不能直接在该目录下执行,会引发错乱,应该另外建一个文件系统目录
mkdir -p /home/book/firstfs,然后执行
make CONFIG_PREFIX= /home/book/firstfs install,install后进入该目录,就会在该目录下构建了一个根文件系统
三、
构建根文件系统
利用busybox已经构建了一些根文件系统目录,但设备文件,应用执行文件,库和配置文件等都还没生成,所以下面就需要建立这些文件。
1.创建/dev/console和/dev/null
查看虚拟机linux根目录下的/etc里面的这两个设备号信息,然后在新建根文件系统下mknod这两个设备
2.创建/etc/inittab
在根文件系统目录下,创建inittab文件,首先mkdir etc,然后vi etc/inittab,输入以下内容:
查看inittab文件内容:
3.建立C 库
虚拟机下的linux版本不同C库位置有所区别,先在firstfs根文件系统目录下建立lib目录,然后将虚拟机下linux系统中如下图所示库文件(扩展名含有.so的文件)复制到新建根文件系统下的lib目录中,这里库文件含有.so是我们需要的动态库文件。
注:对于一般的虚拟机linux系统,这样的C库是在对应版本交叉编译器下的lib库中,比如我的飞凌开发板对于一般的ubuntu系统是/usr/local/arm/3.4.1/arm-linux/lib
4.建立了最小根文件系统
通过以上操作我们已经在虚拟机linux环境下的/home/book/firstfs目录下建立了最小根文件系统,如上图所示。
四、制作yaffs映象文件,烧写到开发板
1.安装生成yaffs2映像文件的命令
这里使用JZ2440提供的yaffs_source_util_larger_small_page_nand.tar.bz2文件,是包含了大页小页flash的yaffs版本,进入所在目录,解压tar xjf yaffs_source_util_larger_small_page_nand.tar.bz2
得到Development_util_ok文件:
进入该目录下的
yaffs2目录,再进入
utils目录,然后在该目录下执行
make
生成了mkyaffs2image和mkyaffsimage两个执行文件,由于我的FL2440的Nand Falsh是大页(和JZ2440的Nand Flash一样),所以只需用到
mkyaffs2image文件:
2.制作yaffs映象文件
将生成的mkyaffs2image文件cp到虚拟机linux系统根目录下/usr/local/bin目录下,并加上可执行权限,然后回到/home/book目录下,准备将整个firstfs根文件系统目录生成映象文件:
输入命令
mkyaffs2image,可以看到下面会出现该命令的用法(usage),即该命令后面至少有2个参数,第一个参数是
根文件系统目录,第二个参数则是生成的
映像文件名。根据该用法再次输入完整命令:
mkyaffs2image firstfs/ firstfs.yaffs2
然后生成了最小根文件系统对应的映象文件
firstfs.yaffs2
接着启动开发板,在u-boot界面命令菜单下通过USB将该映象文件
firstfs.yaffs2烧写到开发板对应的文件系统分区fs_kernel,然后重启开发版linux系统,成功进入命令行界面,从而最小根文件系统移植成功:
五、进一步完善根文件系统
虽然最小根文件系统成功移植成功了,但毕竟是最小根文件系统,类似单片机最小系统一样,很多应用程序都没添加上来,包括最简单的ps命令都不能使用,而且还没添加udev机制,以至于驱动设备都没法自动添加,因而需要对该文件系统进一步完善。
1.挂接虚拟文件系统
很对应用程序命令(如ps),或者mdev(属于udev机制的一种简易版本)都需要挂接对应的虚拟文件系统(VFS)来实现,当然我们可以在开发板shell命令行输入:mount -t proc none /proc来实现在目录/proc挂接proc文件系统。但对于更多的文件系统手动添加比较麻烦,我们也可以将挂载命令加入到linux开机启动脚本中,使得开发板linux启动后自动挂接那些虚拟文件系统。
2.mdev机制的建立
在Busybox中存在一种mdev机制,它是属于udev机制的简易版本,我们可以到Busybox安装文件夹下去寻找其信息,可以找到mdev.txt,在windows下打开后,其基本用法(Basic Use)有6条:
我们将这6小点分别添加到
/etc/fstab和
/etc/init.d/rcS文件中,没有建立的可以先
mkdir和
vi(有的文件需要添加权限),包括需要挂载的虚拟文件系统目录
/proc、/sys、/tmp等:
我们可以在开机脚本/etc/init.d/rcS(该目录可以先mkdir,然后vi rcS)下加入一些挂载命令:
其中mount -a 命令是调用/etc/fstab文件中的内容来挂接系统的,因而还需要建立fstab文件,vi /etc/fstab,并添加需要挂接的虚拟文件系统,如下图:
而对于/etc/init.d/rcS脚本需要添加到
/etc/inittab启动文件中去:
然后回到/home/book目录下,再次将根文件系统制作成映象文件烧写到开发板,即:
mkyaffs2image firstfs/ firstfs.yaffs2
这样一个比较完整的根文件系统就移植成功了!!!