方圆网通网站建设,建设中网站,优设网app手机下载,沧州商贸行业网站建设以下内容源于朱有鹏嵌入式课程的学习与整理#xff0c;如有侵权请告知删除。
参考博客 init进程的详解_天糊土的博客-CSDN博客_init进程 busybox详解_linuxarmsummary的博客-CSDN博客 前言 因为uboot给内核传参的bootargs中有“init/linuxrc”这个项目#xff0c;而由前面的…以下内容源于朱有鹏嵌入式课程的学习与整理如有侵权请告知删除。
参考博客 init进程的详解_天糊土的博客-CSDN博客_init进程 busybox详解_linuxarmsummary的博客-CSDN博客 前言 因为uboot给内核传参的bootargs中有“init/linuxrc”这个项目而由前面的分析可知/linuxrc这个二进制文件位于根文件系统中它指向根文件系统的/bin/busybox这个命令。因此这里先总结性地介绍/linuxrc这个文件然后再分析busybox的源码。 一、/linuxrc文件简介 1、/linuxrc文件是一个可执行的应用程序 1/linuxrc是应用层的程序和内核没有关系。 2/linuxrc在开发板当前内核系统下是可执行的。如果在ARM SoC的linux系统上运行那么这个程序就是用arm-linux-gcc编译链接的如果是在PC机linux系统下运行那么这个程序就是用gcc编译连接的。 3/linuxrc如果是静态编译连接的则直接可以运行如果是动态编译连接的必须提供必要的库文件才能运行。但实际上/linuxrc由内核直接调用执行因此用户没有机会去导出库文件的路径因此/linuxrc没法动态连接一般都是静态连接的。 2、/linuxrc执行时引出用户界面 /linuxrc应用程序即进程1是其他所有应用程序进程的祖宗进程。 比如用户操作界面由/linuxrc引出应用程序是直接或者间接地被/linuxrc调用执行的。用户界面程序、其他的应用程序就是进程2、3、4等等。 3、/linuxrc负责系统启动后的配置 为了让操作系统用起来更方便更具实用性操作系统启动后还需要进行配置一般叫做运行时配置英文简写是etc/linuxrc负责系统启动后的配置。 4、/linuxrc在嵌入式linux中一般就是busybox 1busybox是一个C语言写出来的项目里面包含了很多.c文件和.h文件。此项目可以被配置编译成各个平台下面可以运行的应用程序。如果用arm-linux-gcc来编译busybox就会得到一个可以在我们开发板linux内核上运行的应用程序。 2busybox是为了在嵌入式环境下构建rootfs而开发的换言之它是为了构建根文件系统而专门开发的init进程应用程序。比如海思SDK提供的文件夹形式的根文件系统其目录中的linuxrc文件它里面只有一行代码“bin/busybox”。 3busybox同时也为当前系统提供了一整套的shell命令程序集比如vi、cd、ls等。在linux发行版比如ubuntu、redhat、centOS等中vi、cd、ls等命令都是一个个单独的应用程序但是在嵌入式linux中为了省事把vi、cd等所有常用的shell命令集合到一起构成一个shell命令包起名叫busybox。 4集成后busybox程序的大小比这些常用的命令的大小加起来要小很多。这是因为busybox本身提供的shell命令是阉割版的。busybox中的命令支持的参数选项比发行版中要少比如ls在发行版中可以有几十个参数选项但是在busybox中只保留了几个常用的选项不常用的都删除掉了。另外busybox中所有命令的实现代码都在一个程序中实现而各个命令中有很多代码函数都是通用的通用会降低重复代码出现的次数从而减少总的代码量和体积。比如ls、cd、mkdir等命令都会操作目录因此在busybox中实现目录操作的函数就可以被这些命令通用。 5busybox的体积优势是嵌入式系统本身的要求和特点造成的。 二、busybox源码分析 1、程序入口 1我们对程序进行分析时需要按照程序运行时的逻辑顺序来分析因此要找到入口地址。在uboot和linux kernel这两个大的C语言项目中入口地址由连接脚本指定。而操作系统下的应用程序它们的入口地址一般是main函数。busybox是linux启动后运行的第一个应用程序因此其中必然有main函数而且main就是入口地址。 2通过对busybox源码建立SI工程搜索main这个符号发现有很多main函数到底哪个才是入口地址呢busybox-1.24.1/applets/applets.c文件的main函数中调用了lbb_main函数通过查询该函数符号得知busybox的入口地址是busybox-1.24.1/libbb/appletlib.c中的main函数。 3busubox中有很多xxx_main函数它们是busybox所支持的xxx命令的真正入口比如ls_main函数就是busybox当作ls函数使用时的入口程序。busybox每次执行时都是先执行其入口main函数然后通过main函数的传参argv[0]来识别要执行的xxx函数然后调用相应的xxx_main函数来具体实现这个命令。比如pwd命令在busybox命令行下执行pwd命令时实际执行的是pwd_main这个函数。 2、对inittab文件进行解析与执行 1对根文件系统中的rootfs_xjh/etc/inittab文件进行解析的是busybox-1.24.1/init/init.c文件中的init_main函数。 2执行逻辑 1先通过parse_inittab函数解析/etc/inittab文件。解析的重点是将inittab中的各个action和process解析出来。 2然后后面先直接执行sysinit和wait和once注意这里只执行一遍然后在while(1)死循环中去执行respwan和askfirst。