LINUX根文件系统分析
来源:互联网 发布:godaddy域名邮箱设置 编辑:程序博客网 时间:2024/05/16 16:09
1)uboot目的:启动内核;
2)内核目的:启动应用程序;
那么应用程序在哪儿?在根文件系统中;
3)因此我们还要构建根文件系统
内核启动之后,会去启动哪个应用程序呢?
内核怎样启动第一个应用程序?
1.open(/dev/console) //打开终端
2.sys_dup(0); //复制上面打开的文件
3.sys_dup(0); //复制上面打开的文件
这三句话的意思是打开终端,分别代表标准输出,标准输入,标准错误,跟输入输出相关;
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults...\n", execute_command);
}
此句用于判断和执行由uboot启动参数传入的init程序,如果有则执行,uboot没有init这一参数的输入的话,接着往下执行。
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
这些都是用于启动应用程序的,但run_init_process()函数特点是成功执行则不返回,执行失败才返回,即如果/sbin/init文件被执行的话,后面的就不用执行了。
挂接根文件系统后才能去启动应用程序。下面开始了解文件系统的内容,跟进/sbin/init进程,分析一下看看进程需要哪些东西。
busybox是系统应用程序的总和,如ls、cp、cd等,我们使用ls的时候会连接到busybox,执行ls的时候就等于执行busybox ls。
busybox中有init程序,其工作:
1.读取用户程序配置文件;
2.解析配置文件;
3.执行用户程序:配置文件应该包括a.指定程序b.何时执行;
busybox->init_main
parse_inittab
file=open(INITTAB,"r"); //打开配置文件/etc/inittab
new_init_action //1.创建一个init_action结构,填充;2.把这个结构放入链表init_action_list;
配置文件/etc/inittab格式:
<id>:<runlevels>:<action>:<process>
id会加上前缀/dev/,这个可以省略
id=>/dev/id,用作终端:stdin,stdout,stderr即printf,scanf,err;
runlevels :忽略;
action :执行时机,即何时执行;
process :要执行的应用程序或脚本;
new_init_action的工作:
1.创建一个init_action结构,填充;
2.把这个结构放入链表init_action_list;
如果没有配置文件,new_init_action会执行默认工作,由默认工作反推默认配置文件:
::ctrlaltdel:reboot
::shutdown:umount -a -r
::restart:init
::askfirst:-/bin/sh
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
那么,我们总结一下以上进程需要哪些文件?
/dev/console /dev/null
/etc/inittab
配置文件指定应用程序
库
init本身,来源于busybox
其中/dev/null用于未指定id(终端)时标准输入输出指向的终端位置;
那么最小的根文件系统需要的项:
1./dev/console
/dev/null
2.init=>busybox;
3./etc/inittab;
4.配置文件中指定的程序;
5.C库;
那么我们一一创建上面各项,并将其制作成一种文件系统的格式,就构建成了一个根文件系统。
这里注意,如果我们是在linux操作系统下编译busybox,用于其它系统安装,那么在配置(make menuconfig)、编译(make)完之后,千万不要直接make install,否则会影响本机系统,应该make CONFIG_PREFIX=/path/from/root install,即指定路径安装,/path/from/root为自己指定的安装目录。这一点busybox的INSTALL中有说明。
2)内核目的:启动应用程序;
那么应用程序在哪儿?在根文件系统中;
3)因此我们还要构建根文件系统
内核启动之后,会去启动哪个应用程序呢?
内核怎样启动第一个应用程序?
1.open(/dev/console) //打开终端
2.sys_dup(0); //复制上面打开的文件
3.sys_dup(0); //复制上面打开的文件
这三句话的意思是打开终端,分别代表标准输出,标准输入,标准错误,跟输入输出相关;
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults...\n", execute_command);
}
此句用于判断和执行由uboot启动参数传入的init程序,如果有则执行,uboot没有init这一参数的输入的话,接着往下执行。
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
这些都是用于启动应用程序的,但run_init_process()函数特点是成功执行则不返回,执行失败才返回,即如果/sbin/init文件被执行的话,后面的就不用执行了。
挂接根文件系统后才能去启动应用程序。下面开始了解文件系统的内容,跟进/sbin/init进程,分析一下看看进程需要哪些东西。
busybox是系统应用程序的总和,如ls、cp、cd等,我们使用ls的时候会连接到busybox,执行ls的时候就等于执行busybox ls。
busybox中有init程序,其工作:
1.读取用户程序配置文件;
2.解析配置文件;
3.执行用户程序:配置文件应该包括a.指定程序b.何时执行;
busybox->init_main
parse_inittab
file=open(INITTAB,"r"); //打开配置文件/etc/inittab
new_init_action //1.创建一个init_action结构,填充;2.把这个结构放入链表init_action_list;
配置文件/etc/inittab格式:
<id>:<runlevels>:<action>:<process>
id会加上前缀/dev/,这个可以省略
id=>/dev/id,用作终端:stdin,stdout,stderr即printf,scanf,err;
runlevels :忽略;
action :执行时机,即何时执行;
process :要执行的应用程序或脚本;
new_init_action的工作:
1.创建一个init_action结构,填充;
2.把这个结构放入链表init_action_list;
如果没有配置文件,new_init_action会执行默认工作,由默认工作反推默认配置文件:
::ctrlaltdel:reboot
::shutdown:umount -a -r
::restart:init
::askfirst:-/bin/sh
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
那么,我们总结一下以上进程需要哪些文件?
/dev/console /dev/null
/etc/inittab
配置文件指定应用程序
库
init本身,来源于busybox
其中/dev/null用于未指定id(终端)时标准输入输出指向的终端位置;
那么最小的根文件系统需要的项:
1./dev/console
/dev/null
2.init=>busybox;
3./etc/inittab;
4.配置文件中指定的程序;
5.C库;
那么我们一一创建上面各项,并将其制作成一种文件系统的格式,就构建成了一个根文件系统。
这里注意,如果我们是在linux操作系统下编译busybox,用于其它系统安装,那么在配置(make menuconfig)、编译(make)完之后,千万不要直接make install,否则会影响本机系统,应该make CONFIG_PREFIX=/path/from/root install,即指定路径安装,/path/from/root为自己指定的安装目录。这一点busybox的INSTALL中有说明。
从上面所说,我们知道最小的根文件系统需要的项包括:
1./dev/console
/dev/null
2.init=>busybox;
3./etc/inittab;
4.配置文件中指定的程序;
5.C库;
那么我们一一创建上面各项,并将其制作成一种文件系统的格式,就构建成了一个根文件系统。
先来创建两个设备文件/dev/console和/dev/null:
从主机上查看这两个文件可以看到,/dev/console是主设备号为5,次设备号为1的设备节点,/dev/null是主设备号为1,次设备号为3的设备节点;
那么我们到busybox的安装文件中创建dev,在其中创建设备节点console和null,指定其相应设备节点,与上面查看的一致,这样上节提到的最小根文件系统中的第一项就完成了;
接着来创建第三项,用户程序配置文件/etc/inittab(第二项在busybox的安装中完成了):
直接在busybox安装目录下创建etc目录下创建inittab配置文件,并按照该配置文件的格式,添加启动项即可,例如console::askfirst:-/bin/sh,此项完成;
第四项应用程序暂时不需要,先做最小根文件系统,不运行应用程序;
第五项C库:
busybox安装路径下最小文件系统目录下创建lib,将glibc下的lib中.so文件全部拷贝到的该lib中即可,如:
$ cd ~/gcc-3.4.5-glibc-2.3.6/arm-linux/lib
$ cp *.so* /path/from/root/fs_mini/lib -d
完成C库创建,其中-d表示如果该库文件问连接文件,则让它保持链接文件属性,否则会把所有源文件都考过去,那样会很大。
那么这个最下的根文件系统怎么烧到开发板中去?
我们需要用相应的工具做一个映像文件。如使用yaff2的工具转成*.yaff2的影响文件等。生成后,得到的即为可烧写到开发板的映像文件。
1./dev/console
/dev/null
2.init=>busybox;
3./etc/inittab;
4.配置文件中指定的程序;
5.C库;
那么我们一一创建上面各项,并将其制作成一种文件系统的格式,就构建成了一个根文件系统。
构建根文件系统
我们首先来配置、编译好busybox,并安装在指定目录下,上节中所说的最小根文件系统的第二项init也就做好了。注意,如果我们是在linux操作系统下编译busybox,用于其它系统安装,那么在配置(make menuconfig)、编译(make)完之后,千万不要直接make install,否则会影响本机系统,应该make CONFIG_PREFIX=/path/from/root install,即指定路径安装,/path/from/root即为自己指定的安装目录。这一点busybox的INSTALL中有说明。下面来做其他几项并且将该文件夹做成某种格式。先来创建两个设备文件/dev/console和/dev/null:
从主机上查看这两个文件可以看到,/dev/console是主设备号为5,次设备号为1的设备节点,/dev/null是主设备号为1,次设备号为3的设备节点;
那么我们到busybox的安装文件中创建dev,在其中创建设备节点console和null,指定其相应设备节点,与上面查看的一致,这样上节提到的最小根文件系统中的第一项就完成了;
接着来创建第三项,用户程序配置文件/etc/inittab(第二项在busybox的安装中完成了):
直接在busybox安装目录下创建etc目录下创建inittab配置文件,并按照该配置文件的格式,添加启动项即可,例如console::askfirst:-/bin/sh,此项完成;
第四项应用程序暂时不需要,先做最小根文件系统,不运行应用程序;
第五项C库:
busybox安装路径下最小文件系统目录下创建lib,将glibc下的lib中.so文件全部拷贝到的该lib中即可,如:
$ cd ~/gcc-3.4.5-glibc-2.3.6/arm-linux/lib
$ cp *.so* /path/from/root/fs_mini/lib -d
完成C库创建,其中-d表示如果该库文件问连接文件,则让它保持链接文件属性,否则会把所有源文件都考过去,那样会很大。
那么这个最下的根文件系统怎么烧到开发板中去?
我们需要用相应的工具做一个映像文件。如使用yaff2的工具转成*.yaff2的影响文件等。生成后,得到的即为可烧写到开发板的映像文件。
0 0
- LINUX根文件系统分析
- Linux根文件系统分析
- linux 根文件系统挂载分析(二)
- Linux 根文件系统的挂载分析
- Linux操作系统根文件系统的启动分析
- linux根文件系统-粗略分析学习笔记
- linux根文件系统init进程分析
- Linux 根文件系统的挂载分析
- Linux文件系统分析
- Linux文件系统分析
- Linux文件系统结构分析
- Linux文件系统架构分析
- linux文件系统的启动分析
- Linux kernel FAT32文件系统分析
- linux文件系统的启动分析
- Linux kernel FAT32文件系统分析
- Linux kernel FAT32文件系统分析
- linux 虚拟文件系统分析笔记
- 谈数据库索引和Sqlite中索引的使用
- 编译原理-02
- hadoop命令行中自定义计数器
- Linux trouble shooting
- dede文章摘要字数的设置方法
- LINUX根文件系统分析
- 【函数】最大公约数和最小公倍数
- 蓝桥杯——奇怪的比赛
- Filter(一)配置及生命周期
- 多线程 同步代码块
- R-什么是slot插槽?
- win7主机和vm上的ubuntu共享文件夹简单三步搞定
- 锂电池参数含义及简单选择
- UVa:254 Towers of Hanoi