嵌入式Linux启动作业流程分析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式Linux开启步骤分析(转) linux 嵌入式 脚本 action login 终端 当Bootloader将控制权交给内核引导程序时,第一个实施程序就是head.S,它完成了加载内核大部分工作;misc.c则提供加载内核所需要子程序,其中解压内核子程序是head.S调用关键程序,另外内核加载还须知道系统硬件信息,该硬件信息在hardware.h中定义并被head.S所引用。本系统中内核开启步骤图1所表示。 本系统中,head.S首先配置S3C4510B系统寄存器SYSCFG、初始化系统Flash、SDRAM和总线控制寄存器,将Flash和SDRAM地址范围分别设置为0x0-0x1fffff和0x1000000-0x1ffffff;依据本系统功效特点,重新定义了中止优先级和I/O口配置;为了提升内核运行速度,将2M内核映像文件从Flash拷贝到SDRAM;经过操作部分系统寄存器,进行系统存放器重映射,将Flash和SDRAM地址区间分别重映射为0x1000000-0x11fffff和0x0-0xffffff;然后初始化系统堆栈;接着调用misc.c中函数decompress_kernel,对拷贝到SDRAM内核映像文件进行解压缩;最终跳转到实施调用内核函数call_kernel,调用call_kernel函数实际上是实施main.c中start_kernel函数,该函数完成功效包含处理器结构初始化、中止初始化、定时器初始化、进程相关初始化和内存初始化等初始化工作;最终内核创建一个init线程,在该线程中调用init进程,完成系统开启 ?当用户打开PC电源,BIOS开机自检,按BIOS中设置开启设备(通常是硬盘)开启,接着开启设备上安装引导程序lilo或grub开始引导Linux,Linux首优异行内核引导,接下来实施init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务任务后,返回init;init开启了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这么就完成了从开机到登录整个开启过程。 --power on--BIOS--Lilo/Grub--Kernerl boot--init(rc.sysinit, rc)? --mingetty(login)--Shell---- 下面就将逐一介绍其中多个关键部分:   第一部分:内核引导(核内引导)   Red Hat9.0能够使用lilo或grub等引导程序开始引导Linux系统,当引导程序成功完成引导任务后,Linux从它们手中接管了CPU控制权,然后CPU就开始实施Linux关键映象代码,开始了Linux开启过程。这里使用了多个汇编程序来引导Linux,这一步泛及到Linux源代码树中“arch/i386/boot”下这多个文件:bootsect.S、setup.S、video.S等。   其中bootsect.S是生成引导扇区汇编源码,它完成加载动作后直接跳转到setup.S程序入口。setup.S关键功效就是将系统参数(包含内存、磁盘等,由BIOS返回)拷贝到尤其内存中,方便以后这些参数被保护模式下代码来读取。另外,setup.S还将video.S中代码包含进来,检测和设置显示器和显示模式。最终,setup.S将系统转换到保护模式,并跳转到 0x100000。   那么0x100000这个内存地址中存放是什么代码?而这些代码又是从何而来呢?   0x100000这个内存地址存放是解压后内核,因为Red Hat提供内核包含了众多驱动和功效而显得比较大,所以在内核编译中使用了“makebzImage”方法,从而生成压缩过内核,在RedHat中内核常常被命名为vmlinuz,在Linux最初引导过程中,是经过arch/i386/boot/compressed/中head.S利用misc.c中定义decompress_kernel()函数,将内核vmlinuz解压到0x100000。   当CPU跳到0x100000时,将实施arch/i386/kernel/head.S中startup_32,它也是vmlinux入口,然后就跳转到start_kernel()中去了。start_kernel()是init/main.c中定义函数,start_kernel()中调用了一系列初始化函数,以完成kernel本身设置。start_kernel()函数中,做了大量工作来建立基础Linux关键环境。假如顺利实施完start_kernel(),则基础Linux关键环境已经建立起来了。   在start_kernel()最终,经过调用init()函数,系统创建第

文档评论(0)

132****5705 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5104323331000004

1亿VIP精品文档

相关文档