龙芯1B在uboot下与MTD分区的关系,及启动引导参数和内核烧录命令的部分解释

本文将从硬件入手,到解释龙芯1B开发板启动时的参数设置相关问题。
首先简单介绍一个存储器的相关知识,重点在存储器的存储过程。

一、存储器相关知识

存储器,可分为主存储器和辅助存储器,主存储器又称为内存储器(就是平时大家所谓的,内存),外存储器,指内存及CPU缓存以外的存储器,包括营盘硬盘、软盘、光盘、U盘等设备。外存储器和内存的区别在于,外存储器在断电重启后,存储的数据不会丢失,而内存会丢失。
之所以将存储器进行这样的划分,是为了进行互补。CPU如果直接从外存抓取数据,这样如果外存过大,则会需要过长的时间,所以这个时候就需要内存作为中间桥梁,先到硬盘复制一份进来,再让CPU直接到内存中抓取数据做运算,这样可以提升运算速率。在CPU和内存之间,还存在一个CPU自带的缓存,就是Cache,我理解,平常说的2G或者4G的CPU核显,就是指这一部分。CPU里还带有一个Register的部分。
处理速度上:CPU(Register)>Cache>内存>外存(越上层,即越靠近CPU,速度越快,价格越高,成本高了,容量就大不了)
龙芯中使用的外存就是的NAND flash,速度较快,价格较低,在龙芯核心板中,包含了两块128MB的nand flash。后面提到的根文件系统等,都是写入在nand flash中。
在龙芯中烧写程序时,是先将程序烧写到了内存中,然后从内存搬运到nand flash中。
包括在龙芯启动的过程中,也是先将启动文件从存储位置拷贝到内存空间,再在内存中启动,因此所谓的不同位置启动,只是从不同位置拷贝而已

二、启动引导参数及烧录命令的部分解释

下面就要说到UBIFS
UBIFS是flash专用文件系统,以解决当前嵌入式环境下,以flash作为mtd设备的技术瓶颈。
UBI:一种类似于LVM的逻辑卷管理层,主要实现损益均衡,逻辑擦除块,卷管理、坏块观念里等。
UBIFS:基于UBI的flash日志文件系统。
MTD:内存技术设备,是用语访问flash等存储设备的linux的子系统。就是一个内存和硬盘之间的一个桥梁。有了这个,存储设备的挂载将变得更加简单。
U-boot挂载的顺序:
1、规划nand flash空间,以龙芯为例
龙芯中的分区情况
分区不绝对,可自行规划
Linux下固态存储设备(NAND flash算其中一种)对系统组件的安排,一般为
2、加入ubi驱动
1)引导加载程序(即uboot)
2)引导参数(即bootargs,这里面涉及很多参数,很重要,设置错误容易起不来)
3. 从ubifs启动
1)内核(即uImage,这个在后面经常刷,刷内核刷的就是这玩意,简而言之,就是更改系统配置)
2)根文件系统(rootfs,就是系统中的文件的构成)
注意,MTD分区,内核可以识别到的分区,内核的操作都是基于MTD分区的,uboot分区似乎只是为了方便操作而已。比如,在nand flash规划之后,内核区域进行重新编译
MTD写法:nand write 0x30000000 0x00200000(需要制定大小和偏移量,需要记住0x00200000这个偏移量)
uboot写法:nand write 0x30000000 kernel(只需要记住他的名字就行,不用写偏移量)

以龙芯1B的配置命令为例,根文件系统为ubifs:
setenv bootargs console=ttyS5,115200 root=ubi0:rootfs ubi.mtd=root,2048 rootfstype=ubifs rw ${mtdparts} noinitrd init=/linuxrc video=ls1xfb:1024*768-16@60
console=ttyS5,115200的意思是,使用虚拟串口终端设备,端口为ttyS5,波特率设置为115200,ttyS5就是龙芯核心板上的RS232口,可以通过底板图看出。
root=ubi0:rootfs,意思是根文件系统,即rootfs,从ubi0进行挂载。root为指定rootfs的位置,跟后面的ubi.mtd=root,不是同一个root,不是同一个意思。
ubi.mtd=root,2048的意思是,指定第二个分区,和ubi.mtd=1,等价,这里的root,指的是龙芯1B分区中,第二个名为root的分区,指定根目录系统文件作用在root这个分区。2048是偏移量,便宜开头文件部分。设置该参数必须跟当前flash的mtd-id相一致,不然整个mtdparts会失效。
rootfstype=ubifs,需要跟“root=”这一项,一起配合使用,指明文件系统的类型。
noinittrd init=/linuxrc的一丝丝,没有使用ramdisk启动系统,指定进入系统后运行的第一个脚本是/linuxrc,即根目录下的linuxrc脚本。
video-ls1xfb:1024*768-16@60 这一句指示的是输出信号,输出信号为1024*768,16位,频率为60hz。

其他的龙芯1B刷内核等的操作,重要的是不要擅自更改写入的分区的位置,不然容易出错。
以刷内核为例:
tftpboot a0100000 uImage;nand erase.part kernel;nand write 80100000 kernel ${filesize}
这一句中包含了三句命令
tftpboot a0100000 uImage; 这一句是通过tftp下载名为uImage的文件到a0100000的内存的位置。
nand erase.part kernel; 将flash中的kernel,即内核部分擦除。
nand write 80100000 kernel ${filesize} 在kernel部分,将上面下载下来的uImage文件写入。

猜你喜欢

转载自blog.csdn.net/baidu_31788709/article/details/89166387