ken247. if action lt 0 token30 / token3: command /48. goto bad_entry49. / turn .TTY -gt /dev/TTY /50. if tty0 51. if strncmptty quot/dev/quot 5 052. tty 553. tty concat_path_filequot/dev/quot tty54. 55. new_init_action1 ltlt action token3 tty56. if tty057. freetty58. continue59. bad_entry:60. messageL_LOG L_CONSOLE quotBad inittab entry at line dquot61. parser-gtlineno62. 63. config_closeparser64. endif65. 可以看见,如果没配置文件 inittab 存在,它会默认一些配置。
其中抽取一个来分析,如下:1. static void new_init_actionuint8_t action_type const char command const char cons1. new_init_actionASKFIRST bb_default_login_shell VC_2 bb_default_login_shell -gt quot-/bin/shquot VC_2 -gt quot/dev/tty2quot action_type 对应 inittab 配置文件中 Action 字段 command 对应 inittab 配置文件中 Process 字段 cons 对应 inittab 配置文件中 id 字段 new_init_action 函数做了这些工作: 1、创建 init_action 结构,并填充。
2、把这个结构放入 init_action_list 链表 假如我们没有配置文件 inittab 存在,它会默认一些配置,我们从默认的 new_init_action 反推出默认的配置 文件 inittab。
1. if parser NULL2. endif3. 4. / No inittab file -- set up some default behavior /5. / Reboot on Ctrl-Alt-Del /6. new_init_actionCTRLALTDEL quotrebootquot quotquot7. / Umount all filesystems on halt/reboot /8. new_init_actionSHUTDOWN quotumount -a -rquot quotquot9. / Swapoff on halt/reboot /10. if ENABLE_SWAPONOFF11. new_init_actionSHUTDOWN quotswapoff -aquot quotquot12. / Prepare to restart init when a QUIT is received /13. new_init_actionRESTART quotinitquot quotquot14. / Askfirst shell on tty1-4 /15. new_init_actionASKFIRST bb_default_login_shell quotquot16. //TODO: VC_1 instead of quotquot quotquot is console -gt ctty problems -gt angry users17. new_init_actionASKFIRST bb_default_login_shell VC_218. new_init_actionASKFIRST bb_default_login_shell VC_319. new_init_actionASKFIRST bb_default_login_shell VC_420. / sysinit /21. new_init_actionSYSINIT INIT_SCRIPT quotquot22. return23. 根据这段代码写成 inittab 配置文件:1. id:runlevel:action:process2.3. ::CTRLALTDEL:reboot4. ::SHUTDOWN:umount -a -r5. ::RESTART:init6. ::ASKFIRST:-/bin/sh7. tty2::ASKFIRST:-/bin/sh8. tty3::ASKFIRST:-/bin/sh9. tty4::ASKFIRST:-/bin/sh10. ::SYSINIT:/etc/init.d/rcS 我们把这些包含执行时机、应用程序等结构体填充到 init_action_list 链表,这就完成了解析 inittab 文件函 数 parse_inittab,在 init_main函数继续走下去,执行 run_actions。
1. / Now run everything that needs to be run /2.3. / First run the sysinit command /4. run_actionsSYSINIT5.6. / Next run anything that wants to block /7. run_actionsWAIT8.9. / Next run anything to be run only once /10. run_actionsONCE11.12. / Redefine SIGHUP to reread /etc/inittab /13. if ENABLE_FEATURE_USE_INITTAB14. signalSIGHUP reload_signal15. else16. signalSIGHUP SIG_IGN17. endif18.19. / Now run the looping stuff for the rest of forever /20. while 1 21. / run the respawn/askfirst stuff /22. run_actionsRESPAWN ASKFIRST23.24. / Dont consume all CPU time -- sleep a bit /25. sleep126.27. / Wait for any child process to exit /28. wpid waitNULL29. while wpid gt 0 30. / Find out who died and clean up their corpse /31. for a init_action_list a a a-gtnext 32. if a-gtpid wpid 33. / Set the pid to 0 so that the process gets34. restarted by run_actions /35. a-gtpid 036. messageL_LOG quotprocess s pid d exited. quot37. quotScheduling for restart.quot38. a-gtcommand wpid39. 40. 41. / see if anyone else is waiting to be reaped /42. wpid wait_any_nohangNULL43. 44. 可见,最先执行是的 Action 字段里的 sysinit 这类,接着是 wait,接着是 once,最后是 respawn 和 askfirst。
在 run_actions 函数里,它提取 init_action_list 链表的项来用 waitfor执行应用程序或者脚本,等执行完毕,再用 delete_init_action删除链表中的该项。
小结,根文件系统要顺利执行用户应用程序需要: 1、/dev/console /dev/null 当不设置 inittab 里 id 字段的话,标准输入、输出、错误会自动定位到/dev/null 2、/etc/inittab 3、配置文件里指定的程序或者脚本 4、/lib 下的动态库 5、init 本身,即 busybox 根文件系统的构建与分析(二) 转载请注明 http://blog.csdn.net/jianchi88 Author:Lotte 邮箱:baihaowen08126.com 我们依旧记得系统启动流程:硬件上电--》bootloader--》Linux 内核--》挂载根文件系统--》应用程序 上一篇,我们建好了根文件系统的目录。
这篇的任务是 利用交叉编译工具链,构建动态库 qt 应用程序依赖一些动态库文件才能运行,如 qt 库,c 库。
因为应用程序本身需要使用 C 库的库函数,因此还 必需制作 for ARM 的 C 库,并将其放置于/lib 目录。
还记得交叉编译工具链的 3 个组成部分吗?交叉编译器、for ARM 的 C 库和二进制工具。
for ARM 的 C 库是现成的,我们只需要拷贝过来就可以了。
遗憾的是:整个 C 库目 录下的文件总大小有 26M。
而我们根文件系统所在分区不过区区 16M 而已,根本放不下。
怎么办呢?我们只需 要拷贝有用的。
交叉应用程序的开发需要用到交叉编译的链接库,交叉编译的链接库是在交叉工具链的 lib 目录下,我们在移植 应用程序到我们的目标板的时候,需要把交叉编译的链接库也一起移植到目标板上,这里我用到的交叉工具链的 路径是/opt/4.1.2/所以链接库的目录是/opt/4.1.2/arm-linux/lib,此 lib 目录有下面这些东西: 目标文件,如 crtn.o,用于 gcc 链接可执行文件 libtool 库文件(.la),在链接库文件时这些文件会被用到,比如他们列出了当前库文件所依赖的其它库 文件,程序运行时无需这些文件 gconv 目录,里面是各种链接脚本, 他们用于指定程序的运行地址, 在编译应用程序时, 各段的位置等(我 的 4.1.2 没有这个目录) 静态库文件(.a),例如 libm.a,libc.a 动态库文件 (.so、.so.0-9) 动态链接库加载器 ld-2.3.6.so、ld-linux.so.2 其它目录及文件 很显然,第 1、2、3、4、7 类文件和目录是不需要拷贝的。
由于动态链接的应用程序本身并不含有它所调用的 C 库函数的代码,因此执行时需要动态链接库加载器来为它加 载相应的 C 库文件,所以第 6 类文件是需要拷贝的。
第 5 类文件当然要拷贝。
1. rootlocalhost arm-linux du -c --si lib/ lib 目录一共.
上一篇:
深蓝培训
下一篇:
一年级第二学期语文期末测试卷答案2014