linux系统如何启动第一个应用程序--构建根文件系统

来源:互联网 发布:lol淘宝权女刘静雯 编辑:程序博客网 时间:2024/06/03 17:04

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分区,最小文件系统就做好了!!!












0 0
原创粉丝点击