分析busybox的源码

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

参考博客

busybox详解_linuxarmsummary的博客-CSDN博客

一、前言

因为uboot给内核传参的bootargs中有“init=/linuxrc”这个项目,而由前面的分析可知/linuxrc这个二进制文件位于根文件系统中,它指向根文件系统的/bin/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。

三、busybox的体积优势

busybox将ls、cd、mkdir等linux中常用的shell命令集成在一起,集成后busybox程序的大小比这些常用的命令的大小加起来要小很多。

busybox体积变小的原因:

(1)第一个原因,是busybox本身提供的shell命令是阉割版的。busybox中的命令支持的参数选项比发行版中要少,比如ls在发行版中可以有几十个参数选项,但是在busybox中只保留了几个常用的选项,不常用的都删除掉了。

(2)第二个原因,是因为busybox中所有命令的实现代码都在一个程序中实现,而各个命令中有很多代码函数都是通用的,通用会降低重复代码出现的次数,从而减少总的代码量和体积。比如ls、cd、mkdir等命令都会操作目录,因此在busybox中实现目录操作的函数就可以被这些命令通用。

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

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

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

相关文章

彻底解决zend studio 下 assignment in condition警告

最近在mac系统下安装zend studio作为php开发工具,把以前的代码导入,发现项目中有很多 “assignment in condition”的警告,造成原因是在条件判断的if、while中使用了如下类似的做法: if ($res $other)while (($row $res->fet…

c# 连接各种数据库 Access、Server等

1.C#连接连接Access程序代码:usingSystem.Data;usingSystem.Data.OleDb;..stringstrConnection"ProviderMicrosoft.Jet.OleDb.4.0;";strConnection"Data SourceC:BegASPNETNorthwind.mdb";OleDbConnection objConnectionnewOleDbConnection(strConnection)…

〖Linux〗Kubuntu设置打开应用时就只在打开时的工作区显示

有没有遇到一种情况: 在工作区1打开了应用程序Google Chrome; 这个时间感觉它打开速度比较慢,就快捷键切换到工作区2了; 结果这个时候,Google Chrome就直接在工作区2打开,多不爽?! &…

搭建Spring MVC 4开发环境八步走

Spring MVC作为SpringFrameWork的产品,自诞生之日,就受到广泛开发者的关注,如今Spring MVC在Java中的发展可谓是蒸蒸日上,如今如果再有开发者说,不了解Spring MVC,或许就被人笑掉大牙。煽情的话就不说了&am…

address already in use: jvm_bind

这是用Myeclipse写网上书店时遇到的错误,错误的意思是8080端口被占用,解决问题的方式是找到占用8080端口的进程关闭就可以了, 在dos下输入netstat -ano 即可查看所有的 然后根据PID关闭进程,在任务管理器中,找到进转载…

【linux】学习6

鸟哥13章的东西 shell script速度较慢,适合用于系统管理,但不适合处理大量数值运算 var$((运算内容)) 可以用来做变量的加减乘除求余运算 total$(($firstnum*$secnu)) declare -i total"$firstnum*$secnu" 上面两句功能一样,建议用…

SCCM2012 R2集成WSUS服务器-4:部署软件更新组

在之前的文章中,我们已经创建好的软件更新组,也下载好了补丁,下面我们来部署这些补丁。右击软件更新组,选择”部署“,如图。进入到部署软件更新向导,输入部署的名称,并指定部署的集合。如图。在…

JavaScript Iframe富文本编辑器中的光标定位

最近在项目中碰到一个比较棘手的问题: 在iframe富文本编辑器中,有个工具栏,这个工具栏在iframe标签之外,工具栏上有一个按钮,点击该按钮向iframe正在编辑中的光标处插入一个图片,图片会插入到当前光标所在的…

Javascript中call函数和apply函数的使用

Javascript 中call函数和apply的使用: Javascript中的call函数和apply函数是对执行上下文进行切换,是将一个函数从当前执行的上下文切换到另一个对象中执行,例如: sourceObj.method.call(destObj,params1,params2) 是将sourceObj中…

搭建wordpress开发环境

安装php PHP下载地址:http://windows.php.net/download/ 和MySQL一样,下载包是一个zip压缩包,只需解压缩即可。将它解压缩到 D:\WNMP\php-5.5.6-Win32-VC11-x64目录下: 配置php 将php.ini-production文件复制并重命名为php.ini,并…

业界重磅新书《UNIX/Linux网络日志分析与流量监控》首发

《UNIX/Linux网络日志分析与流量监控》出版社官网: http://www.cmpbook.com/stackroom.php?id39384 每本图书附赠51CTO学院的价值100元学习卡一张京东:http://item.jd.com/11582561.html机械工业出版社在线购书平台:http://www.golden-book.…

Git工具使用基础

Git 是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多的影响,文章分为两部分,第一部分…

.NET:如何让线程支持超时?

背景 本文是为了回复博客园一个兄弟的问题,主要回答两个问题: 如何让线程支持超时?如何让线程在执行结束后销毁?MS 现在不推荐使用低级别的 Thread 编程,而推荐使用 Task,另外我多数情况都是做企业应用&…

第1章 Express MongoDB 搭建多人博客

学习环境 Node.js : 0.10.22 Express : 3.4.4 MongoDB : 2.4.8 快速开始 安装 Express express 是 Node.js 上最流行的 Web 开发框架,正如他的名字一样,使用它我们可以快速的开发一个 Web 应用。我们用 express 来搭…

Windows Phone 8初学者开发—第7部分:本地化应用程序

Windows Phone 8初学者开发—第7部分:本地化应用程序 原文 Windows Phone 8初学者开发—第7部分:本地化应用程序 第7部分:本地化应用程序 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Development-for-Absolute-Beginners/Pa…

ARM官方汇编指令

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 参考内容 (1)文档《ARM汇编指令集汇总》 (2)文档《ARM汇编手册》 (3)文档《ARM Software Development Toolkit User Guide》 内容总结…

audio 标签简介

定义和用法 <audio> 标签定义声音&#xff0c;比如音乐或其他音频流。 实例 一段简单的 HTML 5 音频&#xff1a; <audio src"someaudio.wav"> 您的浏览器不支持 audio 标签。 </audio> 提示和注释 提示&#xff1a;可以在开始标签和结束标签之间放…

magento 瘦身数据库

2019独角兽企业重金招聘Python工程师标准>>> 2013/4/1更新 有两种方式&#xff0c;一种在后台设置自动清除log数据 System > Configuration > Advanced > System 打开 Log Cleaning 还有一种自然是直接清理数据库 truncate dataflow_batch_export; truncat…

大数据时代的移动即时通讯

随着大数据的到来&#xff0c;第三方开放API的服务商越来越多&#xff0c;数据的挖掘和展示也在不断的更新。首先值得广大手机用户骄傲的事情&#xff0c;在移动通讯方面有了长足的发展&#xff0c;比如说你正在工作的时候&#xff0c;接听电话和打开视频的速度都相同的话&…

领域驱动设计和实践(转:http://kb.cnblogs.com/page/112298/)

引言 软件系统面向对象的设计思想可谓历史悠久&#xff0c;20世纪70年代的Smalltalk可以说是面向对象语言的经典&#xff0c;直到今天我们依然将这门语言视为面向对象语言的基础。随着编程语言和技术的发展&#xff0c;各种语言特性层出不穷&#xff0c;面向对象是大部分语言的…