nand flash启动:
set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
nfs启动:
set bootargs noinitrd root=/dev/nfs nfsroot=111.114.154.127:/work/nfs_root/first_fs ip=111.114.154.16:111.114.154.127:111.114.154.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
uboot:启动内核
内核:启动应用程序
open(/dev/console,sys_dup(0),sys_dup(0))//标准输入输出错误
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
构建:根文件系统
busybox:ls cp cd
ls链接到busybox,当执行ls时实质是busybox ls
内核启动文件系统中的第一个程序init
busybox--init_main
parse_inittab();
file = fopen(INITTAB, "r");//INITTAB = "/etc/inittab" /* inittab file location */
new_init_action
①创建一个init_action结构,填充
②把这个结构体放入init_action_list链表中
run_actions(SYSINIT);
run_actions(WAIT);
run_actions(ONCE);
while (1) {
run_actions(RESPAWN);
run_actions(ASKFIRST);
wpid = wait(NULL);
while (wpid > 0) {
for (a = init_action_list; a; a = a->next) {
if (a->pid == wpid){
a->pid = 0; //程序不会死掉,死了后,又会被重新运行。
message(L_LOG, "process '%s' (pid %d) exited. "
"Scheduling it for restart.",
a->command, wpid);}}}
inittab格式:<id>:<runlevels>:<action>:<process>
id-->/dev/id:用于终端 stdin,stdout,stderr;为空的话会指定为/dev/null
runlevels:完全可忽略
action:何时执行
process:应用程序或脚本
busybox--init busybox-1.7.0\examples\inittab这个文件对inittab格式有详细说明
完成① 读取配置文件:a指定应用程序;b何时执行应用程序
② 解析配置文件
③ 执行应用程序
/
/
制作文件系统:yffs2 jffs2 NFS /
/
/
一、最小文件系统:
①/dev/console 、 /dev/null
==> 用mknod创建,例:mknod 名字 文件类型 主设备号 次设备号
②init=>busybox。init本身,即busybox
③配置文件/etc/inittab指定的应用程序
==>创建/etc/inittab文件,内容是:console::askfirst:-/bin/sh
④c库
==> cp *.so* 第一个文件系统目录/lib -d :-d表示保持链接关系,负责链接文件的内容会复制被链接的文件,库会很大
配置、编译busybox可或得:②、③项
:解压;读readme文件、install文件
a编译为动态的
b设置编译交叉编译工具链;在makefile中设置:CROSS-COMPILE
最新版的busybox可在make menuconfig中配置交叉编译项
********************************************************
*************应用手册上有详解***************************
********************************************************
c将编译好的文件安装到将要编译成文件系统的文件夹中
最后:制作映像文件
书上是yaffs1:对小页的nand flash用,每一页512字节。
工具:自己编译--生成工具--拷贝工具--制作
tar xjf yaffs_source_util_larger_small_page_nand.tar.bz2
cd utils/
make
mkyaffs2image
********************************************************
*************应用手册上有详解***************************
********************************************************
二、改进
用ps命令发现没有/proc目录,创建/proc
有了/proc文件后,必须挂载一个虚拟文件系统[收集内核的信息]
mount proc none /proc
在ps出现一些内核信息。
修改:
①:
/etc/inittab文件内容是:
console::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
rcS脚本内容,修改权限:
mount proc none /proc
②:
mount -a:
是根据/etc/fstab中的内容来挂载文件系统
/etc/fstab内容:
#device mount-piont type options dump fsck order
proc /proc proc defaults 0 0
cat /proc/mounts:查看当前挂载的文件系统
三、改进
udev-->自动创建设备节点:/dev/设备节点
简化版本:mdev
①创建sys目录:mkdir sys
②/etc/fstab
/etc/fstab内容:
#device mount-piont type options dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
③/etc/init.d/rcS
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hutplug
/*/proc/sys/kernel/hutplug会指向/sbin/mdev*/
mdev -s
/*创建内核现有的一些设备节点*/
四、jffs2一般用在nor flash上,现将它用在nand flash上。
压缩的系统
参考完全开发手册
./config --share --prefix=/urs
编译动态度 安装在/urs目录
mkfs.jffs2 -n -s 2048 -e 128KiB -d first_fs -o first_fs.jffs2
一页大小 一块大小 目录 输出
可擦除
设置文件系统参数,uboot传入的:
bootagrs=... rootfstype=jffs2 ....
五、制作NFS文件系统
a.从nand flash上启动文件系统,再用命令挂接NFS
要挂接NFS文件系统,NFS文件系统是在linux服务器上
linux服务器允许这个目录可被别人挂接
如何做到的:nfs服务;配置文件/etc/exports
内容:
linux服务器目录 *(rw,snyc,no_root_squash)
重启nfs服务
/etc/init.d/nfs restart
试验:自己挂接自己
mount -t nfs 192.168.1.127:/目录 /mnt
单板去挂接
在单板上创建/mnt目录 mkdir mnt
mount -t nfs -o nolock 192.168.1.127:/linux服务器中的目录 /mnt
b.单板直接从NFS启动
bootargs=noinitrd root=/dev/mtdblock3 init=linuxrc consoles=ttySAC0
修改命令行参数:
参考:nfsroot文件 子网掩码
set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.127:/linux服务器nfs配置项中设置的目录 ip=192.168.1.11:192.168.1.127:192.168.1.1:255.255.255.0::eth0:off init=linuxrc consoles=ttySAC0
[]表示这个参数可以省略;<>表示这个参数可以省略。 网关因为是同一个网段的,所以可以随便设
NFS启动参数:
① 服务器ip
②目录
③单板ip
NFS:可从单板挂接到linux服务器
也可从linux服务器挂接到单板
启动网卡
ifconfig eth0 up
/
/
附件:
void new_init_action(int action, const char *command, const char *cons)
<id>:<runlevels>:<action>:<process>
# <action>: Valid actions include: sysinit, respawn, askfirst, wait, once,
# restart, ctrlaltdel, and shutdown.
#define INIT_SCRIPT "/etc/init.d/rcS" /* Default sysinit script. */
从默认的new_init_action反推出一个inittab
/* Reboot on Ctrl-Alt-Del */
new_init_action(CTRLALTDEL, "reboot", "");
/* Umount all filesystems on halt/reboot */
new_init_action(SHUTDOWN, "umount -a -r", "");
/* Swapoff on halt/reboot */
if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");
/* Prepare to restart init when a HUP is received */
new_init_action(RESTART, "init", "");
/* Askfirst shell on tty1-4 */
new_init_action(ASKFIRST, bb_default_login_shell, "");
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
/* sysinit */
new_init_action(SYSINIT, INIT_SCRIPT, "");
inittab:
::ctrlaltdel:reboot
::shutdown:umount -a -r
::shutdown:swapoff -a
::restart:init
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
nfs启动:
set bootargs noinitrd root=/dev/nfs nfsroot=111.114.154.127:/work/nfs_root/first_fs ip=111.114.154.16:111.114.154.127:111.114.154.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
uboot:启动内核
内核:启动应用程序
open(/dev/console,sys_dup(0),sys_dup(0))//标准输入输出错误
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
构建:根文件系统
busybox:ls cp cd
ls链接到busybox,当执行ls时实质是busybox ls
内核启动文件系统中的第一个程序init
busybox--init_main
parse_inittab();
file = fopen(INITTAB, "r");//INITTAB = "/etc/inittab" /* inittab file location */
new_init_action
①创建一个init_action结构,填充
②把这个结构体放入init_action_list链表中
run_actions(SYSINIT);
run_actions(WAIT);
run_actions(ONCE);
while (1) {
run_actions(RESPAWN);
run_actions(ASKFIRST);
wpid = wait(NULL);
while (wpid > 0) {
for (a = init_action_list; a; a = a->next) {
if (a->pid == wpid){
a->pid = 0; //程序不会死掉,死了后,又会被重新运行。
message(L_LOG, "process '%s' (pid %d) exited. "
"Scheduling it for restart.",
a->command, wpid);}}}
inittab格式:<id>:<runlevels>:<action>:<process>
id-->/dev/id:用于终端 stdin,stdout,stderr;为空的话会指定为/dev/null
runlevels:完全可忽略
action:何时执行
process:应用程序或脚本
busybox--init busybox-1.7.0\examples\inittab这个文件对inittab格式有详细说明
完成① 读取配置文件:a指定应用程序;b何时执行应用程序
② 解析配置文件
③ 执行应用程序
/
/
制作文件系统:yffs2 jffs2 NFS /
/
/
一、最小文件系统:
①/dev/console 、 /dev/null
==> 用mknod创建,例:mknod 名字 文件类型 主设备号 次设备号
②init=>busybox。init本身,即busybox
③配置文件/etc/inittab指定的应用程序
==>创建/etc/inittab文件,内容是:console::askfirst:-/bin/sh
④c库
==> cp *.so* 第一个文件系统目录/lib -d :-d表示保持链接关系,负责链接文件的内容会复制被链接的文件,库会很大
配置、编译busybox可或得:②、③项
:解压;读readme文件、install文件
a编译为动态的
b设置编译交叉编译工具链;在makefile中设置:CROSS-COMPILE
最新版的busybox可在make menuconfig中配置交叉编译项
********************************************************
*************应用手册上有详解***************************
********************************************************
c将编译好的文件安装到将要编译成文件系统的文件夹中
最后:制作映像文件
书上是yaffs1:对小页的nand flash用,每一页512字节。
工具:自己编译--生成工具--拷贝工具--制作
tar xjf yaffs_source_util_larger_small_page_nand.tar.bz2
cd utils/
make
mkyaffs2image
********************************************************
*************应用手册上有详解***************************
********************************************************
二、改进
用ps命令发现没有/proc目录,创建/proc
有了/proc文件后,必须挂载一个虚拟文件系统[收集内核的信息]
mount proc none /proc
在ps出现一些内核信息。
修改:
①:
/etc/inittab文件内容是:
console::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS
rcS脚本内容,修改权限:
mount proc none /proc
②:
mount -a:
是根据/etc/fstab中的内容来挂载文件系统
/etc/fstab内容:
#device mount-piont type options dump fsck order
proc /proc proc defaults 0 0
cat /proc/mounts:查看当前挂载的文件系统
三、改进
udev-->自动创建设备节点:/dev/设备节点
简化版本:mdev
①创建sys目录:mkdir sys
②/etc/fstab
/etc/fstab内容:
#device mount-piont type options dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
③/etc/init.d/rcS
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hutplug
/*/proc/sys/kernel/hutplug会指向/sbin/mdev*/
mdev -s
/*创建内核现有的一些设备节点*/
四、jffs2一般用在nor flash上,现将它用在nand flash上。
压缩的系统
参考完全开发手册
./config --share --prefix=/urs
编译动态度 安装在/urs目录
mkfs.jffs2 -n -s 2048 -e 128KiB -d first_fs -o first_fs.jffs2
一页大小 一块大小 目录 输出
可擦除
设置文件系统参数,uboot传入的:
bootagrs=... rootfstype=jffs2 ....
五、制作NFS文件系统
a.从nand flash上启动文件系统,再用命令挂接NFS
要挂接NFS文件系统,NFS文件系统是在linux服务器上
linux服务器允许这个目录可被别人挂接
如何做到的:nfs服务;配置文件/etc/exports
内容:
linux服务器目录 *(rw,snyc,no_root_squash)
重启nfs服务
/etc/init.d/nfs restart
试验:自己挂接自己
mount -t nfs 192.168.1.127:/目录 /mnt
单板去挂接
在单板上创建/mnt目录 mkdir mnt
mount -t nfs -o nolock 192.168.1.127:/linux服务器中的目录 /mnt
b.单板直接从NFS启动
bootargs=noinitrd root=/dev/mtdblock3 init=linuxrc consoles=ttySAC0
修改命令行参数:
参考:nfsroot文件 子网掩码
set bootargs noinitrd root=/dev/nfs nfsroot=192.168.1.127:/linux服务器nfs配置项中设置的目录 ip=192.168.1.11:192.168.1.127:192.168.1.1:255.255.255.0::eth0:off init=linuxrc consoles=ttySAC0
[]表示这个参数可以省略;<>表示这个参数可以省略。 网关因为是同一个网段的,所以可以随便设
NFS启动参数:
① 服务器ip
②目录
③单板ip
NFS:可从单板挂接到linux服务器
也可从linux服务器挂接到单板
启动网卡
ifconfig eth0 up
/
/
附件:
void new_init_action(int action, const char *command, const char *cons)
<id>:<runlevels>:<action>:<process>
# <action>: Valid actions include: sysinit, respawn, askfirst, wait, once,
# restart, ctrlaltdel, and shutdown.
#define INIT_SCRIPT "/etc/init.d/rcS" /* Default sysinit script. */
从默认的new_init_action反推出一个inittab
/* Reboot on Ctrl-Alt-Del */
new_init_action(CTRLALTDEL, "reboot", "");
/* Umount all filesystems on halt/reboot */
new_init_action(SHUTDOWN, "umount -a -r", "");
/* Swapoff on halt/reboot */
if (ENABLE_SWAPONOFF) new_init_action(SHUTDOWN, "swapoff -a", "");
/* Prepare to restart init when a HUP is received */
new_init_action(RESTART, "init", "");
/* Askfirst shell on tty1-4 */
new_init_action(ASKFIRST, bb_default_login_shell, "");
new_init_action(ASKFIRST, bb_default_login_shell, VC_2);
new_init_action(ASKFIRST, bb_default_login_shell, VC_3);
new_init_action(ASKFIRST, bb_default_login_shell, VC_4);
/* sysinit */
new_init_action(SYSINIT, INIT_SCRIPT, "");
inittab:
::ctrlaltdel:reboot
::shutdown:umount -a -r
::shutdown:swapoff -a
::restart:init
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
tty4::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS