移植Busybox
所谓制作根文件系统,就是创建各种目录,并且在里面创建各种文件。比如/bin、/sbin目录下存放各种可执行程序,在/etc目录下存放配置文件,在/lib目录下存放库文件。
在创建一个最小的根文件系统时,使用Busybox的话,只需要在/dev目录下创建必要的设备节点、在/etc目录下创建一些配置文件就可以了,如果Busybox使用动态连接,还要在/lib目录下包含库文件
inittab文件解析
/etc/inittab文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下:
<id>:<runlevels>:<action>:<process>
id:表示这个子进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省略,则使用与init进程一样的控制台
runlevels:对于Busybox init程序,这个字段没有意义,可以省略
action:表示init进程如何控制这个子进程,有8种取值
action名称 | 执行条件 | 说明 |
---|---|---|
sysinit | 系统启动后最先执行 | 只执行一次,init进程等待它结束才继续执行其它动作 |
wait | 系统执行完sysinit进程后 | 只执行一次,init进程等待它结束才继续执行其它动作 |
once | 系统执行完wait进程后 | 只执行一次,init进程不等待它结束 |
respawn | 启动玩once进城后 | init进程监测发现子进程退出时,重新启动它 |
askfirst | 启动完respawn进城后 | 与respawn类似,不过init进程先输出“Please press Enter to activate this console”,等用户输入回车键之后才启动子进程 |
shutdown | 当系统关机时 | 即重启、关闭系统命令时 |
restart | busybox中配置了CONFIG_FEATURE_USE_INITTAB,并且init进程接收到SIGHUP信号 | 先重新读取、解析/etc/inittab文件,再执行restart程序 |
ctrlaltdel | 按下ctrl+al+del组合键时 | - |
- process:要执行的程序,它可以是可执行程序,也可以是脚本。如果字段前有’-‘字符,这个程序被称为“交互的”。
inittab总结
- 在系统启动前期,init进程首先启动action为sysinit、wait、once的3类子进程
- 在系统正常运行期间,init进程首先启动action为respawn、askfirst的两类子进程,并监视它们,发现某个子进程退出时重新启动它
- 在系统退出时,执行action为shutdown、restart、ctrlaltdel的3类子进程(之一或全部)
glibc库
加载器ld-2.3.6.so、ld-linux.so.2
动态程序启动前,它们被用来加载动态库
目标文件(.o)
比如crt1.o、crti.o、crtn.o、gcrt1.o、mcrt1.o等。在生成应用程序时,这些文件像一般的目标文件一样被连接
静态库文件(.a)
比如静态数学库libm.a、静态c++库libstdc++.a等,编译静态程序时会连接它们
动态库文件(.so、.so.[0-9]*)
比如动态数学库libm.so、动态c++库libstdc++.so等,它们可能是一个链接文件
libtool库文件(.la)
在连接库文件时,这些文件会被用到。比如它们列出了当前库文件所依赖的其它库文件,程序运行时无需这些文件
gconv目录
里面是有头字符集的动态库
ldscripts目录
里面是各种连接脚本,在编译应用程序时,它们被用于指定程序的运行地址、各段的位置等
readelf -a xxx.elf | grep “Shared”