【vc++精品源码栏目提醒】:网学会员在vc++精品源码频道为大家收集整理了“根文件系统构建与分析 - 软件工程“提供大家参考,希望对大家有所帮助!
根文件系统的构建与分析(一) 转载请注明 http://blog.csdn.net/jianchi88 Author:Lotte 邮箱:baihaowen08126.com 此系列,我想从初学者的角度来体验怎样构建根文件系统,显然,我也是个初学者。
根文件系统第一个进程 init 到启动用户应用程序的过程: qt 应用程序也做了,u-boot、内核也移植了,那启动内核后,怎样才能运行 qt 应用程序呢?内核启动后,操作系 统做了些什么? U-Boot 目的 ――→ 启动内核 ↓ 内核 目的 ――→ 启动第一个进程 init(放在根文件系统上) ↓ 根文件系统 ↓ 用户应用程序 在内核初始化收尾阶段(/kernel-2.6.30.4/init/main.c)流程,start_kernel → rest_init → kernel_init → init_post。
下面的代码是内核启动最后阶段执行的 init_post 函数:1. static noinline int init_postvoid2. __releaseskernel_lock3. 4. / need to finish all async __init code before freeing the memory /5. async_synchronize_full6. free_initmem7. unlock_kernel8. mark_rodata_ro9. system_state SYSTEM_RUNNING10. numa_default_policy11.12. if sys_openconst char __user quot/dev/consolequot O_RDWR 0 lt 013. printkKERN_WARNING quotWarning: unable to open an initial console.nquot14.15. void sys_dup016. void sys_dup017.18. current-gtsignal-gtflags SIGNAL_UNKILLABLE19.20. if ramdisk_execute_command 21. run_init_processramdisk_execute_command22. printkKERN_WARNING quotFailed to execute snquot23. ramdisk_execute_command24. 25.26. /27. We try each of these until one succeeds.28. 29. The Bourne shell can be used instead of init if we are30. trying to recover a really broken machine.31. /32. if execute_command 33. run_init_processexecute_command34. printkKERN_WARNING quotFailed to execute s. Attempting quot35. quotdefaults...nquot execute_command36. 37. run_init_processquot/sbin/initquot38. run_init_processquot/etc/initquot39. run_init_processquot/bin/initquot40. run_init_processquot/bin/shquot41.42. panicquotNo init found. Try passing init option to kernel.quot43. 在启动第一个程序前,首先打开控制台设备 sys_openconst char __user quot/dev/consolequot O_RDWR 0 lt 0,这样 init 进程就拥有一个控制台,并可以从中读取输入信息在串口终端显示,也可以向其中写入信息。
在 bootloader 里设置传给内核的参数 init/linuxrc,execute_command 就等于/linuxrc,如果定义了,就会 run_init_processexecute_command执行这个应用程序,如果没有定义这个参数,就会往下走。
执行 run_init_processquot/sbin/initquot run_init_processquot/etc/initquot run_init_processquot/bin/initquot run_init_processquot/bin/shquot 中的其中一个。
另外要说明的是,run_init_process一旦执行了 init 或者 linuxrc,就不会返回,一直执行。
init 这个进程是所有进程的父进程,有了它,后面才能有 shell、qt 等进程。
Init 进程的功能: 它是所有其他进程的父进程。
init 进程根据文件的内容运行一系列程序和脚本文件,完成系统的各项配置,最终达到启动用户应用程序的目的。
下面我们来追随 init 的运行。
i am a line 当我们进入根文件系统,发现有很多命令,如 ls、cp、rm 等,这些都是应用程序,但这些都是通过链接到 busybox 实现的功能。
如: /bin/ls -gt busybox /bin/cp -gt busybox /bin/rm -gt busybox 就连 sbin/init 进程也是链接到 busybox 的,所以 busybox 是很多命令程序和工具的集合。
所以要分析 init 怎么运 行,就要分析 busybox。
解压 busybox 源码,在/init/init.c。
(这个就是编译 busybox 后就是被 init 链接的代码) 函数调用流程: busybox -gt init_main -gt parse_inittab -gt run_actions 解析 inittab 文件函数 parse_inittab 在 parse_inittab函数里,首先打开/etc/inittab 这个文件,接着解析 inittab。
inittab 配置文件的格式说明和例子在 busybox 的源码里面有,搜索一下就能找到。
---------------------------------------------------------------------------------------------------------------------- inittab 配置文件的格式: id:runlevel:action:process 其中: –Id:用来指定所启动进程的控制台,在嵌入式系统中一般不添; –Runlevel:busybox 完全忽略 runlevel 字段; –Action:指出 init 程序在执行相应 process 时,对 process 所采取的动作 ltactiongt: Valid actions include: sysinit respawn askfirst wait once restart ctrlaltdel and shutdown. –Process:具体的执行程序或者脚本; ----------------------------------------------------------------------------------------------------------------------- 在 为 回到源码, parse_inittab函数里, inittab 文件作一些添油加醋的修饰后,最终调用 new_init_action, 下面进行分析。
1. static void parse_inittabvoid2. 3. if ENABLE_FEATURE_USE_INITTAB4. char token45. parser_t parser config_open2quot/etc/inittabquot fopen_for_read6.7. if parser NULL8. endif9. 10. / No inittab file -- set up some default behavior /11. / Reboot on Ctrl-Alt-Del /12. new_init_actionCTRLALTDEL quotrebootquot quotquot13. / Umount all filesystems on halt/reboot /14. new_init_actionSHUTDOWN quotumount -a -rquot quotquot15. / Swapoff on halt/reboot /16. if ENABLE_SWAPONOFF17. new_init_actionSHUTDOWN quotswapoff -aquot quotquot18. / Prepare to restart init when a QUIT is received /19. new_init_actionRESTART quotinitquot quotquot20. / Askfirst shell on tty1-4 /21. new_init_actionASKFIRST bb_default_login_shell quotquot22. //TODO: VC_1 instead of quotquot quotquot is console -gt ctty problems -gt angry users23. new_init_actionASKFIRST bb_default_login_shell VC_224. new_init_actionASKFIRST bb_default_login_shell VC_325. new_init_actionASKFIRST bb_default_login_shell VC_426. / sysinit /27. new_init_actionSYSINIT INIT_SCRIPT quotquot28. return29. 30.31. if ENABLE_FEATURE_USE_INITTAB32. / optional_tty:ignored_runlevel:action:command33. Delims are not to be collapsed and need exactly 4 tokens34. /35. while config_readparser token 4 0 quot:quot36. PARSE_NORMAL amp PARSE_TRIM PARSE_COLLAPSE 37. / order must correspond to SYSINIT..RESTART constants /38. static const char actions ALIGN1 39. quotsysinit0quotquotrespawn0quotquotaskfirst0quotquotwait0quotquotonce0quot40. quotctrlaltdel0quotquotshutdown0quotquotrestart0quot41. int action42. char tty token043.44. if token3 / less than 4 tokens /45. goto bad_entry46. action index_in_stringsactions to
上一篇:
深蓝培训
下一篇:
试题库管理系统毕业论文