zoukankan      html  css  js  c++  java
  • BIOS、BootLoader、uboot对比

    BIOS

    BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

    BootLoader

    BootLoader是一段小程序,可以把它想象成PC机linux上的GRUB/LILO引导程序,只不过在嵌入式linux中,没有BIOS,而是直接从flash中运行,来装载内核。它可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。

    一个嵌入式系统从软件角度来看分为三个层次:
    1. 引导加载程序
    包括固化在固化中的boot程序(可选),和BootLoader两大部分
    2. linux内核
    特定于嵌入式平台的定制内核
    3. 文件系统
    包括了系统命令和应用程序
    --------------------------------------------------------------------------------
     BootLoader --> Boot Parameters --> Kernel --> Root Filesystem 
    --------------------------------------------------------------------------------


    为什么需要进行bootloader移植?
    答:

    1. 因为每种不同的CPU体系结构都有不同的BootLoader
    2. BootLoader依赖于具体的嵌入式板级设备的配置
    --------------------------------------------------------------------------------
    BootLoader启动过程可分为单阶段和多阶段(stage1、stage2),其中stage1完成初始化硬件,如CPU寄存器、内存控制器,为stage2准备内存空间。一般stage1是可以直接在nor flash中运行的,并将stage2复制到内存RAM中,设置堆栈,然后跳转到stage2(从这也可以看出stage2是在RAM中运行的,与stage1不同)。

    BootLoader的stage1通常包括以下步骤:
    1. 硬件设备初始化,如CPU寄存器、内存控制器
    2. 为加载BootLoader的stage2准备RAM空间
    3. 拷贝BootLoader的stage2到RAM空间中
    4. 设置好堆栈 ,为什么?为了跳转到stage2的入口,因为stage2大多数是用C语言写的
    5. 跳转到stage2的C入口点

    BootLoader的stage2通常包括以下步骤:
    1. 初始化本阶段要使用到的硬件设备,各种设备,如网卡
    2. 将内核映像和根文件系统映像从flash上读到RAM中去
    3. 调用内核
    --------------------------------------------------------------------------------

    uboot  

    Uboot用于多种嵌入式CPU的BootLoader程序
    支持多种嵌入式操作系统的引导
    UBOOT目录结构
    1. Borad             与开发板有关的文件。第一个开发板都以一个子目录出现在当前目录中
    2. Common       实现Uboot支持的命令
    3. Cpu          与特定CPU架构相关的代码,支持的CPU对应一个子目录(注意CPU与开发板的区别)
    3. Disk            对磁盘的支持
    4. Doc            文档目录
    5. Drivers     Uboot支持的设备驱动程序,如各种网卡、串口、USB、支持CFI的Flash
    6. Fs            文件系统的支持
    7.Iclude        Uboot使用的头文件。该目录下configs目录有与开发板相关的配置头文件,该目录下的asm目录有与CPU体系结构相关的头文件
    8.Net            与网络协议相关的代码,各路协议的实现
    9.Tools            生成Uboot的工具,如mkimage,crc等等

    Uboot编译分为两步
    1. 执行每种board相关的配置,如:make amdk_2420
    2. 编译生成uboot.bin文件 , 如:make CROSS_COMPILE=arm-linux-(指定正确路径)
    --------------------------------------------------------------------------------

    UBOOT基于单板机提供了丰富的命令集操作
    UBOOT命令
    printenv 查看环境变量(相当全局变量?)
    setenv 添加、修改、删除环境变量
    1. setenv name value
    set environment variable 'name' to 'value...'
    2. setenv name
    delete environment variable 'name'
    saveenv保存环境变量
    将当前定义的所有变量及其值存入flash中
    ---------------------------------------------------------------------
    ---------------------文件下载------------------------------------
    tftp通过网络下载文件,使用前,配置好网络

    配置网络:
    1. setenv ethaddr 12:34:56:78:8A:BC
    2. setenv ipaddr 192.168.1.1
    3. setenv serverip 192.168.1.254  (tftp服务器的地址)
    连接下载:tftp 32000000 uImage
    把server(IP=环境变量中设置的serverip)服务目录下的uImage通过tftp读入到0x32000000处

    md 显示内存区的内容
    md[.b,.w,.l]address    如:md.w 1000000

    mm[.b,.w,.l]address    如:mm.w 100000
    mm 修改内存,地址自动递增    提供了一种互动修改存储器内容的方法,如果没有输入任何值,按回车内容保持不变,输入空格然后按下回车,结束输入
    flinfo    查看Flash扇区信息
    --------------------------------------------------------------------------------
    protect Flash写保护  打开或关闭扇区写保护
    用法:
    protect off all        关闭所有扇区的写保护
    protect on all         打开所有扇区的写保护
    protect off start end     关闭从start到end扇区的写保护-----》protect off 0 1ffff(前一扇区减去1?)
    protect on start end     打开从start到end扇区的写保护
    --------------------------------------------------------------------------------

    erase 擦除flash扇区
    用法: erase start end    如: erase 30000 1efff
    在使用cp命令向Nor型Flash写入数据之前必须先使用erase命令擦除flash

    cp 数据拷贝
    cp [.b,.w,.l]saddress daddress len
    cp提供了一种内存与内存,内存与Flash之间数据拷贝的方法
    如:cp.b 31000000 50000 d0000 即是将内存地址0x31000000处的数据(长度为0xd0000)拷贝到地址0x50000处(Flash中)
    --------------------------------------------------------------------------------
    执行程序
    go 执行内存中的二进制代码,一个简单的跳转到指定地址
    go addr[arg...]
    start application at address 'addr',
    passing 'arg' as arguments

    bootm 执行内存中的二进制代码
    bootm [addr[arg...]]       要求二进制代码有固定格式的文件头
    boot application image stored in memory passing arguments 'arg...';
    when booting a Linux kernel,'arg' can be the address of an initrd image
    bdinfo    显示开发板信息  (可用于启动linux内核)
    bdinfo命令将在终端显示诸如内存地址和大小、时钟频率、MAC地址等信息
    这些信息在传递给LIUNX内核一些参数时可能会用到

    设置自动启动
    setenv bootcmd tftp 31000000 uImage ;bootm 31000000
    saveenv

  • 相关阅读:
    进度条
    html5 表单新增事件
    html5 表单的新增type属性
    html5 表单的新增元素
    html5 语义化标签
    jq 手风琴案例
    codeforces 702D D. Road to Post Office(数学)
    codeforces 702C C. Cellular Network(水题)
    codeforces 702B B. Powers of Two(水题)
    codeforces 702A A. Maximum Increase(水题)
  • 原文地址:https://www.cnblogs.com/try-again/p/9179067.html
Copyright © 2011-2022 走看看