作者:李浩
硬件平台:OMAP-L138+DDR
软件平台:linux2.6.32
所需软件:busybox1.17.3(http://www.busybox.net/downloads/)
前述:
init进程是内核启动完毕后执行的第一个进程。下面的代码是内核启动最后阶段执行的内容在init_post函数中(/kernel-2.6.32/init/main.c):
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"); panic("No init found. Try passing init= option to kernel.");
上述代码中,execute_command是bootloader引导内核时传递给内核的参数init的值。从代码中可以看出,如果没有传递init参数给内核,则内核会顺次执行/sbin/init,/etc/init等程序作为init进程,这些代码实际上是在1号进程中执行的,但在执行时它还只是一个内核进程,run_init_process函数执行成功后不会返回,它将使当前进程转变为一个用户态进程。因此,init进程可以说是从内核态到用户态的的一座桥梁。
从用户态来看,init进程是所有进程的祖先,其PID为1。init进程执行什么内容决定了整个系统是怎么初始化的。一般来说,它会根据相关配置文件执行,决定启动哪些应用程序同时监控这些应用程序的运行。
因此,作为一个可用的根文件系统,必须包含一个供init进程执行的可执行文件,可称为init文件。在嵌入式系统中,通常采用busybox软件包来提供这个文件。
操作步骤:
1、创建目录
首先创建一个目录,作为整个文件系统的根文件目录
mkdir rootfs
mkdir rootfs/rootfs_1.17
mkdir rootfs/rootfs_build
下面是一个根文件系统所需要的主要目录:
/bin:存放基本命令的可执行文件
/sbin:存放基本系统管理类命令的可执行文件
/lib:存放基本的共享库
/dev:存放设备文件
/etc:存放各种配置文件
/usr:包含若干子目录,存放用户程序和文档
/usr/bin:存放用户程序的可执行文件
/usr/sbin:存放用户系统管理类程序的可执行文件
/usr/lib:存放用户程序所需要的共享库
/proc:用于挂载proc文件系统
/sys:用于挂载sysfs文件系统
/tmp:存放临时文件
/var:存放系统日志及一些服务程序的临时文件等
mkdir {bin,dev,etc,usr,lib,sbin,proc,sys,tmp}
创建设备文件:
Linux下的设备文件按惯例都存放在/dev目录下,应用程序一般都需要通过设备文件来访问相应的设备,现在Linux系统上一般都采用udev来管理设备文件,这是一个专门用于管理设备文件的服务程序,它会根据/sys目录中的系统信息自动在/dev目录下创建或者删除设备文件。
但是udev要产生作用,首先必须将sysfs文件系统挂载到/dev下,然后启动udev服务,这些工作一般在系统的初始化脚本中进行。然而系统初始化时要执行程序则必须有以下两个设备存在:/dev/console和/dev/null。这两个设备只能预先放在根文件系统中。
用以下命令来创建这两个设备文件:
sudo mknod -m 600 rootfs_1.17/dev/console c 5 1
sudo mknod -m 666 rootfs_1.17/dev/null c 1 3
在嵌入式系统中,出于某种需要可能不希望动态创建设备文件,这时,所需设备文件就要用mknod命令预先在根文件系统中创建,或者将创建设备文件的命令写入系统的初始化脚本中。
安装共享库:
拷贝交叉工具链中的共享库
/opt/TOOLS/compiler/arm-none-linux-gnueabi/libc/lib
到
/rootfs/rootfs_1.17/lib
安装busybox:
参考
http://kinglaw05.blog.163.com/blog/static/596833142010450154463/
创建配置文件:
1、创建/etc/init.d/rcS如下:
#!/bin/sh
export PATH=/sbin:/bin:/usr/sbin:/usr/bin
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mount -t tmpfs mdev /dev
mount -t tmpfs tmp /tmp
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
由于执行初始化脚本与最后登录的并不是同一个shell,所以在这里定义的环境变量不可能自动导入登录以后的shell
使用flash文件系统:
mkfs.jffs2 -n -s 2048 -e 128KiB -d rootfs_1.17 -o rootfs.jffs2
-n:表示不要再每个檫除块上都加上清除标志;
-s 2048:表示每页大小为2048个字节
-e 128KiB:表示檫除块大小为128KB
-d rootfs_1.17:表示根文件系统目录为rootfs_1.17
-o rootfs.jffs2:表示输出的映像文件为:rootfs.jffs2
最后烧写到flash即可!