u-boot的目的是:启动内核;
内核的目的是:启动应用程序,应用程序又位于根文件系统;
构建:根文件系统。
如果理解了以上三步,就可以从无到有在一个单板上搭建出一个根文件系统来。
内核的目的是:启动应用程序。那么应用程序有那么多,到底启动哪一个应用程序呢?
上一节有说过,是在init_post函数里面启动应用程序的。
那么,内核怎么启动第1个应用程序?
首先,打开一个设备,open(/dev/console),然后sys_dup(0);sys_dup(0);
这三句话是什么意思呢?
答:我们写程序时经常会用到printf(标准输出),scanf(标准输入),err(标准错误),这是指三个文件,根据我们打开的顺序,依次是/dev/console,/dev/console,/dev/console(sys_dup(0)表示和第0个一样),也就是说所有消息都从/dev/console输出和输入,这个/dev/console叫做终端,对于我们来说,这个设备就是串口0,对于其他设备则不一定。
ramdisk_execute_command先不管,接着往下看,execute_command是一个指针,如果它不指空,那么就调用run_init_process来执行execute_command。
查看execute_command可以看到,execute_command指向的是uboot传给内核的命令行参数中init=后面的字符串,也就是\linuxrc。
也就是说,如果命令行参数中定义了一个init,那么就启动这个init,否则就往下依次顺序执行。一般来说,init程序不会有返回,一旦开始就会一直跑,知道关机。
所以,init程序就是命令行参数中指定的init程序,或者是/sbin/init。
程序启动成功后,可以使用ps命令查看一下有哪些应用程序在跑了,其中的 init就是第1个应用程序, -sh 就是shell。
总结一下,内核是怎样启动第1个应用程序的呢?
答:
- 首先打开一个设备,设置一下标准输入,标准输出,标准错误的终端;
- 然后通过run_init_process来调用第1个应用程序。
启动u-boot后,通过ls指令可以看到,有许多文件,这些文件是做什么用的呢?下一节再来分析一下。