您的位置 首页 报告

ARM 平台上的Linux系统启动流程

开始学习嵌入式开发就一直在使用Linux系统作为学习的平台,到现在无论是PC机还是ARM开发板都已经能顺利地跑起了Linux系统,但是对Linux…

  开端学习嵌入式开发就一直在运用Linux体系作为学习的渠道,到现在无论是PC机仍是ARM开发板都现已能顺畅地跑起了Linux体系,可是对Linux 的发动流程仍是不甚了解。所以开端各种百度谷歌,当然看到了各路大神写的介绍。总的来说便是:bootloader ->kernel->root filesystem,当然还介绍了哪个阶段完结了哪些作业。比方bootloader 是一上电就拿到cpu 的操控权的,而bootloader完结了硬件的初始化。bootloader俨然就成了power on 之后”第一个吃螃蟹”的代码。

  谈到这就得想到硬件机制是怎么满意这个功用的了。就拿S3C2440 这个芯片来说(我的硬件渠道便是拿这个芯片作为主芯片),CPU内部集成了一块容量为4KB 的 sram (又名stapping stone 垫脚石),当体系一上电,NAND controler 就自动地将nand flash 里的前4K内容到垫脚石里,而PC 指针一上电就指向垫脚石的开端地址0x00。这样这一部分的代码就能够得到履行。能够幻想,假如这一部分的代码便是bootloader 的一部分,那一上电bootloader 不就能够得到运转了么?现实的确如此,在嵌入式Linux的软件体系中,nandflash前面一部分代码往往便是bootloader ,然后便是kernel, 再接着便是根文件体系。

  说了这么多,如同都没提到发动流程啊,别着急,咱渐渐谈,所谓磨刀不误砍柴工嘛。

  要说发动流程,假如仅仅简略的介绍从哪到哪,谁干了啥啥,得到的成果或许仅仅只知其然不知其所以然。个人觉得跟着CPU的PC指针走,循着代码的脚印才能把整个流程理清楚,当找到了代码的履行进程,再剖析一下代码,天然知道了哪个部分完结了哪些事,更重要的是为代码的移植打下了坚实的根底。天然这个进程是苦楚和单调的,乃至是看代码看了几天也没弄理解,不过这也是一种训练。好了不扯了,立刻进入主题。

bootloder :

  前面说了,bootloader一上电就拿到了cpu 的运用权,它当然得干一些初始化的作业啊,比方封闭看门狗、设置cpu 的运转形式、设置仓库等等比较急切的作业。当然还要对主板的一些其他硬件进行简略的初始化 比方网卡,显现屏,nand flash 等等的初始化作业,最终还要担任把Linux内核加载到内存中。正所谓职责和权利是并存的嘛,你得到了权益,当然就得支付。当bootloader 完结它的使命之后就会把cpu 的运用权交给下一部分代码:kernel 。

kernel:

  在评论kernel 是怎么发动之前,先了解kernel 的组成结构以及是怎么得来的。

  下面这张图是内核编译行将结束时显现的信息:

下面的这张图说明晰上面的编译进程,

  能够看到,当内核源文件编译链接成vmlinux文件今后还进行了几个模块的编译和链接。其间vmlinux 是ELF格局的object文件,这种文件仅仅各个源代码经过衔接今后的得到的文件,并不能在arm渠道上运转。经过objcopy这个东西转化今后,得到了二进制格局文件Image,Image文件比较于vmlinux 文件,除了格局不同以外,还被去除了许多注释和调试的信息。Image文件经过紧缩今后得到了piggy.gz ,这个文件仅仅是Image的紧缩版,并无其他不同。接着编译生成别的几个模块文件misc.o big_endian.o head.o head-xscale.o,这几个文件组成一个叫bootstrap loader 的组件,又名引导程序。编译生成 piggy.o 文件。最终piggy.o文件和bootstrap loader 组成一个bootable kernel Image 文件(可发动文件)。

  能够看到最终得到的可履行文件便是上图最右边那个,这也是咱们最终烧写到开发板的镜像。其间piggy.o 便是内核镜像,而剩余的几个文件就组成了引导程序。  

  下面开端评论CPU的流通进程:

  仍是用一个图来展现:

  从上图能够看出,体系一上电就开端履行bootloader 当bootloader 履行完今后,把操控权交给了引导程序的head.o 文件里的start 标号处,当引导程序完结引导作业今后就将操控权转给真实的内核的head.o 文件里的start 标号处。这儿便是内核的进口点,最终内核的head.o将操控交给main.o 的start_kernel 函数。这样,经过查看相应的代码就能够知道这些代码究竟完结了哪些作业。在这儿咱们能够找到相应的代码,剖析一下,看它们究竟完结哪些事。下面是我的剖析成果:

引导程序: 又名bootstrap loader ,作为bootloader 和kernel之间的枢纽。head.o从bootloader接过操控权后bootstrap loader开端作业,并完结如下使命:

    1. 使能 I/D caches ,封闭中止 , 树立C运转环境(即设置仓库)由 head.o 和head-xscal.o 完结   

    2. 解紧缩偏重定位代码 ,由misc.o 完结

    3. 其他硬件相关的设置,如big.endian.o 为cpu设置大端形式

    4. 将操控权交给内核的 head.o

内核进口点:从引导程序接过操控权,完结如下使命

    1. 查看有用的cpu 和cpu的信息

    2. 创立初始化页表进口

    3. 使能MMU

    4. 检测过错并陈述

    5. 跳转到内核自身 main.c 文件里的 start_kernel()函数。head-common.S 有一句完结跳转句子:b start_kernel

内核发动:从kernel 的head.o接过操控权,开端内核的发动,在这儿完结内核的初始化,如内核各个子体系的初始化。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/277290.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部