1.打开第一个设备--对应linux函数open("dev/console")这个文件对应终端
2.运行run_init_process(execute_command);其中execute_command是uboot命令行参数,由uboot指定运行的文件
如果uboot没有指定,则输出打印信息,运行其他run_init_process();
对应代码段:
if(execute_command) {
run_init_process(execute_command);
printk();
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
所以运行的第一个程序要么是uboot指定,要么是根文件系统中的/sbin/init;
要启动应用程序,首先得先识别文件系统,挂接根文件系统,才能去启动。
明白上面这些后,接下来就需要编译busybox了
linux下执行命令,实际上是执行busybox这个应用程序,命令是连接到busybox的
init也是来自busybox,内核执行完uboot指定的程序后就执行busybox产生的init程序
init程序做什么呢?
a.配置
b.解析配置文件
c.执行程序
busybox会调用init_main
打开配置文件/etc/inittab
inittab是用来启动指定的应用程序,从inittab的格式可以看出来:
<id>:<runlevels>:<action>:<process>
id => /dev/id,用做终端
runlevels:忽略
action:执行条件
process:应用程序或脚本
做完这些之后调用new_init_action
new_init_action做什么呢
a.创建一个init_action()
b.把这个结构放入init_action_list链表
从默认的new_init_action反推出默认的配置文件,一下程序生成默认配置
/* Reboot on Ctrl-Alt-Del */
new_init_action(CTRLALTDEL, "reboot", "");
/* Umount all filesystems on halt/reboot */
new_init_action(SHUTDOWN, "umount -a -r", "");
/* Swapoff on halt/reboot */
if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");
/* Prepare to restart init when a HUP is received */
new_init_action(RESTART, "init", "");
/* Askfirst shell on tty1-4 */
new_init_action(ASKFIRST, bb_default_login_shell, "");
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
/* sysinit 这里执行的是/etc/init.d/rcS*/
new_init_action(SYSINIT, INIT_SCRIPT, "");
看注释可以知道一些了
从默认可以看出linux系统至少需要以下配置,这些配置就需要编译进文件系统的
即最小的根文件系统包含以下东西
·····································
/dev/console /dev/null (设备)
/etc/inittab (配置文件)
库(应用程序中的函数由库提供)
init本身,即busybox
····································
那么如何构建我们的最小根文件系统呢:
有下面几步:
1.编译busybox:
配置busybox,命令:make menuconfig
直接make
安装到指定目录,切记不能直接make install 命令:make CONFIG_PREFIX=指定目录 install
2.创建/dev/console终端设备,/dev/null设备
3.创建配置文件:
创建/etc/目录, 命令:mkdir /etc/
创建配置文件/inittab,命令 vi etc/inittab,在里面输入console::askfirst:-/bin/sh
4.安装库
在生成的文件系统里创建lib目录,把arm-linux-gcc中的动态库用软连接拷贝到刚刚创建的lib目录中。
以上4步做完了后,将文件系统做成映像文件,使用mkyaffs2image命令,在烧写到nandflash root分区,最小文件系统就做好了!!!