• BusyBox源码分析


    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中)

  • 相关阅读:
    Python打包(构建)、分发、安装 简要介绍
    发电行业中的5G组网模式分析
    第三百零四节 Log4j教程 - Log4j配置
    搭建Nacos集群
    【QT基础入门】QT中的容器类:QList
    LeetCode 513找树左下角的值 112路径总和113路径总和ii 106从中序与后序遍历序列构造二叉树
    3.DIY可视化-拖拽设计1天搞定主流小程序-前后分离框架运行
    Gitlab分支策略建议指南
    07 SpringMVC 拦截器
    Java 接口拦截器的实现以及返回
  • 原文地址:https://blog.csdn.net/oqqHuTu12345678/article/details/72715573