1、程序入口
- 分析一个程序,按照程序运行时的逻辑顺序来,因此要找到入口地址;
- 入口是main函数的情形,适用于是操作系统下的应用程序的情况。
- 在uboot和linux kernel这两个大的C语言的项目中,没有main函数,入口由连接脚本指定。
- busybox是linux启动起来后工作的一个应用程序,因此其中必然有main函数,而且main就是入口。
2、BusyBox中main函数
(1)有很多main函数,但是BusyBox的入口地址是libbb / appletlib.c中的main函数。(看有没有被编译生成对应的.o?)



(2)busubox中有很多xxx_main函数
- 是busybox支持的一个命令的真正入口;
- 譬如ls_main函数就是busybox当作ls函数使用时的入口程序。
- busybox每次执行时都是先执行其main,在main函数中识别(靠main函数的传参argv[0]来识别)真正要执行的函数(譬如ls),然后调用相应的xxx_main(譬如ls_main)来具体实现这个命令。
3、对inittab进行解析与执行
(1)对inittab进行解析的是busybox/init/init.c/init_main函数;
(2)执行逻辑

- 先通过parse_inittab函数解析/etc/inittab(解析的重点是将inittab中的各个action和process解析出来);
- 然后后面先直接执行sysinit和wait和once(注意这里只执行一遍),然后在while(1)死循环中去执行respwan和askfirst。
4、pwd命令执行路径分析
在busybox命令行下执行pwd命令时实际执行的是pwd_main这个函数。

5、busybox的体积优势原理
(1)busybox实际上就是把ls、cd、mkdir等很多个linux中常用的shell命令集成在一起了。
- 集成后的体积优势,即busybox程序的大小比busybox中实现的那些命令的大小加起来要小很多。
(2)busybox体系变小的原因
- 第一个是busybox本身提供的shell命令是阉割版的(busybox中的命令支持的参数选项比发行版中要少,譬如ls在发行版中可以有几十个-x,但是在busybox中只保留了几个常用的选项,不常用的都删除掉了);
- 第二个是busybox中因为所有的命令的实现代码都在一个程序中实现,而各个命令中有很多代码函数都是通用的(譬如ls和cd、mkdir等命令都会需要去操作目录,因此在busybox中实现目录操作的函数就可以被这些命令共用),共用会降低重复代码出现的次数,从而减少总的代码量和体积。
(3)经过分析,busybox的体积优势是嵌入式系统本身的要求和特点造成的。
(4)是否这样理解,ls,cd这些命令不是集成在内核中的,而是在根文件系统里面的。(准确地来说在busybox中)