广东快3>WIKI库>学习嵌入式>嵌入式Ramdisk启动概述

嵌入式Ramdisk启动概述



Ramdisk启动概述分析


广东快3打开我们的串口,然后把开发板上电过后就会得到这样一个情况如下图:


ram5.png


广东快3如图,这个地方我在提点,有可能开发板上电后我这个网卡刚开始没有储存好所以说这个时候你发现这个灯没有亮,你最好先去ping一个,随便一个IP都可以。主要就是让我们的程序把我们的网卡进行一个重新的初始化,不然可能会导致它的芯片内部是睡眠状态,我们就给他唤醒。下面还是一样我们先把它下载下来看看它的效果,就是根据我们刚才内存的布局来说,首先第一步先把我们的内核先下载下来。输入命令“tftp 2000080000 uImage”点击回车键后。


ram6.png


如图,我们看到这里出现了一点问题,但是没关系,因为是之前我这个内核重启过后出现的一些问题,我们把开发板重新启动一下就可以了。这个问题可能就是一个超时的问题,因为我之前网卡插拔过后可能有一个tomout的关系导致那个软件不是很稳定。


但是没有问题我们重新按照之前的步骤来一次就可以了,同样的,这个地方我们只是把内核下载下来了,下载下来过后我们仍然没有完成整个文件系统的部署,所以下面一部开始部署文件系统。输入命令“tftp 21000000 initrd.img.gz”就相当于放在内存的另外一个位置上,然后把已经有了的文件叫做initrd.img.gz。点击回车键就开始进行下载。


ram7.png


广东快3如图,下载完后我们还需要做一件事情,就是根据刚才我们所讲的内容我们还需要设置一个启动参数,把启动参数让uboot传递给内核,然后内核就按照部署把整个系统启动起来了。


然后我们来试验一下,输入命令“setenv bootargs(然后输入空格,大家注意这里就不要使用等号了,因为你的变量就是靠空格使得这个地方的等号出现,根据我们刚刚的我们讲的内容后面应该是)root=/dev/ram(ram过后我们还需要指定ram的起始地址和大小)initrd=0x21000000,8M(变量名称,这样两个选项其实就把启动参数告诉内核的具体信息就可以了)init=linuxrc(这是我们系统启动的一个引导程序)console=ttySAC0,115200”这样我们的参数就已经设置完了,剩下的事情就是熟人命令“bootm 20000800000”。


ram8.png


如图,其实非常顺利,我们可以看到这样一个信息就是跑完之后可以看到RAMDISK这句话然后开始挂载root,也就是说挂载根文件系统已经挂成功了,因为没挂成功,这个地方一般都会出现一些出错,如果你们在这个地方没有挂成功,主要检查的有以下几个问题:第一个是看initrd后面的地址跟对没有,大小跟对没有。还要注意后面必须是8M,因为现在我们给大家做的是8M,等以后我们开始自己定制我们的文件系统的时候,8M就可以变。还有一个就是,内存地址千万不要写错,看看你部署的地址跟你设置的地址是不是一致的。


广东快3下面我们接着看上图,这是开发板串口的,这时候我们看到“Freeing init memory:128k”这句话其实也是成功的一大半,意思就是释放初始化的内存128k。这个一般情况就是内核已经把所以需要初始化的部分做完了,剩下就是真正做内核的核心事情。


ram9.png


如图,我们看到有一个任意键进入console,点击回车键后,我们看到一个非常熟悉的东西就是Linux下的提示符“root@localhost”甚至来说我敲ls也可以看到一定的信息。我们可以这样来理解,现在开发板上已经运行起一台真正的Linux系统,而这样的话,我们在之前学习高级编程介绍的所有的一些程序,我们其实都可以通过交叉编译的方式在开发板上运行起来,就比如这里面有hello world,因为你想ls能运行甚至echo也有这样的程序,比如输入命令“echo “hello world””因为echo本身也是个程序,那么说明它已经编译进去了。


所以这样的话,可以说我们这个系统的基本步骤就已经完成了,然后剩下的事情就是应用工程师包括你们一些产品经理等等根据外界设备的一些数据进行一些业务层次的开发。


广东快3所以这就是我们一种比较典型的开发方法。


下面我们回过头来看,所谓的ramdisk其实就是说我们在整个内核启动的基本流程在回忆一下。第一个就要有内核,等内核启动的时候我们一般来说不推荐“go”命令而采用的是一个“bootm”的命令,因为“bootm”命令它最终是解决UImage的启动,而“go”命令可能会启动一些其他程序,比如我们在之前讲arm裸机程序的时候,大家可以想象一下,那个时候逻辑程序其实就是ping文件那个文件其实从一上来就是可执行的arm的汇编程序。所以这个时候我用“go”命令可以达到一定的效果,也就是说我们可以用uboot中现有的“go”命令来完成我们前期arm开发中涉及到的一些裸机程序,可以在开发板上运行。


因为我们的uboot可能已经把内存等一些设备都调试好了,这样的话我们在后期开发一些裸机程序的时候就可以利用这样的大内存来做更复杂的一些事情。


所以“go”命令天生不是为了启动内核,它可以把PC值给改变。而“bootm”的命令也不是为了启动内核,是专门启动UImage的。那么我们不是光有“bootm”的命令就可以了。


我们说内核启动至少要分两个比较核心的东西,一个是通过uboot告诉内核该怎么样去启动,而这个怎么样去启动是通过uboot中一个非常重要的变量叫做“bootargs”,通过“bootargs”我们就可以把这个内核的启动参数去设置到变量里面,而启动参数一般情况下分三大块,第一块是根的事情,根在哪这个信息一般是分两种的,一种非常简单就是root=,第二种光有root还不行,我们还有对设备跟具体信息进行指定。然后剩下的两块,一个是initrd一个是console,initrd是我们第一个可执行的初始化的主线进程,init进程的指定。Console是我们真正可以进行交互以及查看信息的一个窗口。


所以说这是一个比较重要的问题,那么只是启动参数也不行,因为这个时候我们只是把内核起来了,内核中要想跟用户真正的进行交互,比如我们要打印“hello world”这样一种应用程序的需求,我们也需要一种根文件系统的支持,也就是说root=已经指定了根在哪里,那么我是不是也应该把根部署在这个位置上,所以这样的话,我们还需要第二个参数就是文件系统的部署或者是文件系统的支持。


广东快3文件系统我们后面会单独去讲到,文件系统的部署方法非常非常多,我们现在只是先给大家看一个,比如说我们刚刚说的“ramdisk”,对于“ramdisk”大家一定要把它掌握到,也就是说你要告诉内核你要用什么样的方法去部署。


广东快3你只是告诉内核,但是我们作为测试人员我们还要把内存按照一个特定的要求给它部署进去,这样才能进行测试。


广东快3最后,因为这是人为的,所以剩下的事情就应该把自动化的事情给处理了,也就是说我们不可能把开发板卖给用户后还需要用户自己敲东西。所以我们肯定要经过一个自动化处理,比如说倒计时过后它自动开始启动加载内核。这其实就是uboot中设置的一点技巧,通过一些参数的增加,我们就可以完成这件事情。



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

分享到:

目录