笔记整理—内核!启动!—kernel部分(6)buxybox详解
上一章我们说到busybox,但还有一部分没有说完,busybox的配置与kernel的menuconfig几乎一样。也是配置然后make、makeinstall,kbuild是busybox的makefile,可以根据installtion options设定安装位置,安装后会出现/bin、/linuxrc、/sbin、/usr等文件夹。
inittab文件与busybox有关,与init进程1文件有关,是一个配置文件,放在etc目录下。inittabs是一个文本格式的文件,其中的格式如下:
::sysinit:
::是格式,sysinit是项目
id:rulevels:action:process
id为id字段,rulevels为运行级别,action为操作,process为执行进程
busybox最终进入一个循环,当某个action满足,则执行这个操作的进程,所以inittab将会一直使用。
action:respawm=>若process字段不存在,就会启动这个操作。
wait=>启动进程,等待处理结束后进入下一个进程
once=>只执行一次
boot=>只在系统启动时才启动一次
sysinit=>在访问控制台前执行(rcs)
askfirst=>让用户按下回车(控制台准备好了,可用respawn代替这样就不用回车了)
ctrlabtdel=>满足ctrl+alt+del则(重启)
shutdown=>关机就(取消挂载文件系统)
estart=>重启
对于busybox而言coreutils是核心,用于存放核心指令。
busybox的入口:kernel或uboot等的裸机程序入口不在main,而是在链接脚本,mian适用于应用层程序,作为其程序开始的标志,因为busybox是一个应用程序所以mian是其入口。
kconfig是一个编译用工具文件夹,如果一个文件被使用了,会被编译为.o文件,但不是所有.o文件都有作用,在应用层上,有点编译了但并没有链接。
busybox的main位置位于libbb/appletlib.c中,xxx_main()是支持的每一个程序的入口。
busybox的ls、pwd、......都链接到了busybox,而非单独的一根个程序,通过如ls_main()去实现ls指令。在run_applet_and_exit(applet,argv)进行的指令调用,找不到就打印not find。
inittab解析:busybox/init/initial.c/init_mian函数.console_init()初始化控制台,chdir("/")切换到根目录;setsid() super id;puyenv()保存环境变量;parse_inittab 解析inittab。
inittab的作用:将action与process解析出来,然后执行一次sysinit、wait、once。在while(1)中执行respwan与askfurst。
pwd指令:pwd_main()->buf=realloc_getcwd_or_warn->getcwd()(这是一个库函数)
busybox的shell指令是阉割了的版本,能用但功能不全,只是对一些指令做了集合,ubuntu的vmlinuz作为内核是未压缩的。
本章对busybox的解析就做到这,下一章将对rcs文件进行解析。