U-boot流程及启动kernel
参与Helper2416开发板助学计划心得
简述
这里只做一些简单的笔记,相当于一个提纲,方便自己以后复习和继续学习,不做详细的讲解。
毕竟,对于初学者来,要彻底的搞懂u-boot的前前后后还是很有难度的。
U-boot(1.3.4)第一阶段启动笔记
用一张图来大概说明第一阶段完成了的那些工作
第二阶段。
1:进一步初始化本阶段所要用到的设备
2:检测系统内训映射
3:然后就是等待执行各种u_boot的命令
4:设置启动参数,然后就是启动内核
启动参数及内核启动条件
Kernel启动为什么需要启动参数?
# :当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值,这时候就需要我们手动传递参数给内核,来满足他的正常运行了
怎么把这些参数传递给Kernel?
# :可以通过两种方法传递参数给内核,一种是旧的参数结构方式(parameter_struct),主要是 2.6 之前的内核使用的方式。另外一种就是现在的 2.6内核在用的参数链表 (tagged list) 方式。这些参数主要包括,系统的根设备标志,页面大小,内存的起始地址和大小,RAMDISK的起始地址和大小,压缩的RAMDISK根文件系统的起始地址和大小,当前内核命令参数等而这些参数是通过struct tag来传递的,所以我们只需要把这个tagged list放在内存的木一块区域内,然后把它的地址告诉内核,让内核从这个位置读取就行了。
Struct tag 具体是怎样的一个结构?
# :
- struct tag {
- struct tag_header hdr;
- union {
- struct tag_core core;
- struct tag_mem32 mem;
- struct tag_videotext videotext;
- struct tag_ramdisk ramdisk;
- struct tag_initrd initrd;
- struct tag_serialnr serialnr;
- struct tag_revision revision;
- struct tag_videolfb videolfb;
- struct tag_cmdline cmdline;
-
- /*
- * Acorn specific
- */
- struct tag_acorn acorn;
-
- /*
- * DC21285 specific
- */
- struct tag_memclk memclk;
-
- struct tag_mtdpart mtdpart_info;
- } u;
- }
复制代码详细的结构可以参考u-boot目录下的include/asm-arm/setup.h文件
uImage与zImage的区别是什么?
# :
zImage 是内核源码make后生成的原始vmlinux经过gzip压缩后的文件
uImage 是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40Byte的tag,此tag中包含了内核的入口地址等信息。
Kernel启动条件:
1:CPU必须处于SVC模式,并且禁止IRQ&FIQ
2:MMU必须关闭
3:DCache必须关闭
4:ICache关不关无所谓
5:R0必须为0
6:R1为machine type(CPU ID)
7:R2为启动参数列表的起始地址
内核启动
R0、R1、R2其实就是传给kernel入口函数的三个参数,该入口函数的地址就是kernel编译时的链接地址,要启动内核我们必须要把zImage复制到给地址上,而对于uImage来说由于前面的0x40Byte内容包含相关信息,UBOOT会根据里面的信息把0x40Byte以后的内容(即zImage)复制到指定的地址,接下来在我们准备好上述kernel启动条件后,把该地址灌入PC,就可以成功跳转至内核了!
后记:
启动内核其实并不难,关键是要把启动参数设置好,对于前面的把kernel读取到SDRAM中的指定位置,初始化SDRAM后,通过简单的nand读取函数,把kernel读取出来就行了,感兴趣的也可以自己写个bootloader出来玩玩!可以参照u-boot的源码,顺便学习u-boot的编程风格!
论坛ID:yuanlai2010
发表时间:2014-07-31