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

  • 相关阅读:
    Xargs
    录制终端会话-script--查找find
    命令之乐-cat
    Linux_shell编程--比较与测试
    线程进程
    计算机网络基础
    python基础-列表相关
    初学Python
    numpy 基本的数组统计方法
    python 操作mysql 入门
  • 原文地址:https://www.cnblogs.com/debruyne/p/9150983.html
Copyright © 2011-2022 走看看