BootLoader简介——linux内核的引导

2023-11-01

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BootLoader简介——linux内核的引导 的相关文章

随机推荐

  • 【无人自主系统】自主系统自主性(持续更新内容中)

    事实上 过去当我们考虑地面 空中 水下无人设备的时候 我们考虑的是一个个子系统的自动化 传统意义上 自动化的定义是 系统或者设备在没有或者很少人工的参与下 完成特定操作 达成预期目的 广义的自动化涵盖执行逻辑操作的软件及其他应用过程 这也是
  • 不需要PS也能生成淘宝我的订单页面截图

    不知道大家有没有遇到这样的情况 在发微博 发朋友圈或者写博客的时候 想要分享购物心得 但却苦恼于找不到虚拟淘宝订单截图 别担心 今天我就来教大家一个轻松又快捷的方法 使用淘宝订单生成器 无需PS 虚拟淘宝订单在线生成工具 https tao
  • C语言循环结构

    目录 循环结构 while循环 基本while循环 do while循环 for循环 跳转语句 break continue goto 单纯的循环的常规操作 循环嵌套 循环嵌套的问题 作业 经典问题 百鸡百钱 经典问题 斐波拉契数列 循环结
  • 数据结构之顺序表(创建、使用、销毁)

    顺序表是在计算机内存中采用顺序存储的方式存储的线性表 是指用一组地址连续的存储单元依次存储数据元素的线性结构 顺序表的物理结构和逻辑结构都是连续的 顺序表的增删操作麻烦 需要移动的元素可能很多 修改和查找操作方便 通过下标访问 访问速度快
  • elementUI 表格组件设置高度之后去除滚动条

  • 用C++实现十大经典排序算法

    作者 billy 版权声明 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 简介 排序算法可以分为内部排序和外部排序 内部排序是数据记录在内存中进行排序 而外部排序是因排序的数据很大 一次不能容纳全部的排序记录 在排序过
  • 使用单进程,单线程,非堵塞---完成多任务!

    使用单进程 单线程 非堵塞 完成多任务 代码如下 import socket import time tcp server socket socket socket AF INET socket SOCK STREAM tcp server
  • [编程题]查找兄弟单词

    Talk is cheap show me the code 一 问题描述 实现一个可存储若干个单词的字典 用户可以 在字典中加入单词 查找指定单词在字典中的兄弟单词个数 查找指定单词的指定序号的兄弟单词 指定序号指字典中兄弟单词按字典顺序
  • java反编译jar包

    java反编译jar包 在日常开发中 由于之前的系统中UDF函数源码并没有接手 要想把现有UDF函数一直到其他平台上使用 因此需要对现有jar包进行反编译 并在其他平台上调试使用 反编译方式分两种 GUI工具 JD GUI idea插件 j
  • 清华工科博士答辩PPT(转载)

    答辩前吸一下欧气 转自B站视频 参考链接 大佬
  • html javascript 设置cookie永不过期

    function cookieToJson str let cookieArr str split let obj cookieArr forEach i gt let arr i split obj arr 0 arr 1 return
  • Mybatis动态sql条件查询、判断空值和空字符串

    转自 Mybatis动态sql条件查询 判断空值和空字符串 下文笔者讲述mybatis动态sql条件查询的使用简介说明 如下所示 例 Select
  • 极氪汽车的云资源治理细探

    前言 2021 年 极氪 001 迅速崭露头角 仅用 110 天便创下了首款车型交付量 最快破万 的纪录 2022 年 11 月 极氪 009 在短短 76 天内便率先完成了首批交付 刷新了中国豪华纯电品牌交付速度的纪录 2023 年 6
  • SpringMvc 实现上传zip文件解压

    去掉了一些敏感数据 仅供参考 import java io File import java io FileInputStream import java io IOException import java io InputStream
  • 多益前端笔试题

    1 svg画四边形 四个点的坐标分别是 220 100 300 210 170 250 123 234
  • 《Linux运维实战:Centos7.6一键离线部署mysql8.0.24》

    系列文章目录 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 例如 第一章 Python 机器学习入门之pandas的使用 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一
  • c++开篇——自引用指针this

    c 中 有一个特别的指针this 也叫自引用指针 这个指针的巧妙之处在于它永远指向的是当前对象 由此便可以访问当前对象的所有成员 这样一来许多问题就得到了巧妙的解决 注意 this 是一个指针 要用 gt 来访问成员变量或成员函数 当调用到
  • Java实现多线程有几种方式(满分回答)

    目录 JDK8 创建的线程的两种方式 orcle文档解释 方式一 继承Thread类 方式二 实现Runnable接口 同时用两种的情况 其他间接创建方式 Callable接口 线程池 JDK8 创建的线程的两种方式 orcle文档解释 o
  • allegro界面简单介绍一

    1 view界面 2 Visibility Views 显示图层选择 Planes 平面层 Plan 规划布线 Etch 铜皮 走线 Via 过孔 Pin 焊盘pin脚 Drc 错误标记 All 全部显示 3 如何打开层设置 4 设置不同的
  • BootLoader简介——linux内核的引导

    1 BootLoader 在CPU上电启动时 一般连内存控制器都没有初始化过 根本无法在主存中运行程序 更不可能处在Linux内核启动环境中 为了初始化CPU及其他外设 使得Linux内核可以在系统主存中运行 并让系统符合Lintix内核启