时至今日,我几乎对高一的生活没有多少印象了……但对这句话却一直印象深刻。
只要一个人真的想做一件事情,那他就能做到这件事情。
好吧,开始我们的文件系统移植……
目标平台跟我上一篇blog的一样,就不多说了。
第一步,首先咱来准备一下yaffs2的源码
上次说了被友善忽悠了,光盘里压根没有yaffs2的源码,于是只能到yaffs2的官网去找。大概是这个网址http://www.aleph1.co.uk/gitweb?p=yaffs2.git;a=summary,然后点一下shotlog标题,会出现一长串的列表,然后为了与友善的版本尽量保持一致(手册里面的貌似是2010.3月的版本),于是就下了20100330这个版本回来,就是点一下2010.03.30这个日期右边的snapshot就行了,然后就会自动下载。最新版本的yaffs2我没有试过,不知道会不会出问题,迟点再试。
第二步,解压源码,为内核打上支持yaffs2的补丁
假设解压在/opt/myYaffs,然后进入myYaffs2,执行命令脚本./patch.ker-sh c /your linux kernel path ,填上内核源码路径按确定。如果出现一些提示,那就填./patch.ker-sh c m /your linux kernel path 新版本的yaffs2会这样。这样就打好补丁了。事实上这个脚本完成了3项功能:
(1) 修改内核fs/Kconfig
增加一行:source "fs/yaffs2/Kconfig"
(2) 修改内核fs/Kconfig
增加一行:ojb-$(CONFIG_YAFFS_FS) +=yaffs2/
(3) 在内核fs/目录下创建yaffs2目录
将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;
将yaffs2 源码目录的Kconfig文件复制到内核fs/yaffs2目录下;
将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.
第三步,验证yaffs2是否移植成功
进入内核目录make menuconfig,知道yaffs2的配置项,选中,保存退出,然后make zImage。把img下载到板子上,如果能启动友善的文件系统,出现
please press enter to activate this console.
就算成功了。
第四步,制作基本的文件系统
这步是最关键的,事实上前面那些都是很简单的,按照手册来就行(事实上这步基本也是按照手册……- -!)。
这里也说一下帮助文档的重要性。事实上busybox自带的一些文档是很好的资料,虽然是全英文,但是不要怕,都是很简单的。比如说/ect/rc.d/rcS,fstab等文件,都能在其文档里找到模板,另外还有其他的一些比如介绍mdev的文档,结合这些文档,对那些配置文件里面的内容就很好理解了。当然,我们可以上网查这些,但是万一网上没呢,还不是得靠自己。
linux对根文件系统的某些部分是有规定的,比如顶层必须有哪些文件夹,必须有哪些配置文件等,具体如何可以查看友善的文档。
我们创建一个新的脚本文件(也可以一条命令一条命令的输入),就叫create_rootfs吧,填入友善提供给我们的代码:
#!/bin/sh
echo "------Create rootfs directons start...--------"
mkdir rootfs
cd rootfs
echo "--------Create root,dev....----------"
mkdir root dev etc boot tmp var sys proc lib mnt home usr
mkdir etc/init.d etc/rc.d etc/sysconfig
mkdir usr/sbin usr/bin usr/lib usr/modules
echo "make node in dev/console dev/null"
mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null c 1 3
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/run var/tmp
chmod 1777 tmp
chmod 1777 var/tmp
echo "-------make direction done---------"
对命令内容不理解的请复习Linux Shell编程,可以上网查。
然后建立/etc目录下的文件。这些都是配置文件,是使用busybox所必须的。有人问为啥要在这里写配置文件,为什么不在别处写,为什么不写别的文件就写这些文件…………这是由于busybox的初始化而决定的。
内核在初始化的最后阶段会调用设置好的init参数所指向的程序,我们可以在启动的时候看到这行信息:
Kernel command line: noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
如果我们使用busybox来构建我们的文件系统,那/linuxrc实际是一个指向busybox的链接,所以内核初始化完成后启动的第一个程序就是busybox。
内核相关代码如下:
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING"Failed to execute %s. Attempting"
"defaults.../n",execute_command);
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
在启动参数中设定了init=linuxrc,所以一般只执行run_init_process(execute_command);,后面的就没有机会执行了(run_init_process永不返回),如果没有指定execute_command,那么才依次执行后面的run_init_process,如果全部没有找到,内核就死机。Panic!
在busybox的初始化代码init/init.c中,busybox会首先初始化控制台,所以/dev/console是必须的。然后其会分析/etc/inittab文件,然后执行配置文件INIT_SCRIPT,INIT_SCRIPT是一个宏,他被定义为:
#define INIT_SCRIPT "/etc/init.d/rcS"/* Default sysinit script. */
所以busybox会去执行/etc/init.d/rcS这个配置文件.
rcS这个配置文件可以做你想做的一切事情。比如挂载文件系统,启动一些系统服务,等等。
我们可以看到下面这行:
mount -a
这行命令的意思是挂载/etc/fstab文件里面的所有文件系统。当然我们也可以一个一个的来挂载。还有人说,那我不懂这文件的格式啊~~
嗯,貌似这个世界上有一个叫google的公司,他提供了一种服务,叫“搜索服务”…………
现在明白为什么需要那么些文件了吧?
顺便说一下,busybox的文档里面有某些配置文件的示例代码,放在busybox源码的example文件夹里。
由于整个过程实在是烦得很~~~我给个链接吧~都一样的~~
点这里看详细过程
好吧,终于建好这些文件了…………
第五步,编译busybox
这就比较简单了,进入busybox-1.13.3的目录,修改顶层makefile
CROSS_COMPILE ?=arm-linux- //大约在164行
ARCH ?=arm //大约在189行
cp fa.config .config
直接 make CONFIG_PREFIX=/your_rootfs_dir install
等待编译完成。
第六步,打包文件系统
解压友善提供的打包文件系统的工具mkyaffs2img-128M(我的是256M的Flash,我用的就是这个,如果这个不行,换另外一个),然后输入:
mkyaffs2img-128M rootfs rootfs.img
完成,下载到开发板测试。
如果看到:Please press Enter to activate this console.
那恭喜你,你成功了!Well Done!
好了,先写到这里,然后打算再写一遍“打造自己的文件系统”,有图形系统的喔
~~~O(∩_∩)O~