看视频笔记----文件系统

来源:互联网 发布:50部网络禁书下载 编辑:程序博客网 时间:2024/05/01 01:48
文件系统

1.u-boot:启动内核
2.内核:启动应用程序
3.构建:根文件系统



if (sys_open((const char __user *) "/dev/console", O_RDWR, 0)< 0)
printk(KERN_WARNING "Warning: unable to open an initialconsole.\n");

(void) sys_dup(0);
(void) sys_dup(0);

current->signal->flags |=SIGNAL_UNKILLABLE;

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.");
}

内核怎样启动第一个应用程序
执行应用程序在 init_pos 函数中
(1)(const char __user *) "/dev/console", O_RDWR, 0)
(void) sys_dup(0);
(void) sys_dup(0);
打开了一个设备 open(/dev/console)(对应于终端,串口)
sys_dup(0),sys_dup(0)
对应于标准输出printf(),标准输入scanf(),标准错误err()

if (execute_command) {           //如果execute_command有定义,就执行下面的,
         //由u-boot传过来
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");
//run_init_process用来启动程序。
//这几个函数都是执行了就不会返回的。
//如果没有跟文件系统就不能打开"/dev/console",也不能运行下面的4条命令。
可以用ps查看当前正在运行的程序。

busybox:是ls,cp,cd的集合
执行ls,cp的命令,其实是执行busybox,可以通过 ls -l /bin/ls 查看
用 busybox ls 和 ls 是一样的结果
上面代码run_init_process("/sbin/init");中的/sbin/init也是指向busybox的链接,可以通过busybox查看具体的功能。
在busybox-1.16.0/coreutils/cp.c 中有对cp命令的函数int cp_main(int argc,char **argv),也有init/init.c
init程序(1)读出配置文件(2)解析配置文件(指定程序及何时执行)(3)执行用户程序
busybox -> init_main
parse_inittab();
file = fopen(INITTAB, "r");// 打开配置文件/etc/inittab
new_init_action
run_actions(SYSINIT);
waitfor(a, 0); //执行应用程序,等待他执行完毕
run(a); //创建子进程
waitpid(runpid,&status, 0);//等待结束
delete_init_action(a);//从init_action_list链表删除
run_actions(WAIT);
run_actions(ONCE);
run(a);//创建子进程
delete_init_action(a);//从init_action_list链表删除
    //少了waitpid(runpid,&status,0);
while (1) {
run_actions(RESPAWN | ASKFIRST);
if(a->pid == 0)
{a->pid = run(a);}
wpid = waitpid(-1, NULL, maybe_WNOHANG);//等待子进程推出
}

new_init_action()
1.创建一个init_action结构,填充
2.把这个结构放入init_action_list链表

从默认的new_init_action()反推出
inittab格式
<id>:<runlevels>:<action>:<process>

id -> /dev/id,用作终端:stdin,stdout,stderr,printf,scanf,err
runlevels:忽略
action: 执行时机
process: 应用程序或脚本



new_init_action(CTRLALTDEL, "reboot", "");
new_init_action(SHUTDOWN, "umount -a -r", "");
if (ENABLE_SWAPONOFF)
new_init_action(SHUTDOWN, "swapoff -a", "");
new_init_action(RESTART, "init", "");
new_init_action(ASKFIRST, bb_default_login_shell, "");
//TODO: VC_1 instead of ""? "" is console ->ctty problems -> angry users
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);
new_init_action(SYSINIT, INIT_SCRIPT, "");
return;


if (!DEBUG_INIT &&ENABLE_FEATURE_USE_INITTAB)
bb_signals_recursive_norestart((1<< SIGHUP), record_signo);

run_actions(SYSINIT);
check_delayed_sigs();
run_actions(WAIT);
check_delayed_sigs();
run_actions(ONCE);
while (1) {
int maybe_WNOHANG;
maybe_WNOHANG = check_delayed_sigs();
run_actions(RESPAWN | ASKFIRST);
maybe_WNOHANG |= check_delayed_sigs();
sleep(1);
maybe_WNOHANG |= check_delayed_sigs();

if (maybe_WNOHANG)
maybe_WNOHANG = WNOHANG;
while (1) {
pid_t wpid;
struct init_action *a;

wpid = waitpid(-1, NULL, maybe_WNOHANG);
if (wpid <= 0)
break;

a = mark_terminated(wpid);
if (a) {
message(L_LOG, "process '%s' (pid %d) exited. "
"Scheduling for restart.",
a->command, wpid);
}
}
}
}


跟文件系统最少的项
1./dev/console /dev/null
2.init->busybox
3./etc/inittab
4.配置文件里指定的应用程序
5.库
init本身,即busybox


创建最小文件系统
1.编译busybox
a 解压 tar xjf busybox-1.16.0
b cd busybox-1.16.0
c 在 busybox-1.16.0/INSTALL文件中有对编译的介绍
make menuconfig     # Thiscreates a file called ".config"
  make              # Thiscreates the "busybox" executable
  make install       # or makeCONFIG_PREFIX=/path/from/root install
默认的是安装到当前的系统,应该用make CONFIG_PREFIX=/path/from/rootinstall

在配置文件里面makefile中CROSS_COMPILE?=arm-linux-(arm-linux-要自己加上,最新的版本,有这个配置项)
或者在make的时候用 make CROSS_COMPILE =arm-linux-,makefile中有提示(# makeCROSS_COMPILE=ia64-linux-)
安装,创建一个目录/first_fs,然后 make CONFIG_PREFIX=创建的文件路径/first_fsinstall

2.创建/dev/console /dev/null
在系统中查看 ls -l /dev/console /dev/null
crw------- 1 root root 5, 1 Aug  1 08:14/dev/console
crw-rw-rw- 1 root root 1, 3 Aug  1 08:14/dev/null
进入/first_fs,
mkdir dev
cd dev
sudo mknod console c 5 1
sudo mknod null c 1 3

3.构造/etc/inittab
如果没有,他就会启动默认的配置项
在/first_fs下,
mkdir etc
vi etc/inittab
加入内容 console::askfirst:-/bin/sh

4.指定程序没有必要设定
5.拷贝c库

制作镜像文件yaffs

之后没有看完视频
0 0
原创粉丝点击