uboot,内核,根文件系统的启动过程

复习了下uboot,内核,根文件系统,简单概括下三者的主要内容。

1 uboot

uboot的目的:启动内核。

uboot的功能可以分为两个阶段任务。

1.2.1 uboot第一阶段

uboot第一阶段主要负责硬件相关的初始化,主要在cpu/arm920t/start.S中:

  • 关闭看门狗
  • 初始化SDRAM
  • 设置栈
  • 设置时钟
  • 代码重定位(从flash拷贝到SDRAM中)
  • 调用start_armboot函数。

1.2.2 uboot第二阶段

第二阶段是在start_armboot这个C函数中做的,

  • norflash初始化和nandflash初始化
  • 然后main_loop等待输入的命令,在里面有一个s=getenv(bootcmd),然后在倒计时到达之前没有收到空格命令的话(假如我们在倒数记时的时候输入了空格,就会等待输入命令),就会执行run_command(s,0),这里的s就是bootcmd,也就是bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm ox30007FC0。这条命令的意思是,从nandflash上面的kernel分区把内核读到SDRAM的ox30007FC0地址,然后从这个地址启动。
  • 然后从flash上读出内核放入SDRAM中。
  • 设置启动参数:uboot源码中用getenv("bootargs")读取bootarg参数,bootargs就是类似bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,读出来之后放到一个tag地址那里,然后启动内核的时候会把这个tag地址传给启动函数,然后内核就可以去tag那里读到bootarg的那些环境变量。
  • 跳到入口地址启动内核。

2 内核

内核的目的:运行应用程序。

内核启动分两个阶段:

  • 第一阶段:主要是head.S,读取第二个参数看一下是否支持这个单板;
  • 第二阶段:主要是start_kernel,首先进行了各种初始化,然后处理uboot传过来的第三个参数,根据这个第三个参数初始化控制台以及挂接根文件系统,然后再init_post里面启动应用程序。

3 根文件系统

应用程序位于根文件系统上面,要想运行应用程序,我们还要构建根文件系统。

  • 启动第一个程序:内核在init_post里面启动应用程序,首先打开/dev/console(一般也就是串口),然后判断如果我们的命令行参数里面有“init=”,例如init=/linuxrc,那么就会启动这个程序,如果命令行中没有“init=”,那么就会启动/sbin/init, /etc/init, /bin/init/ /bin/sh这五个程序中的一个,所以一般来说我们内核启动的第一个应用程序是execute_command或者/sbin/init。
  • init进程分析:sbin/init应该会有一个配置文件,配置文件里面指定了后续要用哪些应用程序,然后init进程去解析配置文件,然后根据配置文件去执行程序。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部