busybox简介

一 简介

这里不多介绍,见官方网站:https://busybox.net

二 配置

make  menuconfig 选择需要支持的命令
make  编译生成busybox文件,所有支持的命令只是指向busybox的一个符号链接,busybox --help可以查看busybox真正支持的命令。

三 执行流程

main()  [applets.c] 为busybox入口:
int main(int argc UNUSED_PARAM, char **argv)
{
return lbb_main(argv);
}
调用lbb_main():
int lbb_main(char **argv)
{
...............
applet_name = argv[0];
if (applet_name[0] == '-')
applet_name++;
applet_name = bb_basename(applet_name);
parse_config_file(); /* ...maybe, if FEATURE_SUID_CONFIG */
run_applet_and_exit(applet_name, argv);
}
得到命令名称,调用run_applet_and_exit():
void FAST_FUNC run_applet_and_exit(const char *name, char **argv)
{
int applet = find_applet_by_name(name);
if (applet >= 0)
run_applet_no_and_exit(applet, argv);
}
int FAST_FUNC find_applet_by_name(const char *name)
{
...............
const char *p;
p = bsearch(name, applet_names, ARRAY_SIZE(applet_main), 1, applet_name_compare);
if (!p)
return -1;
return p - applet_names;
}
void FAST_FUNC run_applet_no_and_exit(int applet_no, char **argv)
{
...............
exit(applet_main[applet_no](argc, argv));
..............
}
其中applet_names和applet_main 是在include/applet_tables.h中定义的,该文件是根据配置结果动态生成的,生成方法为:cmd_gen_applet_tables = applets/applet_tables include/applet_tables.h include/NUM_APPLETS.h , 文件内容主要是定义了applet_names和applet_main两个数组变量:
const char applet_names[] ALIGN1 = ""
"adduser" "\0"
"arp" "\0"
"awk" "\0"
"basename" "\0"
.........
}

int (*const applet_main[])(int argc, char **argv) = {
adduser_main,
arp_main,
awk_main,
basename_main,
...........
}
applet_names和applet_main 一一对应,根据命令名称计算索引,然后根据索引找到对应的命令入口函数。

值得一提的是,busybox为了节约内存,一是减少全局变量使用,所有全局变量都加上了G作为前缀,尽量使用动态变量或者使用malloc动态分配:
#define G (*ptr_to_globals)
#define INIT_G() do { \
SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
} while (0)

另外一个机制是内存复用:
extern char bb_common_bufsiz1[COMMON_BUFSIZE];
没有初值,默认大小为4096,放在BSS段中,每个命令定义自己的struct globals 结构体类型,然后共用bb_common_bufsiz1这段内存:
#define G (*(struct globals*)&bb_common_bufsiz1)
#define INIT_G() do { \
struct G_sizecheck { \
char G_sizecheck[sizeof(G) > COMMON_BUFSIZE ? -1 : 1]; \
}; \
} while (0)
但是要特别小心溢出问题,当sizeof(G) > COMMON_BUFSIZE时,char G_sizecheck[-1]定义出错,这样在编译期就可以发现溢出问题了,详细可以参考busybox/docs/keep_data_small.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值