分析根文件系统中的/linuxrc文件(附带busybox的介绍)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

参考博客

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

(1)busybox是一个C语言写出来的项目,里面包含了很多.c文件和.h文件。此项目可以被配置编译成各个平台下面可以运行的应用程序。如果用arm-linux-gcc来编译busybox就会得到一个可以在我们开发板linux内核上运行的应用程序。

(2)busybox是为了在嵌入式环境下构建rootfs而开发的,换言之,它是为了构建根文件系统而专门开发的init进程应用程序。比如海思SDK提供的文件夹形式的根文件系统,其目录中的linuxrc文件,它里面只有一行代码“bin/busybox”。

(3)busybox同时也为当前系统提供了一整套的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中实现目录操作的函数就可以被这些命令通用。

(5)busybox的体积优势是嵌入式系统本身的要求和特点造成的。

二、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函数。

(3)busubox中有很多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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Wisconsin Squares [USACO]

这个也不记得了&#xff0c;反正不难 /* ID: zhangyc1 LANG: C TASK: wissqu */ #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std;char arrMatrix[4][5]; bool arrNewCow[4][…

CentOS Linux搭建SVN Server配置详解

PS&#xff1a;今天给开发的同事搭建一个公网的SVN Server&#xff0c;google一下&#xff0c;发现下面这篇最详细&#xff0c;就记录下来&#xff0c;重新排版一下。顺便根据自己的使用经验&#xff0c;补充了几个细节和总结。本文配置是基于CentOS 5.x的&#xff0c;但一样适…

bic,orr——设置某些位为0或者1

转载于http://blog.chinaunix.net/uid-28458801-id-4083986.html 一、bic &#xff08;1&#xff09;格式&#xff1a;BIC {条件} {S} 目的寄存器&#xff0c;操作数1&#xff0c;操作数2&#xff1b; &#xff08;2&#xff09;BIC指令用于清除操作数1的某些位&#xff0…

405 Method Not Allowed

当jquery easyui的datagrid插件使用.json文件为数据源&#xff0c;通过非http协议访问【就是直接拖进浏览器查看效果】&#xff0c;能正常加载.json文件并且生成datagrid数据源。但是通过http协议访问示例代码时&#xff0c;无法加载json文件生成datagrid的数据源。 这个是由于…

Eclipse之ANT使用

Ant是Java平台下非常棒的批处理命令执行程序&#xff0c;能非常方便地自动完成编译&#xff0c;测试&#xff0c;打包&#xff0c;部署等等一系列任务&#xff0c;大大提高开发效率。如果你现在还没有开始使用Ant&#xff0c;那就要赶快开始学习使用&#xff0c;使自己的开发水…

idea修改maven项目版本号

1 先安装插件 2 控制台执行命令 mvn build-helper:parse-version versions:set -DnewVersion1.1-SNAPSHOT versions:commit 1.1-SNAPSHOT 为你要修改的版本号 技术交流群&#xff1a; 816227112 有时候命令执行完看不到改变&#xff0c;需要刷新下。 转载于:https://www.cnblo…

str指令

转载于arm汇编—str指令-andyhzw-ChinaUnix博客 &#xff08;1&#xff09;格式&#xff1a;STR{条件} 源寄存器&#xff0c;<存储器地址> &#xff08;2&#xff09;STR指令用于从源寄存器中将一个32位的字数据传送到存储器中。 &#xff08;3&#xff09;指令示例&a…

【POJ】2065 SETI

题意&#xff1a;直接拿样例&#xff0c;37 abc。 a&#xff5e;z表示1&#xff5e;26&#xff0c;*表示0。 x0*1^0x1*1^1x2*1^21(mod 37) x0*2^0x1*2^1x2*2^22(mod 37) x0*3^0x1*3^1x2*3^23(mod 37) 高斯消元&#xff0c;除法x等于乘以x对p的逆元。 1 #include<cstdio>2…

几个国外开源CMS系统比较

CMS是Content Management System的缩写&#xff0c;意为"内容管理系统"。上一下度娘或者放一下Google&#xff0c;全球的CMS系统&#xff0c;不下千个&#xff0c;开源的不下百个&#xff0c;如果只是普通用户&#xff0c;很难有时间和精力去比较那么多的系统优劣。不…

用Python自动生成NBA巨星生涯数据曲线

1.序 之前写过一个用 python 自动生成球员职业生涯数据的程序(原文请关注本人公众号)&#xff0c;大家的反响很好&#xff0c;我也感到很欣慰。有问我怎么做的&#xff0c;如何学 python 的&#xff0c;也有提建议说集成到 web 里面的。 其实最开始我也是考虑到集成到 web 里面…

ldr加载指令,ldr伪指令

转载于ARM中LDR伪指令与LDR加载指令 - Leo Chin - 博客园 一、ldr作为加载指令 &#xff08;1&#xff09;格式为&#xff1a;LDR{条件} 目的寄存器&#xff0c;<存储器地址> &#xff08;2&#xff09;LDR指令用于从存储器中将一个32位的字数据传送到目的寄存器中。 …

桌面秀

介绍一款桌面秀给大家——Rainmeter。个人觉得Rainmeter最大的优点就是能自己编写插件&#xff0c;当然&#xff0c;你也可以去一下网站搜索插件下载。 国内&#xff1a; http://bbs.rainmeter.cn/ 国外&#xff1a; http://rainmeter.net/转载于:https://www.cnblogs.com/HTWo…

javascript函数,值得参考!

2019独角兽企业重金招聘Python工程师标准>>> javascript函数一共可分为五类&#xff1a;   常规函数   数组函数   日期函数   数学函数   字符串函数   1.常规函数   javascript常规函数包括以下9个函数&#xff1a;   (1)alert函数&#xff1a;显…

Index

★【简书】 Nordic文集 Python FreeRTOS 转载于:https://www.cnblogs.com/shaoyang-v/p/11265393.html

时钟系统——S5PV210的时钟系统的理论及操作

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考内容 s5pv210——初始化时钟 - biaohc - 博客园 用户手册 一、SoC时钟系统 1、时钟的含义与作用 时钟是同步工作系统的同步节拍。 SoC内部有很多器件&#xff0c;比如CPU、串口、DRAM控制器、…

Oracle 协议适配器错误

1.首先确认你的 OracleDBConsoleORACLE&#xff0c;OracleOraDb11g_home1TNSListener&#xff0c;OracleServiceORACLE 这三个服务是否已经正常的开启。 2. 确认你的listener 的端口是否被占用&#xff0c; 在命令行执行&#xff1a;netstat -aon|findstr "1521" &am…

php变量作用域(花括号、global、闭包)

变量的作用域是变量的一个作用范围&#xff0c;在这个范围内变量为可见的&#xff0c;即可以访问该变量的代码区域&#xff0c; 相反&#xff0c;如果不在这个范围内&#xff0c;变量是不可见的&#xff0c;无法被调用。 &#xff08;全局变量可以将作用范围看作为整个程序&…

C# 文件流相关操作

二进制转换成图片: MemoryStream ms new MemoryStream(bytes); ms.Position 0; Image img Image.FromStream(ms); ms.Close(); this.pictureBox1.Image C#中byte[]与string的转换代码: System.Text.UnicodeEncoding converter new System.Text.UnicodeEncoding();byte[] in…

递归求链表的长度

时间复杂度&#xff1a;每个节点各访问一次&#xff0c;时间复杂度为O(n)。 程序代码&#xff1a; int length(LinkList llist) { if(llist NULL) return 0; return 1length(llist->link); } 转载于:https://www.cnblogs.com/maomaohhmm/archive/2012/09/09/2677889.html

串口通信——串口通信的基础概念

以下内容源于朱友鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考博客 同步通信与异步通信区别_wind19的博客-CSDN博客 SPI、I2C、UART&#xff08;即串口&#xff09;三种串行总线详解_天糊土的博客-CSDN博客_串口总线 一、电子通信相关的概念 1、同步通信和…