启动内核条件分析



Uboot启动内核的条件分析


下面我们主要的思路就应该放在内核启动参数中有哪些参数,也就是说启动参数我们应该设些什么。


那么下面我们来看启动参数中,主要有这么几种需要设置的,一个叫做“root=”记住这个不能有空格,因为它是个字符串。这个root代表我们启动的根文件系统在哪个设备中。这个在我们的后面学习的过程中你会慢慢体会到,就是说我们在linux系统启动过后其实是有一个问题就是要有一个问题文件系统或者是C盘的支持,然后要有c盘也就是我的电脑这样一个数据,我们才能进行下一步的交互。所以说,“root=”就告诉我们在哪个设备去找我们的根文件系统。


因为我们知道Linux最原始有根然后后面才有其他的东西。所以你没有根什么都看不到。


以上是第一个命令“root=”一点要关心root,root如果对应哪个设备,那可能还要根据这个设备的信息,这个设备的信息我们等一下在说,就是说这个设备信息就是你会通过选择设备,然后选择不同的启动方式,比如说有哪些启动设备呢?


第一个最典型的就是Ram,就是我们的文件系统本身就是在ram上运行,就是内存中的一个小块运行根,其他的都可以挂在U盘上。还有一种通过网络比如NFS,也就是说通过网口像网盘似得挂在我们的开发板上,因为我们开发板有可能flash还没好,有些时候我们实际开发就会涉及到一个问题,就是我们的工程师可能驱动还没做好,可能网卡驱动好了,这种情况下我们可以通过借助网卡这样一个设备把我们的根文件系统启动起来。还有一种就是flash文件系统。


以上是一类,还有一种因为现在只是指定了在哪个设备,那我们现在Linux启动中有一个非常重要的是我们学习高级编程说到过的,我们所以的进程都是通过一个父子关系的树状结构。而这个树状结构最终的根接点是“init=”。


那么就是说有了init后面就好办了,后面就不断的出现不同的功能了。当时我们启动的时候有个新的问题,我们的初始脚本叫什么,所以说“init=”实际就是uboot告诉内核,内核启动后,第一个可执行文件也就是init进程从哪里来。也就是说内核不管其他的,只要你告诉怎么做它来做就可以了。


以上就是两个非常重要的部分,有了这两个可以说内核启动就成功一大半了。然后剩下还有一个关键词就是“console”console这个单词顾名思义就是控制台,就是说这个是告诉我们内核启动时,使用哪个设备作为控制台,因为根据这个设备我们就可以看到这个设备中的输入输出,比如说我们的串口就是最典型的控制台,因为在开发板上我们不可能用lcd来做,因为它还是个驱动。所以用串口的方式应该是最直接最典型。


所以我们这个思路就是这样的,下面我在给大家试验一下把上面的三种关键词改成跟bootargs合在一起,然后这个内核启动就又成功一大半了。然后我们先来试验一下:


analys1.png


如图,我们现在先考虑第一个问题,输入命令“setenv bootargs”记住设的环境变量都是两个空格,第一个空格名字,第二个空格就开始跟东西了。至于跟什么第一个“root=”随便写,比如说我们现在这个/dev/mtdblock2,至于为什么这么写等一下我们在说,这是采用的我们后面要学mtd的第二个分区。然后init=/linuxrc(根目录下的rc,这个在我们以后做文件系统就知道,其实我们根目录下确实有个文件叫linuxrc)最后我们在来console=ttySAC0,115200。ttySAC0其实是我们arm中(内核里一般有个设备名称就叫tty终端SAC0就是串口0的一个概念)这样就相当于把这样一个启动参数设置好了也就是最终要输入命令:“setenv bootargs root=/dev/mtdblock2init=/linuxrc console=ttySAC0,115200 ”然后我们先保存一下免得每次都要重新写。然后我们重启开发板过后。


analys2.png


如图,输入命令“tftp 20008000 uImage”把uImage下载下来。然后我们输入pri看一下bootargs已经有值了。


analys3.png


然后我们在试验一下,输入命令“bootm 20008000”点击回车我们会发现出现了很多信息,甚至包含我们内核中比如说“S5PV210”CPU等等信息,以及我们的一些内存分区表,这就说明我们的Linux已经起来了。


但是你会发现在最后还是不行,因为我敲回车没有任何反应,也就是说我还是没有办法跟开发板进行交互,也就是说这个Linux是不正常的。也就是说我们仅仅是把内核起来了但是由于没有根文件系统也就是说没有办法进行交互。


analys4.png


如图,之前在我们Linux学习过程中有一个比较经典的图,图中最小的圆圈的硬件,硬件被操作系统(也就是小圆圈外面的那一层圆圈)保护起来,也就是用户不能直接去访问,但是操作系统用户也不能直接访问,所以在操作系统最外面还有一个程序也就是我们所说的shear(图上最大的圆圈),然后我们用户是通过shear,然后通过shear访问操作系统然后通过操作系统去访问硬件。所以这是一种乘积关系,而我们shear是一种应用程序,而应用程序运行至少要有个文件就比如说C盘或D盘才能运行起来,而我们Linux中想要运行shear就一定要有个目录去存,而这个目录就要挂载到根,有了根才能有其他的。


而我们刚才对应root这个部分,我们是随便设置的,所以这样的话也会导致我们的内核没有完全启动。但是内核其实已经起来了,只是用户没法交互,因为我们以后学了驱动就会知道,如果这个时候我在内核中做了一个手脚。就比如我做一个定时灯的闪烁。因为在很多场合中我们经常会用到,比如说像有些路由器你会发现可能路由器已经出问题了,但你会发现它有的灯还在闪,这个闪烁的原因不受应用层的控制而是说它内核中做了一个相当于“看门狗”似得,就代表内核还在调动只是应用程序可能没有了所以说它可能有一个状态灯。


以后我们可以做这样一个实验,就是如果没有文件系统支持其实内核还是跑起来了,但是用户没法通过shear去交互。但是对于我们开发来说还是不行,因为我们还是用不了。所以说总的来说内核启动其实有三大条件,第一个应该有bootm这样的命令支持,有了bootm还不行,因为bootm只是把uimage的头给解析出来了,然后把内核加载到内存给运行,然后内核运行还需要一个启动参数,而这个启动参数我们设置三个过后确实发现内核起来了,但是这个内核起来过后还有个新问题,因为根文件系统没有所以导致用户没法交互。


所以说要想完成内核启动,我们就要考虑文件系统的烧写功能,所以整个内核启动它有一个非常完善的流程。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

logo
© 2012-2016 www.maiziedu.com
蜀ICP备13014270号-4 Version 5.0.0 release20160127

免费领取价值1888元求职宝典!

客服热线 400-862-8862

回到顶部