ARM嵌入式设备的启动流程分析概述

来源:互联网 发布:中国软件重组预期 编辑:程序博客网 时间:2024/05/22 12:43

题目写的比较大,讲讲我的体会吧:
首先uboot 分两份,前半部分成为垫脚石,用来搬运后半部分到指定的RAM中去执行。这些如果比较好奇,那就去百度吧,懒得写。
bootargs=noinitrd console=ttyS0,115200 root=/dev/nfs nfsroot=129.1.5.109:/home/collector/nuc970bsp/rootfs_48 bootm 0x7FC0 ip=129.1.5.107:129.1.5.109:129.1.5.109:255.255.255.0 rdinit=/sbin/init mem=64M; bootcmd=tftp 0x7FC0
然后这个配置里面告诉了 init进程启动的console 还有 rootfs的路径还有类型,还有这个内核的镜像的搬移位置是0x7FC0,当然这个不是执行位置,因为咱们用makimage工具生成的前面还有一个头呢。
uboot知道从哪里去找kernel呢?在上面这里给出的是通过tftp的方式传输到0x7FC0位置的然后启动。如果我想要从flash中启动呢?我们看
nboot 0x7FC0 0 0x200000 ;bootm 0c7fc0
看到没,是不是很简单,我直接从flash 0x200000的位置使用nboot搬移过来就可以了.
现在是不是好奇,如果我不是用nfs呢,我用的是yaffs直接烧录到flash中呢。这个也简单我继续贴。
这里写图片描述
这里面也包含了root路径还有 类型
如果是ubi 呢?好嘛我继续贴
这里写图片描述
看到没都是大同小异的东西。只要把这个写到uboot环境变量中就好使。就能传给内核。告诉 我根文件系统的启动位置。
有点乱,但是我讲明白了一个问题。uboot从哪里找到kernel,kernl从哪里找到rootfs.那么现在还是存在一个问题,rootfs从哪里找到我们的应用层数据呢?莫慌,先补充一个知识。
文件系统映像文件的定义:就是将一个目录下的内容按照一定的格式放到一个文件中,这个文件可以直接烧录在存储设备上去。当系统启动后挂载这个文件,然后我们就可以在挂载点上看到该目录中的原来的内容。
看完这个定义,大家就明白了吧。我们的应用层文件可以搞成一个文件系统文件然后烧进flash中去。我们烧到一个mtd分区之后,然后通过mount -t 把他挂载到一个rootfs分区的下面不就搞定了么。举个例子,比如我们吧应用层程序制作成yaffs镜像,然后烧录到flash的mtdbolock1分区。rootfs起来之后,我们在rcS脚本中使用,mount -t jffs2 /dev/mtdblock1 /mnt/data就可以了!!!这样做还带来了一个好处,我们可以在系统完全起来之后,通过tftp 向/mnt/data 存文件,就直接能干到mtdblok1分区里面,惊不惊悚,神不神奇!!!写到这里我感觉还是不满足,这个mtd是什么时候分配的flash,有什么办法?
baudrate=115200
bootargs=console=ttyS0,115200n8 root=/dev/ram0 rdinit=/sbin/init mem=64M mtdparts=nand0:0x200000@0x0(u-boot),0x1000000@0x200000(kernel_ramfs),-(usrdata) nandboot
bootcmd=udkernel ; nboot 0x7FC0 0 0x200000 ;bootm
bootdelay=3
ethact=emac
ethaddr=00:00:fc:63:66:88
gatewayip=129.1.88.1
ipaddr=129.1.22.99
mtddevname=u-boot
mtddevnum=0
mtdids=nand0=nand0
netmask=255.255.0.0
serverip=129.1.4.96
stderr=serial
stdin=serial
stdout=serial1
找到mtdparts了没?就是这么搞。或者你再linux 内核里面配置也是可以的。问题又来了,你这直挂了一个yaffs,不足以满足 我的好奇心,现在ubi文件系统用的那么火,展示一下怎么挂载ubi,好的

#attach mtd2 to be ubi volume  ubiattach /dev/ubi_ctrl -m 2  #make ubi1 size=80MiB dynamic  ubimkvol /dev/ubi0  -N usrdata -s 83886080 -t dynamic  #mount ubit ---> /mnt/data  mount -t ubifs ubi0_0 /mnt/data  

http://blog.csdn.net/liuzijiang1123/article/details/49559607
贴上个链接。其实看完这个之后你更应该产生一个疑惑,这个ubi0_0跟ubi1_0是什么鬼。
这里写图片描述
看了这个图就明白了吧。
这样, 咱们就从uboot kernel rootfs userdata 这所有的关联起来了。咦,有人又冒出来了说你的0xfc07是哪里来的?奥这个是内核里面有的,就是指定了你这个kernel运行的位置。然后这个位置再加上那个mkimage头,加完了正好你就得把这个image搬运到0x7fc0位置。这东西,在正常的芯片开发手册都会告诉你,不然你去查看kernel源码,当然,我也搜过,现在忘记在哪个文件里了。不同的芯片这个默认参数还不一样。当然你说可以去改动这个配置的。姑且没什么意义不说,还容易出问题咋办。稀里糊涂的就到这儿吧。

原创粉丝点击