来自《ARM Linux开发-2G/3G无线传输(DTU)和路由器—笔记》www.warewin.com
自己的一些应用程序可以是busybox中新建的小程序。有几个优势,busybox的小程序涉及技术方方面面很多,可以作为参考;另外busybox也有函数库供直接使用。Warewin的路由设计很多应用程序都是busybox的小程序。如ICMP检测,DNS检测,DTU程序,看门狗程序。
总的来说建立一个busybox所需要的工作有:
编写自己的小程序;在busybox主目录下添加自己的小程序配置;在主目录下增加自己小程序编译路径;新建小程序目录,在目录下放小程序,编写配置文件,kbuild文件;在/busybox-1.12.1/include/applets.h,/busybox-1.12.1/include/applet_tables.h注册小程序;在/busybox-1.12.1/include/usage.h文件中加入该程序的帮助说明;最后编译完后在根文件系统目录下生成小程序指向busybox的连接。
增加函数库
有时候小程序很大,不只是主程序,还有很多函数库,这时需要增加函数库。函数库不是运行的程序,增加相对简单。在busybox目录下建放置库函数的目录,把库文件相关目录文件放在该目录下;busybox主目录下的makefile文件中建立编译路径和头文件路径选项。在库函数目录下编写kbuild文件包含要编译的源文件。
下面以com_sk小程序为例。com_sk小程序是个串口程序,busybox小程序为com_sk。
com_sk的busybox小程序的C代码com_sk.c如下:
....
....
int com_sk_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int com_sk_main(int argc UNUSED_PARAM, char **argv)
{
....
....
while (1)
{
..........
}
.........
.......
}
在代码中 com_sk_main(int argc UNUSED_PARAM, char **argv) 这个函数很重要,小程序就是从这里运行的。函数命名参数必须按照这个格式来。这个函数必须在相应的文件登记。
com_sk名称为busybox小程序名称,这个C文件命名为com_sk.c;com_sk_main是这个程序执行开始点。
如何将个人的应用程序加到busybox中,如以下步骤:
1、到官方网站http://www.busybox.net/下载源文件:busybox-1.12.1。
2、解压缩该文件后,#cd busybox-1.12.1 进到根目录下。
3、Busybox的应用程序按功能被分散在源码的各个目录下面,为区分源码与个人添加的程序在根目录下新建一个存放个人应用程序的目录,例如新建一个warewin目录:
#mkdir warewin
4、根据Busybox的目录结构,在/warewin目录下新建Config.in和Kbuild两个文件,把个人所有应用程序.c源文件放进去。
(1)在/warewin/Config.in文件中增加相应的图形配置,如以下红色字体所示:
menu "WareWin Proc" //WareWin Proc为个人项目总菜单名
................
config COMSK//COMSK为子菜单名
bool "com_sk"
default y
help
The local com socket.
config COMPPP
bool "com_ppp"
default y
help
The local com ppp.
................
endmen
(2)在/warewin/kbuild文件中增加相应的编译选项,如以下红色字体所示:
lib-y:=
................
lib-$(CONFIG_COMSK) += com_sk.o
lib-$(CONFIG_COMPPP) += com_ppp.o
lib-$(CONFIG_SERVER_ALL) += server_tools.o
可以有多个.o文件 继续+=下去就可以
................
5、在busybox相应位置注册小程序,并添加帮助。
(1)/busybox-1.12.1/include/applets.h中把所需编译的文件添加到表中,加入代码:
................
USE_COMSK(APPLET(com_sk,_BB_DIR_USR_BIN,_BB_SUID_NEVER))
................
(2)在/busybox-1.12.1/include/applet_tables.h的applet_name[]中添加该程序名:
................
"com_sk" "\0"
................
(3)在applet_main[]()中添加该程序的主函数名:
................
com_sk_main,
................
(4)在/busybox-1.12.1/include/usage.h文件中加入该程序的帮助说明,如以下所示:
................
#define com_sk_trivial_usage "com_sk truvial help"
#define com_sk_full_usage "com_sk full usage"
................
6、将warewin目录下的所有C源文件编译,打开/busybox-1.12.1/makefile文件,在变量libs -y中添加一行:warewin/ \
7、将warewin目录下的程序菜单加到图形配置中,打开/busybox-1.12.1/config.in文件、在文件未添加以下代码:source warewin/Config.in
8、回到/busybox-1.12.1/目录下,重新配置菜单选项:#make menuconfig。
如下图所示可以在主菜单上看到我们加进来的个人项目主菜单WareWin Proc。
2.11 busybox总菜单图
进入/warewin proc菜单下选中我们要编译的程序,如下图所示:
2.12 个人项目子菜单图
9、退出菜单,重新编译:#make,将新生成的buxybox可执行程序放到根文件系统的/bin目录下。
10、在根文件系统的/usr/sbin目录下新建一个链接链接com_sk,该链接指向/bin/busybox。
在busybox.c中包含了BusyBox的入口main函数,在对调用参数处理之用调用applet.c中的run_applet_by_name函数,该函数将根据应用程序的名字,找到相应的applet,将执行BB_applet->main指向的函数,然后直接退出。
11、把根文件系统重新下载到设备上,设备重新开机后进到终端运行我们添加的程序。
#cd /usr/sbin
#./com_sk