看视频笔记----文件系统
来源:互联网 发布: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有定义,就执行下面的,
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链表删除
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 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
- 看视频笔记----文件系统
- 看django视频笔记
- javascript看视频笔记
- 看视频做笔记
- 看视频如何做笔记
- 看Blog学习之道视频笔记
- 看尚学堂视频Java学习笔记
- 看V512视频Jsp/Servlet学习笔记
- 看朱老师视频笔记-------C语言
- redis看视频学习笔记(初识)
- 看视频
- 看尚学堂马士兵JSP的视频笔记
- 黑马程序员--看第二次视频复习笔记1C#基础
- 看的oracle数据库视频 记的一点笔记
- 看视频做的笔记——内核
- 自学笔记之-看视频学习oc基础
- 黑马程序员,看Java基础视频笔记:反射
- 看cuda初级教程视频笔记-GPU体系架构概述
- Linux Kernel Makefiles
- 看视频做的笔记——内核
- linux超级终端minicom的使用方法[…
- android:inputType参数类型说明
- 编译busybox是遇到的问题--- [netw…
- 看视频笔记----文件系统
- 驱动中使用class_device_create()…
- Linux基础: 解密module_init幕后…
- version magic '2.6.30.4 mod_unlo…
- linux2.6关于中断的一些入门介绍
- 原子操作(代码)
- 原子操作,信号量
- Linux内核开发之中断与时钟[转]
- 一个ExtJS+jsp+Servlet与数据库连…