您的位置:笔笔发 技术资料 嵌入式操作系统 Android 正文
内容搜索
笔笔发:技术产业信息平台----成就有识之士创业梦想的殿堂
热门内容
推荐内容
U-Boot启动内核分析

本文章共5265字,分4页,当前第1页,快速翻页:
 

先来引用一下这篇介绍“ARM Linux内核启动要求”的文章ARM Linux Kernel Boot Requirements,是ARM Linux内核的维护者Russell King写的。
引用:
    * CPU register settings
          o r0 = 0.
          o r1 = machine type number.
          o r2 = physical address of tagged list in system RAM. 
    * CPU mode
          o All forms of interrupts must be disabled (IRQs and FIQs.)
          o The CPU must be in SVC mode. (A special exception exists for Angel.) 
    * Caches, MMUs
          o The MMU must be off.
          o Instruction cache may be on or off.
          o Data cache must be off and must not contain any stale data. 
    * Devices
          o 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_PPC
static boot_os_Fcn do_bootm_linux;
#else
extern 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); 
 

 
点这里复制本页地址发送给您QQ/MSN上的好友
相关文章

Uboot体系分析
Android 开发技巧与性能优化
Android 开发入门教程
Linux 初学者入门教程
Linux 驱动教程
Android Kernel Porting 的简单总结
Android 系统 framework 概述
Android的应用程序结构分析:HelloActivity
Android目录结构分析
Android RIL Developer's Guide
android线程局部存储的研究
linux 蓝牙驱动代码阅读笔记
Android的Camera架构介绍
Android内核的简单分析
Android的多媒体框架OpenCore介绍

相关评论


本文章所属分类:首页 技术资料 嵌入式操作系统 Android


反馈意见和建议