- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
u_ boot移植(九)之引导 Linux 内核
通过前面几节的学习 ,我 已经将uboot成功的移植到了开发板。在这里
我 思考一个问题 : 我 移植uboot的目的是什么呢?
嗯 ,我 移植uboot的终极 目的是用来引导Linux 内核的 ,接下来我 就
来了解一下 ,uboot是如何引导Linux 内核?
一、uboot 和 Linux 内核之间的参数传递
我 知道 ,uboot启动后已经完成了基本的硬件初始化 (如:内存、串口
等 ),接下来它的主要任务就是加载Linux 内核到开发板的内存 ,然后跳转
到Linux 内核所在的地址运行。
可能有人会问如何跳转呢?,做法很简单 ,直接修改PC寄存器的值为Linux
内核所在的地址 ,这样CPU就会从Linux 内核所在的地址去取指令 ,从而
执行内核代码。
需要注意的是 ,在执行Linux 内核代码前 ,uboot必须做好以下几件事情:
(1)CPU 寄存器的设
1R0 = 0
2R1 = 机器类型ID
3R2= 传递给Linux 内核参数所在内存中的起始地址
(2)CPU 工作模式设
1必须禁止中断(IRQs 和 FIQs)
2CPU 必须为SVC模式
(3)Cache 和 MMU 的设
1MMU 必须关闭
2指令Cache 可以打开也可以关闭
3数据Cache必须关闭
在ARM课程学习的过程中 ,我 讲解过函数间参数的APTCS标准 ,标准规
定函数的第[一、二、三、四]个参数分别用r0-r3来传递 ,这样大家应该就
明白上面的第一步CPU寄存器的设置 ,实际上是给Linux 内核传递参数。
为什么要给Linux 内核传递参数呢?
因为Linux 内核启动的时候 ,需要一些参数。uboot启动的时候 ,完成了
开发板上硬件的初始化 ,uboot可以自豪的说这块开发板我是支持的,但
是Linux 内核就很无语了 ,它是直接被加载内存中运行的 ,它对当前开发
板的环境是一无所知的。所以 ,Linux 内核启动的时候就规定了 ,你
uboot跳到我这里来运行的时候 ,必须告诉我一些信息 ,我要通过这些信
息来判断是否支持当前开发板。
所以了 ,uboot就把机器ID写到CPU的R1中 ,Linux 内核运行的时候首先
就从R1中读取机器ID来判断是否支持当前机器。
这个机器ID实际上就是开发板的ID,每个厂家生产出一款开发板的时候都会
给它指定一个唯一的ID,大家可以到uboot源码的
include/asm-arm/mach-types.h文件中去查看。
嗯 ,我 明白了为什么要传递机器ID,那R2的值又是什么意思呢?
R2中存放的是块内存的基地址 ,这块内存中存放的是uboot 给Linux 内核
的其他参数。这些参数有内存的起始地址、内存大小、Linux 内核启动后
挂载文件系统的方式等信息。
很明显 ,参数有多个 ,不同的参数有不同的内容 ,为了让Linux 内核能精
确的解析出这些参数 ,双方在传递参数的时候要求参数在存放的时候需要
按照双方规定的格式存放。
在Linux 内核2.6以前 ,双方传递参数的格式用 struct param_struct结构
体描述,Linux 内核2.6以后双方传递的参数用tag 列表的形式描述。虽然 目
前的Linux 内核两种格式都支持 ,但是Linux 内核更喜欢用tag列表的方式
传递参数 ,这里我 只介绍以tag列表的方式传递参数。
嗯 ,还是先来看看以tag列表方式传递参数涉及到一些数据结构:
从上面可以看出struct tag 结构体由 结构体struct tag_header + 联合
体u构成。结构体struct tag_header用来描述每个tag的头部信息 ,如tag
的类型 ,tag 大小。 联合体u 用来描述每个传递给Linux 内核的参数信
息。
下面以传递内存标记、命令行参数标记为例来说明参数的传递。
(1)设置开始标记ATAG_CORE
涉及到结构体定义如下:
tag_size 和 tag_next 定义如下:
(2)设置内存标记
相关结构体定义如下:
(3)设置命令行参数标记
命令行参数就是一
文档评论(0)