1 内核启动
内核启动最后调用init_post(),如果uboot中指定了的ramdisk_execute_command或execute_command,则执行对应的程序。否则,执行配置文件。若没有配置文件,则启动失败。
ramdisk_execute_command——对应“rdinit=…”
execute_command——对应“init=…”
static noinline int init_post(void)
__releases(kernel_lock)
{
...
if (ramdisk_execute_command) {
run_init_process(ramdisk_execute_command);
printk(KERN_WARNING "Failed to execute %s\n",
ramdisk_execute_command);
}
if (execute_command) {
run_init_process(execute_command);
printk(KERN_WARNING "Failed to execute %s. Attempting "
"defaults...\n", execute_command);
}
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
panic("No init found. Try passing init= option to kernel.");
}
2 busybox
busybox即常用的指令集合,体积小,便于应用于嵌入式系统中。
开发板中ls、cp、vi等命令都在/bin目录中,不过它们的链接地址都是放在了busybox里。比如:执行ls命令,其实就是执行 busybox ls。在busybox中,例如,执行cp指令时,会去调用cp_main(),初始化init.c中有init_main()。
看busybox源码调用流程:
init.c/init_main-->
parse_inittab--->
new_init_action
首先会去读取配置文件,并加入到链表init_action_list中。配置文件中,每个配置项格式:
<id>:<runlevels>:<action>:<process>
id: id 会等于/dev/id, 用做终端(标准输入、标准输出以及标准错误) ,这个可以不需要设置,因为/etc/console已经设为标准输入输出了,如不设置就等于dev/null,则从控制台输入输出。
runlevels:可以被忽略
action: 运行时机
process:应用程序或者脚本
之后在init_main中,通过run_actions执行。
3 移植
busybox版本:busybox-1.14.4
解压后,
make clean
修改Makefile
CROSS_COMPILE = arm-linux-
ARCH = arm
执行make menuconfig,修改配置项:
(1)
Busybox Settings --->
Build Options --->
[*]Build BusyBox as a static binary(no shared libs)
(2)
Busybox Settings --->
Busybox Library Tuning --->
[*]vi-style line editing commands
[*]username completion
[*]fancy shell prompts
(3)
Linux Module Utilities -->
[]Simplified modutils
[*]insmod
[*]rmmod
[*]lsmod
[*]modprobe
编译make,安装到指定目录
make CONFIG_PREFIX=自己的目录 install
4 构建根文件系统
(1)建立系统目录
在busybox的安装目录
mkdir dev etc home lib mnt proc sys tmp var opt root
mkdir -p etc/init.d
(2)创建设备文件
这里使用静态创建,也可参考mdev使用。
cd dev
mknod console c 5 1
mknod null c 1 3
mknod ttySAC0 c 204 64
mknod mtdblock0 b 31 0
mknod mtdblock1 b 31 1
mknod mtdblock2 b 31 2
mknod mtdblock3 b 31 3
(3)创建etc/inittab
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
(4)创建etc/init.d/rcS
#!/bin/sh
mount -a
并修改权限
chmod +x etc/init.d/rcS
mount -a会挂接/etc/fstab文件内容。
(5)创建etc/fstab
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /tmp tmpfs defaults 0 0
(6)拷贝库文件
cd lib
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/armv4t/usr/lib/*.so* ./ -d
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/armv4tlib/*.so* ./ -d
使用mkyaffs2image工具制作成镜像文件,下载到开发板。