嵌入式系统UBOOT
一个完整的嵌入式linux系统包含4部分内容:Bootloader、Parameters、Kernel、Root File System。3、4、5、6部分详细介绍了这4部分的内容,这是Linux底层软件开发人员应该掌握的。通过学习这些章节,您可以详细了解到如何在一个裸板上裁减、移植Linux,如何构造自己的根文件系统,如何编写适合客户需求的驱动程序——驱动程序这章将结合几个经典的驱动程序进行讲解。您还可以了解到在用在nand flash上的非常流行的yaffs文件系统是如何工作的,本书将结合yaffs代码详细介绍yaffs文件系统。
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
嵌入式系统UBOOT的更多相关文章
- 嵌入式系统烧写uboot/bootloader/kernel的一般方法
嵌入式系统烧写uboot/bootloader/kernel的一般方法 本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误, ...
- 热烈庆祝华清远见2014嵌入式系统(Linux&Android)开发就业培训课程全面升级
近日,华清远见公开宣布:2014嵌入式系统 (Linux&Android)开发就业培训课程再次升级!据悉,华清远见如今已经持续10年,一直保持课程每年2次的更新的频率.华清远见的每 次课程更新 ...
- 嵌入式系统 Boot Loader 技术内幕
转载:http://www.ibm.com/developerworks/cn/linux/l-btloader/index.html 1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统 ...
- 利用qemu模拟嵌入式系统制作全过程
http://www.tinylab.org/using-qemu-simulation-inserts-the-type-system-to-produce-the-whole-process/ 利 ...
- 嵌入式系统基础知识(一): 系统结构和嵌入式Linux
目录 一. 嵌入式体系结构 二. 开发过程中的分工 三. 嵌入式软件体系结构 四. 嵌入式Linux 一. 嵌入式体系结构 <嵌入式系统设计师教程>这本书的前三章脉络很清晰, 按照嵌入式系 ...
- 【转】嵌入式系统 Boot Loader 技术内幕,带你完全了解Boot Loader
在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware)中的 boo ...
- 嵌入式之UBOOT
嵌入式Linux系统的结构分为四个区,如图所示: 1.Bootloader区存放的是Bootloader,Coidre972开发板上使用的uboot,它负责嵌入式系统最初的硬件初始化.驱动和内核加载. ...
- 嵌入式系统 Boot Loader 技术内幕【转】
本文转载自:https://www.ibm.com/developerworks/cn/linux/l-btloader/ 本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Lo ...
- 【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级
SWUpdate: 嵌入式系统的软件升级 概述 本项目被认为有助于从存储媒体或网络更新嵌入式系统.但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWU ...
随机推荐
- 使用寄存器点亮LED——前言基础知识
在点亮LED之前,我们需要具备一些基础知识: GPIO—general purpose intput output 是通用输入输出端口的简称,简单来说就是软件可控制的引脚,STM32芯片的GPIO引脚 ...
- JavaScript高级 面向对象(7)--深拷贝与浅拷贝
说明(2017.3.31): 1. 画图: var car = {name:"法拉利"}; var p = {name: "张三", age: "19 ...
- 基于CSS3和jQuery实现的3D相册
天我们再来看一款HTML5 3D相册浏览应用,图片可以手动播放,也可以自动播放,效果非常震撼,赶紧把这款HTML5 3D相册分享给你的朋友吧. 在线预览 源码下载 实现的代码: <div c ...
- python基础系列教程——Python库的安装与卸载
python基础系列教程——Python库的安装与卸载 2.1 Python库的安装 window下python2.python3安装包的方法 2.1.1在线安装 安装好python.设置好环境变量后 ...
- ospf动态路由配置(单区域)
命令: Router(config-router)#network 目标网络号 反子网掩码 area 区域号 示例: Router(config-router)#network 10.2.2.0 0. ...
- PHP 之前后端交互
今天想实现一个很简单的功能,前端上面一个按键去控制 板子里面的一个LED灯,就这么一个简单的问题,困扰了一天. 以前搞底层的时候,没有服务端和客户端的深刻概念,网页不同,分在客户端运行的 html 代 ...
- LUA中获得服务器IP
local t = {} -- 引入相关包local socket = require("socket") function t.main() local a,b=pcall(t. ...
- CentOS-6.4-minimal版中安装MongoDB-x86_64-3.0.2
完整版见https://jadyer.github.io/2015/06/03/centos-install-mongodb/ /** * CentOS-6.4-minimal版中安装MongoDB- ...
- mongodb查询之从多种分类中获取各分类最新一条记录
mongodb查询之从多种分类中获取各分类最新一条记录 2017年04月06日 13:02:47 monkey_four 阅读数:6707更多 个人分类: MongoDBJavaScript 文章 ...
- 从jQuery谈库与框架的设计之优劣
jQuery是业内知名的javascript框架,它的实现和设计可以说代表了javascript界最高的水平,本文试从四个方面来以jQuery为例总结库与框架设计的原则和优劣判断. 解决问题 首先请看 ...