6234|1

241

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

Helper2416-23——U-boot学习笔记01——U-boot流程及启动kernel [复制链接]

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 具体是怎样的一个结构?

#
  1. struct tag {
  2.         struct tag_header hdr;
  3.         union {
  4.                 struct tag_core         core;
  5.                 struct tag_mem32        mem;
  6.                 struct tag_videotext    videotext;
  7.                 struct tag_ramdisk      ramdisk;
  8.                 struct tag_initrd       initrd;
  9.                 struct tag_serialnr     serialnr;
  10.                 struct tag_revision     revision;
  11.                 struct tag_videolfb     videolfb;
  12.                 struct tag_cmdline      cmdline;
  13.                
  14.                 /*
  15.                 * Acorn specific
  16.                 */
  17.                 struct tag_acorn        acorn;
  18.                
  19.                 /*
  20.                  * DC21285 specific
  21.                  */
  22.                 struct tag_memclk       memclk;
  23.                
  24.                 struct tag_mtdpart      mtdpart_info;
  25.         } u;
  26. }
复制代码
详细的结构可以参考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




最新回复

你好  我先在正在移植uboot   遇到不少困难可否给些帮助  我的qq是811017489  谢谢   详情 回复 发表于 2016-6-22 11:13
点赞 关注

回复
举报

5

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你好  我先在正在移植uboot   遇到不少困难可否给些帮助  我的qq是811017489  谢谢
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表