①u-boot:目的是启动内核
②内核 :目的是启动应用程序
③启动应用程序:需要构建根文件系统
内核如何启动第一个应用程序
1、第一个应用程序:标准输入,输出,错误
if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
printk(KERN_WARNING "Warning: unable to open an initial console.\n");
(void) sys_dup(0);
(void) sys_dup(0);
2、
run_init_process(xxx); //用来启动应用程序 init = xxx 命令行参数,成功之后就不会退出了
init程序工作::
- 读取配置文件
- 解析配置文件
- 执行用户程序
配置文件:包含①指定程序;②何时执行;
static void new_init_action(int action, const char *command, const char *cons) //执行配置文件
new_init_action
创建一个init_action结构体,填充
把这个结构体放入init_action_list链表
struct init_action {
struct init_action *next;
int action;
pid_t pid;
char command[INIT_BUFFS_SIZE];
char terminal[CONSOLE_NAME_SIZE];
};
init进程完成的动作:
inittab配置格式:
总结:
- /dev/console (如果不设定/dev/id,就跳转到/dev/null)
- /etc/inittab
- 配置文件里指定的应用程序
- 库
- init本身,即busybox
最小根文件系统的必须:
- /dev/console 或 /dev/null
- init (来自busybox)
- /etc/inittab
- 配置文件里指定的应用程序(inittab中指定)
- C库(应用程序的编写需要库函数,比如printf)
所谓构建根文件系统,就是把以上的东西构建出来
Busybox的编译过程
最小根文件系统构建步骤:
进入安装的busybox的目录:
- 查看驱动文件
root@ubuntu:/tftpboot/fs_mini# ls /dev/console /dev/null -l
crw------- 1 root root 5, 1 Aug 25 13:10 /dev/console
crw-rw-rw- 1 root root 1, 3 Aug 25 13:10 /dev/null
2.创建/dev/console 和 /dev/null
root@ubuntu:/tftpboot/fs_mini# mkdir dev
root@ubuntu:/tftpboot/fs_mini# cd dev
root@ubuntu:/tftpboot/fs_mini/dev# mknod console c 5 1
root@ubuntu:/tftpboot/fs_mini/dev# mknod null c 1 3
3.添加C库
root@ubuntu:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/arm-linux/lib# cp *.so* /tftpboot/fs_mini/lib/ -d
完善根文件系统
①添加proc文件(内核提供的虚拟文件系统)
root@ubuntu:/tftpboot/fs_mini# mkdir proc
②如果不想手工挂载proc文件,需要添加配置文件在/etc/inittab
root@ubuntu:/tftpboot/fs_mini# vim etc/inittab
添加:
console::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
③创建脚本文件
root@ubuntu:/tftpboot/fs_mini# mkdir etc/init.d
root@ubuntu:/tftpboot/fs_mini# vim etc/init.d/rcS
添加:
mount -t proc none /proc(用于挂载proc文件)
添加执行权限:
root@ubuntu:/tftpboot/fs_mini# chmod +x etc/init.d/rcS
另一种方法挂载proc:
root@ubuntu:/tftpboot/fs_mini# mkdir etc/init.d
root@ubuntu:/tftpboot/fs_mini# vim etc/init.d/rcS
添加:
mount -a(用于挂载proc文件,依赖于文件fstab)
添加执行权限:
root@ubuntu:/tftpboot/fs_mini# chmod +x etc/init.d/rcS
root@ubuntu:/tftpboot/fs_mini# vim etc/fstab
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
④udev自动创建/dev/设备节点,mdev是udev的简化版本
Here’s a typical code snippet from the init script:
[1] mount -t sysfs sysfs /sys
[2] echo /bin/mdev > /proc/sys/kernel/hotplug
[3] mdev -s
Of course, a more “full” setup would entail executing this before the previous
code snippet:
[4] mount -t tmpfs mdev /dev
[5] mkdir /dev/pts
[6] mount -t devpts devpts /dev/pts
root@ubuntu:/tftpboot/fs_mini# vim etc/fstab
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
root@ubuntu:/tftpboot/fs_mini# vim etc/init.d/rcS
#mount -t proc none /proc
mount -a
mount -t tmpfs mdev /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mount -t sysfs sysfs /sys
echo /bin/mdev > /proc/sys/kernel/hotplug
mdev -s
⑤NFS
a.从flash上启动根文件系统,在用命令挂接NFS
挂接NFS:1、服务器允许那个目录可被挂接;2、单板去挂接
root@ubuntu:/tftpboot/fs_mini# vim /etc/exports
/tftpboot/fs_mini *(rw,sync,no_root_squash) //挂载的NFS目录
root@ubuntu:/tftpboot/fs_mini# /etc/init.d/nfs-kernel-server restart //重启NFS
root@ubuntu:/tftpboot/fs_mini# mount -t nfs 192.168.249.144:/tftpboot/fs_mini /mnt //自己挂载自己的目录,作为测试
单板挂载:
mkdir /mnt
mount -t nfs -o nolock 192.168.249.144:/tftpboot/fs_mini /mnt
b.直接NFS启动
NFS启动参数:挂载IP,目录