参考朱有鹏uboot全集
1.1、busybox是一个开源的项目,所以源代码可以直接从网上下载
1.2、busybox的版本的差异不大,版本的新旧没有太大的关系
1.3、下载busybox直接去www.busybox.net官方网站下载都行
下载完后,进行解压:
tar -jxvf busybox-1.24.1.tar.bz2
2修改Makefile
因为这是源代码是可以在很多的平台上面运行的,所以我们需要把他的平台弄成ARM。
因为我们编译的是A8的处理器所以我们需要对其进行平台的移植。
(1)ARCH =arm
(2)CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
3、使用make menuconfig
Busybox Settings--->
Build Options--->
[*]Build BusyBox as a static binary(no shared libs)
Busybox Library Tuning--->
[*]vi-style line editing commands
[*]Fancy shell prompts
Linux Module Utilities--->
[ ]Simplified modutils
[*]insmod
[*]rmmod
[*]lsmod
[*]modprobe
[*]depmod
Linux System Utilities--->[*]mdev
[*]Support /etc/mdev.conf
[*]Support subdirs/symlinks
[*]Support regular expressions substitutions when renaming dev
[*]Support command execution at device addition/removal
[*]Support loading of firmwares
4、安装make -j4和make install
4.1、使用多线程进行编译,增加编译的速度。
4.2、make install
这里面可以设置busybox的安装路径:
Busybox Settings
Installation Options ("make install....")
目的就是将编译生成的可执行程序以及依赖的库文件,配置文件,头文件安装到当前系统中指定,(一般都可以自己指定安装到哪个目录下面)的目录下面。
5、1我们把busybox程序编写进入根文件系统中
然后把其挂载到开发板中,得到的错误就变了。从/linuxrc不能执行
出现的错误信息:
VFS:Mounted root (nfs filesystem)on device 0:12
Freeing init memory: 540K
can't run '/etc/init.d/rcs':No such file or directory
can't open /dev/tty2:No such file or directory
#first:run the system script file
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:-/sbin/reboot
#umount all filesystem
::shutdown:/bin/umount -a -r
#restart init process
::restart:/sbin/init
2.1、我们的实验现象就是,能够进入根文件系统的控制台中:
所以综上所述,最小的根文件系统就是busybox+inittab。
2.2、我们解析上面的文件:
#表示的是我们在这个脚本程序中使用的注释.
sysinit表示的是一种条件:表示在系统跑起来最先执行的程序。
/etc/init.d/rcS 这里面试shell脚本,就是用来执行脚本程序的
askfirst: 就是在进入控制台前面输出一行信息,提示你应该按下enter键才能执行。
shutdown:就代表在关机的时候执行后面的程序/bin/umount -r -a
就是关机的时候,把所有的根文件系统中的文件全部卸载掉。
注意:关键点:理解inittab:
合起来的意思就是当满足action的条件时,就会执行process这个程序。
3.1、源码目录分析
很多都是用来实现shell的命令的。
3.2、整个程序的入口确定:
学习C语言的时候我们都知道程序的主函数main函数就是整个程序的入口,这种情况下适应于操作系统下的工作的应用程序的情况。
3.3、在uboot和Linux kernel这两大的C语言的项目中,main函数都没有都不是入口,在我们这种裸机程序中入口不是main函数,而是由链接脚本指定的。
3.4、busybox是Linux启动起来后的工作的第一个应用程序,因此其中必然有main函数的。
3.5、busybox的入口就是main函数,appletbb.c起作用了。
busybox中有很多的XXX_main函数,这些main函数每一个都是busybox支持的一个命令的真正的接口,比如ls_main函数就是busybox当做ls函数的使用的入口程序。
PS:答案:
答案就是main转xxx_main.也就是说busybox每次执行时都是先执行其main。
在main函数中识别我们真正要执行的函数(ls)然后去调用相应的xxx_main
比如ls_main来具体实现这个命令。
靠我们main函数的传参:argc,argv[0]传递给我们的main函数的。
run_applet_and_exit();
busybox pwd
(1)inittab的解析是在busybox/init/init.c/init_main函数中解析的
(2)parse_inittab()
解析成一个一个的action.
(3)执行逻辑是:先通过parse_inittab()函数解析出来:/etc/inittab
解析的重点是将inittab中的各个action和process解析出来。
为什么我们嵌入式制作根文件系统需要使用busybox?
(1)busybox实际上就是把ls,cd,mkdir,,等很多个Linux中常用的shell命令集成在一起。集成在一起之后,busybox程序的大小,比busybox实现的那些命令大小要小的多。
(2)busybox体系变小有2个原因:第一个是busybox本身提供的shell命令是裁剪版的,busybox能够支持的命令的参数选项是有限制的。
不常用的命令选项都裁剪掉了。
(3)实际上,busybox是很多个命令集成的,所以有很多命令需要用到的指令是代码是可以共用的,所以容量小了很多。
5.1、就是在busybox源码中的init.c中调用的。
parse_inittab里面INIT_SCRIPT: /etc/init.d/rcs
相当于默认执行了这个东西的运行。
5.2、/etc/init.d/rcs文件是Linux的运行的时候配置文件中最重要的一个,其他的配置都是由这个文件配置出来的,这个文件可以很复杂,也可以很简单。里面有很多的配置项。
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
mount -a
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
/bin/hostname -F /etc/sysconfig/HOSTNAME
ifconfig eth0 192.168.1.10
6.1、PATH:导出环境变量
什么是环境变量,就是你运行的应用程序的时候,操作系统在环境变量的目录中寻找应用程序,能找到就执行,不能找到就不执行。
runlevel=S :设置操作系统处于单用户模式
6.3、umask=
(1)umask是Linux的一个命令,作用是设置Linux系统的umask值
(2)umask值决定当前用户的权限。
6.4、mount 挂载所有的设备驱动程序
6.5、HOSTNAME:设置用户名;可以直接在/etc/sysconfig目录下面的
HOSTNAME创建一个名字,主机显示出来:这里我们设置为lhh_210