分析根文件系统中的/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,一经查实,立即删除!

相关文章

CentOS Linux搭建SVN Server配置详解

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

405 Method Not Allowed

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

Eclipse之ANT使用

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

idea修改maven项目版本号

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

几个国外开源CMS系统比较

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

javascript函数,值得参考!

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

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

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

Oracle 协议适配器错误

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

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

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

MS CRM 2011 RC中的新特性(9)—全新的工作流 脚本设计模式

MS Dynamics CRM 2011中,在流程处理方面,除了以往版本中具有的工作流之外,又加入了新的内容——脚本Dialog。脚本Dialog,是同步的、需要用户输入内容的流程。当启动了脚本后,系统会弹出向导风格的对话框,用…

串口通信——S5PV210串口通信接口详解

以下内容源于 朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考博客 s5pv210——串口通信 - biaohc - 博客园 一、S5PV210的串口控制器 S5PV210的串口控制器的相关内容,在用户手册的section8.1章节。 (1)串口控制器包含…

串口通信——S5PV210串口通信的简单案例

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考博客:s5pv210——串口通信 - biaohc - 博客园 一、代码与测试 1、代码文件 完整的案例文件见链接。 (1)start.S文件 /* * 演示串口通信 */#define WTCON …

iOS学习系列 - 扩展机制category与associative

category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能category比较常见,相对的associative&am…

Spring Boot JWT 快速入门

本章节讨论 jwt 在 spring boot 中的应用。意在快速入门 jwt。 java jdk1.8maven 3.2spring boot 2.0JSON Web Token(JWT) 他是一个用于 Web 身份验证的令牌。 1 JWT 概述 1.1 什么是JWT 直观的理解 JWT 就是一串字符串,如下(来自…

Flex与Java通信之HttpService方式

2019独角兽企业重金招聘Python工程师标准>>> Flex用RemoteObject方式与Java通信是最常用的方式,这是一种最直观的方式。当然Flex也可以用HttpService与服务器类如servlet通信,这也是本次学习的重点。 这次学习是在上节的基础上进行的。本节学…

中断——S5PV210的中断体系简介

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考博客 s5pv210的中断体系 - biaohc - 博客园 我的RTOS 之一 --S5PV210 异常向量表基址和软中断测试_liujia2100的博客-CSDN博客 从0开始学ARM-异常及中断处理、异常向量表、swi_一口Linux的技术…

中断——S5PV210的中断案例

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考博客 s5pv210——中断 - biaohc - 博客园 S5PV210的中断体系简介_天糊土的博客-CSDN博客 一、S5PV210的中断流程 第一部分是我们为中断响应而做的预备工作。 1、初始化中断控制器 比如先关闭所…

按键——S5PV210的按键简介(轮询方式+中断方式)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 参考博客 s5pv210——按键 - biaohc - 博客园 一、按键的简介 1、按键的物理特性 按钮没有被按下时,内部是断开的。按钮被按下时,内部保持接通状态;放手后由于弹…

HAproxy + Keepalive实现LDAP代理服务

HAproxy Keepalive实现LDAP代理服务因为公司的各种高自研发的系统非常多,这些系统又全部是在使用LDAP做认证,目前我们有几台DC控制器来分担这些ldap请求,用户通过访问ldap.xxxx.com这个域名来连接ldap服务器,我们通过DNS轮询的方…

中断——S5PV210的中断源

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 前言 s5pv210中因为支持的中断源很多,因此直接设计了4个中断寄存器,每个32位,每位对应一个中断源。理论上210最多支持128个中断,实际支持不足128个&a…