1、BootLoader

在CPU上电启动时,一般连内存控制器都没有初始化过,根本无法在主存中运行程序,更不可能处在Linux内核启动环境中,为了初始化CPU及其他外设,使得Linux内核可以在系统主存中运行,并让系统符合Lintix内核启动的必备条件,必须要有一个先于内核运行的程序,即所谓的引导加载程序Boot Loader, Boot Loader是在操作系统内核启动之前运行的一段小程序。通过这段程序,系统可以初始化硬件设备,从而将系统的软/硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境,最后从别处(Flash、以太网、UART)载入内核、映像到主存并跳到入口地址。

U-Boot是Das U-Boot的简称,其含义是Universal Boot Loader,是遵循GPL条款的开放源码项目。Boot Loader的操作方式包括启动加载模式和下载模式。

2、BootLoader的主要任务

依赖于CPU体系结构的代码,如设备初始化代码等,通常都放在stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。

3、Boot Loader的stage1通常包括以下步骤(按执行的先后顺序)

(1)硬件设备初始化。
(2)为加载Boot Loader的stage2准备RAM空间。
(3)拷贝Boot Loader的stage2到RAM空间中。
(4)设置好堆栈。
(5)跳转到stage2的C入口点。

4、Boot Loader的stage2通常包括以下步骤(按执行的先后顺序)

(1)初始化本阶段要使用到的硬件设备。
(2)检测系统内存映射。
(3)将Kernel映像和根文件系统映像从Flash上读到RAM空间中
(4)为内核设置启动参数。
(5)调用内核。

嵌入式系统在复位后就直接运行Boot Loader,当Boot Loader的控制权被释放后,内核阶段就开始了,内核在进行一些初始化操作之后,就调用“/init/main.c”中的 start kernel函数,该函数会调用一系列初始化函数来设置中断,执行进一步的内存配置。之后,“/arch/i386/kernel/process.c”中kernel_thread被调用以启动第一个核心线程,该线程执行init函数,作为核心线程的init函数完成外设及其驱动程序的加载和初始化,挂接根文件系统,搜索init程序的顺序是“/sbin/init”、“/etc/init”、“/bin/init”和“/bin/sh”。

5、U-boot 烧写过程

使用U-boot将映像文件烧写到板上的Flash,一般步骤是:
(1)通过网络、串口、U盘、SD卡等方式将文件传输到SDRAM。
(2)使用Nand Flash或Nor Flash相关的读写命令将SDRAM中的数据烧入Flash。

注意:如果使用SD卡和U盘形式更新U-boot,那么首先SD卡和U盘中必须有FAT32文件系统,并在里面存放了u-boot.bin文件。
举例:通过NFS服务烧入Nand Flash。
nfs 3000800 192.168.1.100:/home/tekkaman/development/share/u-boot.bin
nand erase 0 0x40000
nand write 0x30008000 0 0x40000

6、内核的引导过程

内核的引导步骤如下。
(1)用U-boot的mkimage工具处理内核映像zImage。(不同的品台使用不同的工具)
(2)通过网络、串口、U盘、SD 卡等方式将处理过的内核映像传输到SDRAM的一定位置(一般使用0x30008000)。
(3)使用“bootm”等内核引导命令来启动内核。
通过Nand Flash引导内核。首先要将处理过的内核映像文件烧入Nand Flash的一定位置(由内核分区表决定)。以后每次启动时用Nand Flash的读取命令先将这个内核映像文件读到内存的一定位置(由制作内核映像时的“-a”参数决定),再使用bootm命令引导内核。
举例:通过NFS服务引导内核。
nfs 30008000 192.168.1.100:/home/tekkaman/development/share/zImage.img
bootm 30008000

BootLoader简介——linux内核的引导相关推荐

  1. 双核Linux内核的引导

    最后再整一篇多核的引导,称热打铁 Linux内核的引导 引导Linux系统的过程包括很多阶段,这里将以引导ARM Linux为例来进行讲解(见图3.11). 一般的SoC内嵌入了bootrom,上电时 ...

  2. BootLoader与Linux内核的参数传递

    在嵌入式系统中,BootLoader 是用来初始化硬件,加载内核,传递参数.因为嵌入式系统的硬件环境各不相同,所以嵌入式系统的BootLoader 也各不相同,其中比较通用的是U-Boot,它支持不同 ...

  3. 和菜鸟一起学linux内核之引导启动篇

    注:以下大部分内容摘自linux内核编程入门篇和linux内核完全注释 对于linux的整个体系结构有了一定的了解,看了每个目录的文件整体概要,那么就 可以开始看内核的源码了,首先那便是引导启动了. ...

  4. linux内核enforcing引导参数

    enforcing参数是在启动内核时传递给selinux的内核参数,它用来决定你系统的内核运行于 强制(enforcing )模式还是自由(permissive) 模式. 在自由模式下SELinux只 ...

  5. archlinux php7 mysql_xboot-x4412ibox项目实战7-Linux内核的引导 - Powered by Discuz!

    asmlinkage void __init start_kernel(void) { char * command_line; extern const struct kernel_param __ ...

  6. 【linux】BootLoader简介(c语言编程)

    BootLoader简介 一.BootLoader     1.BootLoader的作用             一个嵌入式linux系统从软件的角度看通常可以分为4个层次:            ...

  7. BootLoader、Linux Kernel(linux内核)、RootFile(根文件系统)

    这3部分是怎么相互协作来构成这个系统的呢? 各自有什么用呢? 三者有什么联系? 怎么联系? 系统的执行流程又是怎么样的呢? 搞清楚这个问题你对整个系统的运行就很清楚了,对于下一步制作这个linux系统 ...

  8. Linux内核引导简析

    bootsect.S.setup.S.head.S分析 收藏 2010-01-14 13:36:34 bootsect.S,系统引导程序,一般不超过512字节. 在PC系统结构中,线性地址0xA000 ...

  9. 简述arm linux内核启动流程,Linux内核启动过程和Bootloader(总述)

    1.Linux内核启动过程概述 一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux 内核,文件系统,应用程序.其中 Bootloader是系统启 ...

最新文章

  1. RDKit | 基于支持向量机(SVM)的二分类活性预测模型
  2. apollo java客户端_02、携程Apollo Java客户端使用指南
  3. 每天一个linux命令(31): /etc/group文件详解
  4. 苹果iPad视觉设计分析
  5. NSTimer循环引用的问题
  6. RabbitMQ负载均衡(1)
  7. 操作篇 HYbrid的应用和学习
  8. S/4HANA的生产订单,哪个字段可以用来做生产完成的标志位
  9. 1087 有多少不同的值 (20 分)
  10. .ps文件怎么打开_ps界面的认识及文件的打开
  11. PHP 父类静态方法中调用子类静态方法
  12. 送女朋友的java小程序_用C编写一个送给女朋友的情人节小程序 可爱!
  13. linux下获取微秒级精度的时间【转】
  14. 基于字典的超分辨率实现的各种方法
  15. 【bzoj 3131】[Sdoi2013]淘金
  16. python求15 17 23 65 97的因数_Python练习题
  17. 微信小程序商品详情页面开发案例
  18. HDRP高清渲染管线-学习资料汇总
  19. 分布式事务方案Seata
  20. 第二章 源力、质量、能量

热门文章

  1. 【A】超全!深度学习在计算机视觉领域的应用一览
  2. 手写数字识别 随机森林 代码
  3. 快速排序多种方法代码Python
  4. APP 控制 ROS 机器人 群组
  5. Android平台五大特色
  6. 中国象棋源码c语言,中国象棋C语言源代码.doc
  7. 论文中怎么引用yolo_论文中怎么加入脚注,并且对脚注的序号、位置、格式进行调整...
  8. 怎么把字符串变成数组_Java中字符串split() 的使用方法,没你想的那么简单
  9. 付款更方便了?腾讯接入!微信支持数字人民币支付
  10. 苹果正在研发iPhone检测抑郁症功能