linux内核启动过程和启动第一个应用程序

内核的最终目的就是运行应用程序(位于根文件系统)。
内核启动相关的一些重要过程
1、判断是否支持这个processor,即CPU。
2、判断是否支持U-boot传进来的机器ID。
linux内核启动过程和启动第一个应用程序_第1张图片
机器ID是在在r1寄存器中存放的。
在这里插入图片描述
其中_arch_info_begin和_arch_info_end在连接脚本中定义,他们之间存放的是所以架构相关的初始化信息*(.arch.info.init)。
在这里插入图片描述
那么现在的当务之急便是找到在代码里谁被定义为.arch.info.init。用grep命令在内核中搜索后发现,其定义在arch.h文件中。(用SourceInsight工具查出MACHINE_START和MACHINE_END,并将其置换后,就会发现其相当于定义了一个类型为machine_desc的结构体,machine_desc仍然定义在arch.h文件中。)
linux内核启动过程和启动第一个应用程序_第2张图片
总结:从以上分析不难发现对于每一个单板,内核中都会有一个MACHINE_START结构体与之对应;而这些结构体被放在连接脚本的_arch_info_begin和_arch_info_end之间。内核启动的时候就会把他们一个个的读出来去与U-boot传来的ID进行比较,若吻合的话就表示内核支持这个单板
3、创建页表
linux内核启动过程和启动第一个应用程序_第3张图片
4、使能MMU
5、跳到内核的第一个C函数 start_kernel(init/main.c),它会对在命令行传入参数的进行处理函数,挂接根文件系统,最终会调用mount_root函数;挂接根文件系统后会调用init_post来打开/dev/console,最终执行应用程序等。函数的调用关系如下:
linux内核启动过程和启动第一个应用程序_第4张图片

应用程序这么多,那么究竟是怎样启动第一个应用程序呢 ?内核源码启动应用程序的函数如下:
linux内核启动过程和启动第一个应用程序_第5张图片

linux内核启动过程和启动第一个应用程序_第6张图片
由此可见其打开了一个设备 /dev/console;通过run_init_process来启动xxx程序(在U-boot命令行bootargs传来的int=xxx)若不成功的话就执行/sbin/init,若/sbin/init不成功的话就执行/etc/init,依此轮推,若都失败的话就会执行panic函数。
内核启动后输入ps命令便可看到第一个启动的应用程序init
linux内核启动过程和启动第一个应用程序_第7张图片

另外需要注意的是:和我们紧密相关的flash上没有严格的分区,它的分区在内核代码中是写固定的
linux内核启动过程和启动第一个应用程序_第8张图片

你可能感兴趣的:(Linux,kernel)