BusyBox源码结构简介

BusyBox被称为嵌入式开发的瑞士军刀,它集成了许多常用Linux命令。本文详细介绍了BusyBox的工作原理、基本用法及源码分析,还提供了扩展BusyBox功能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出处:http://home.q.yesky.com/space-720221-do-blog-id-62561.html

 



1、 介绍 BusyBox 称作是嵌入式开发的瑞士军刀,实用,短小,稳定。

l   BusyBox 利用 Linux 实用工具中代码大量重复的事实,将重复的代码重新整理,放到一个文件中,减少了多次包含。

l   BusyBox 通过简化非必要的复杂功能,减少占用的空间。

l   BusyBox 的完全可定制性,提供了非常灵活,宜于扩展的结构。

2 BusyBox 的基本用法 可以在原代码的 docs 中看到有两种用法:

·   直接使用 BusyBox

busybox <functiion> [ arg... ] 例如: /bin/busybox ls ,将执行 ls 的功能

·   建立指向 BusyBox 的链接

<function> [ arg... ] 例如: ln -s /bin/busybox ls ./ls 将同样执行 ls 的命令

3
BusyBox 源码分析 BusyBox 源码算是一个比较庞大的工程,但是该工程整体上看可以分为三个部分来讲述:

(1) BusyBox 架构

BusyBox 架构部分为 BusyBox 的运行提供了基本支持。其主要代码在 applet 下面。 busybox.c 中包含了 BusyBox 的入口 main 函数 , 在对调用参数处理之用调用 applet.c 中的 run_applet_by_name 函数,该函数将根据 Applet 的名字,找到相应的 applet ,将执行 BB_applet->main 指向的函数,然后直接退出。这里 BB_applet->main 所执行的函数就是通过命令要执行的命令。 run_applet_by_name 中,所调用的 find_applet_by_name 中用 bsearch applets 进行搜索,并返回 applet.applets 的定义是在 include/applets.h 中,是一个常量数组。

(2) BusyBox 实用库

Busybox 的可复用函数都被定义在 libbb 下面的文件中,其它的 applet 通过对这些实用函数的调用实现自己的目标。

(3) BusyBox Applet 扩展

BusyBox 本身没有多大的实用价值,更为重要的是 BusyBox Applet 为我们提供了实用功能。 Busybox applets 按功能被分散在源码的各个目录下面。 BusyBox 本身也是一个 applet. 它的定义就在 busybox.c 中,其入口点是 busybox_main. 举例说明: cp 命令的实现, cp 被放在 coreutils 下面的 cp.c , 可以看到该文件中只有一个函数, cp_main(), 该函数就是 cp 命令的入口地址,而 copy 的最关键性的步骤: DO_COPY 的实现,则是通过调用 copy_file() 来实现的。 copy_file 这个函数被多个命令使用到 , 比如 mv.cp 等,它被放在 libbb copyfile.c .

4 BusyBox 源中的一些脚本分析

(1) applets /busybox.mkll, 该脚本通过分析 include/config.h inlcude/applets.h 两个文件来得到被配置的文件的链接。
(2) applets/install.sh,
该脚本根据 busybox.mkll 生成的 busybox.link 来建立链接文件
(3)
源码目录下的 Makefile ,提供了 make menuconfig 对源码进行配置,生成 .config 文件, make 将生成 busybox.

5 、扩展 BusyBox 的功能

请参考 docs/new_applet-HOWTO.txt 文档
(1)
、在适当的目录编写 applet 代码
(2)
、在所在目录的 Makefile.in 文件中,增加相应的 applet 配置
(3)
、在所在目录的 config.in 文件中,增加 applet 的图形配置
(4)
、在 include/usage.h 中增加相应的 usage 说明
(5)
、在 inlucde/applet.h 中增加相应的 applet ,注意必须保证其正确的按母排序

6
、其它 BusyBox 本身为了减化期间,在很多时间不提供配置,比如你想要改 telnetd 的端口,那么,你要做的通常是去修源代码,后重新编译成 busybox.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值