- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
U-Boot启动内核分析
U-Boot启动内核分析先来引用一下这篇介绍“ARM Linux内核启动要求”的文章ARM Linux Kernel Boot Requirements,是ARM Linux内核的维护者Russell King写的。
CPU register settings
r0 = 0.
r1 = machine type number.
r2 = physical address of tagged list in system RAM.
CPU mode
All forms of interrupts must be disabled (IRQs and FIQs.)
The CPU must be in SVC mode. (A special exception exists for Angel.)
Caches, MMUs
The MMU must be off.
Instruction cache may be on or off.
Data cache must be off and must not contain any stale data.
Devices
DMA to/from devices should be quiesced.
The boot loader is expected to call the kernel image by jumping directly to the first instruction of the kernel image.
大致就是以上条件了,请特别关注一下第一条,这个基本上就是U-Boot的go命令和bootm命令之间的本质区别所在了。先来看看bootm命令的实现,在common/cmd_bootm.c的第119行开始有:
#ifdef CONFIG_PPCstatic boot_os_Fcn do_bootm_linux;#elseextern boot_os_Fcn do_bootm_linux;#endif 这里的预编译宏说明了,非 PPC体系结构的CPU的do_bootm_linux()函数都不是在这个文件内实现的(extern)。可想而知,这个函数的实现应该是和体系结构相 关的,具体到arm体系结构的实现就是在lib_arm/armlinux.c这个文件当中。可以看到从lib_arm/armlinux.c中的第77 行开始就是do_bootm_linux()函数的实现。
?
其中第85行声明了这样一个函数指针theKernel:
void (*theKernel)(int zero, int arch, uint params); 看看它的名字和参数的命名我们 也可以猜到这个其实就是内核的入口函数的指针了。几个参数的命名也说明了上文提到的ARM Linux内核启动要求的第一条,因为根据ACPS(ARM/Thumb Procedure Call Standard)的规定,这三个参数就是依次使用r0,r1和r2来传递的。
?
接下来第93行就是给这个函数指针赋值:
theKernel = (void (*)(int, int, uint))ntohl(hdr-ih_ep); 可以看到theKernel被 赋值为hdr-ih_ep,这个hdr是指使用tools/mkimage工具程序制作uImage时加在linux.bin.gz前面的一个头 部,而ih_ep结构体成员保存的就是使用mkimage时指定的-e参数的值,即内核的入口点(Entry Point)。 知道了hdr-ih_ep的意义之后,给theKernel赋这个值也就是理所当然的了。
?
最后是对内核入口函数的调用,发生在第270行:
theKernel (0, bd-bi_arch_number, bd-bi_boot_params); 调用的时候对参数进行赋值,r0=0,r1=bd-bi_arch_number,r2=bd-bi_boot_params,一个都不少。至此U-Boot的使命完成,开始进入ARM Linux的美丽新世界。
?
====================================================================
?
要知道哪个地址是启动内核,哪个地址启动文件系统,要分析common/cmd_bootm.c中的函数do_bootm,因为引导kernel就是bootm这条命令的工作,do_bootm是命令bootm的执行函数。
现在我们来分析一下common/cmd_bootm.c中的函数do_bootm,这是bootm命令的处理函数。
……
image_header_t header;
ulo
您可能关注的文档
最近下载
- 研究院LNG冷能利用.ppt VIP
- [中央]2024年中国记协新闻培训中心招聘 笔试上岸试题历年典型考题及考点剖析附答案详解.docx
- (陶矜老师课件)股权设计与合伙人激励.pdf VIP
- if与unless专项练习.doc VIP
- 2023年北京市高考化学试卷(解析版).pdf VIP
- 有限空间作业安全管理监理实施细则(新).pdf VIP
- 直播电商与案例分析第10章 农产品直播解析.ppt VIP
- 2023款 R18 B 宝马摩托车 中文 用户保养手册 使用说明书.pdf VIP
- 2022年国家公务员考试《公安专业科目》题(网友回忆版).docx VIP
- USCAR38 超声波焊接技术标准和要求(中文版).pdf VIP
文档评论(0)