uboot简介

2023-11-08

1、嵌入式Linux软件结构与分布
在一般情况下嵌入式Linux系统中的软件主要分为以下及部分:
(1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。
而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方式:USB、UART或以太网等等。而S3C24x0则很简单,只有Norboot和Nandboot。
(2)Linux kernel 和drivers。
(3)文件系统。
包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。
(4)应用程序。用户自定义的应用程序,存放于文件系统之中。
在Flash 存储器中,他们的 一般分布如下:
 
但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader参数区,等等。

2、在嵌入式Linux中为什么要有BootLoader
在linux内核的启动运行除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:
 1. CPU 寄存器的设置: R0=0;
R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach-types);
R2=内核启动参数在 RAM 中起始基地址;
 2. CPU 模式: 必须禁止中断(IRQs和FIQs);
CPU 必须 SVC 模式;
 3. Cache 和 MMU 的设置: MMU 必须关闭;
指令 Cache 可以打开也可以关闭;
数据 Cache 必须关闭;
 
 
但是在CPU刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可能处在Linux内核的启动环境中。为了初始化CPU及其他外设,使得Linux内核可以在系统主存中跑起来,并让系统符合Linux内核启动的必备条件,必须要有一个先于内核运行的程序,他就是所谓的引导加载程序(Boot Loader)。
而Boot Loader并不是Linux才需要,是几乎所有的运行操作系统的设备都具备的。我们的PC的BOIS就是Boot Loader的一部分(只是前期引导,后面一般还有外存中的各种Boot Loader),对于Linux PC来说,Boot Loader = BIOS + GRUB/LILO。

3、Boot Loader的功能和选择
    通过上面的讲述,我们可以知道:Boot Loader是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境,最后从别处(Flash、以太网、UART)载入内核映像并跳到入口地址。
由于BootLoader直接操作硬件,所以她严重依赖于硬件,而且依据所引导的操作系统的不同,也有不同的选择对于嵌入式世界中更是如此。就S3C24x0而言,如果是引导Linux,一般选用韩国的mizi公司设计的vivi或者DENX软件工程中心的U-boot,如果是引导Win CE,就选用Eboot。如果是开发StrongARM 构架下的LART,就可选用由Jan-Derk Bakker 和 Erik Mouw发布的Blob(Boot Loader Object)。如果是要引导eCos系统,就可以选用同是Redhat公司开发的Redboot。
     所以在嵌入式世界中建立一个通用的 BootLoader 几乎是不可能的,而有可能的是让一个 Boot Loader代码支持多种不同的构架和操作系统,并让她方便移植。U-boot就是支持多平台多操作系统的一个杰出代表。这也是为什么我喜欢用U-boot的原因,因为如果在开发S3C2440时熟悉了U-boot,再转到别的平台的时候就可以很快地完成这个平台下的U-boot移植,而且U-boot的代码结构越来越合理,对于新功能的添加也十分容易。
     值得一提的是国内的一个开源项目maxwit中的g-bios也是一个不错的开源BootLoader,同样支持多平台。


、U-boot的起源

U-Boot是Das U-Boot的简称,其含义是Universal Boot Loader,是遵循GPL条款的开放源码项目。一开始德国DENX软件工程中心的Wolfgang Denk基于8xxROM和FADSROM的源码创建了PPCBoot工程项目,此后不断添加处理器的支持。后来,Sysgo Gmbh把PPCBoot移植到ARM平台上,创建了ARMBoot工程项目。然后以PPCBoot工程和ARMBoot工程为基础,创建了U-Boot工程,2002年12月17日第一个版本U-Boot-0.2.0发布,同时PPCBoot和ARMboot停止维护。而今,U-Boot作为一个主流、通用的Bootloader,成功地被移植到包括主流的PowerPC、ARM、X86 、MIPS、NIOS、XScale等体系结构的上百种开发板,成为功能最多、灵活性最强,并且开发最积极的开源BootLoader。目前。U-Boot仍然由DENX的Wolfgang Denk维护。


、U-boot的开发情况和资源

一开始U-boot的版本号是由X.Y.Z来表示的,从0.2.0一直到1.3.4,之后便开始使用年份加月份的表示方法,2008.11到现在的2010.3平均每3个多月出一个新版本,每次代码的结构和定义都会有一些修正和改进。我从1.2.0开始移植U-boot到S3C24x0,到现在的2010.03,发现U-boot的代码越来越规整,功能越来越强,但是移植的难度反而越来越小,需要修改的地方越来越少。

而对于U-boot,不仅仅有主线版本,在U-bootGit代码仓库中还有各个CPU构架的分支版本,这些分支会在一定的时候将修改汇入主线。值得注意的是U-boot-V2,这是下一代的U-boot,代码的构架比较新,现在正处在开发的阶段,但针对S3C2440的支持似乎可以了,还没有时间尝试。

下面总结一下关于U-boot源代码的网络资源:

官方链接

德国DENX软件工程中心主页

http://www.denx.de/

 U-boot官方主页(注意其中的邮件列表链接)

http://www.denx.de/wiki/U-Boot/WebHome

 U-boot官方源码FTP下载

ftp://ftp.denx.de/pub/u-boot/

 U-boot官方Git代码仓库

http://git.denx.de/?p=u-boot.git

 针对S3C2440的修改

Openmoko手机的U-boot源码Git

http://git.openmoko.org/?p=u-boot.git;a=shortlog;h=refs/heads/stable

buserrorU-boot源码Git(针对mini2440

http://repo.or.cz/w/u-boot-openmoko/mini2440.git

我的U-boot源码Git(针对mini2440

http://github.com/tekkamanninja


http://blog.csdn.net/zhangwenjianqin/article/details/7695617


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

uboot简介 的相关文章

  • C++ 调用Qml方法

    前言 在Qml和QWidget混合开发中 少不了C 与qml的互相调用 之前总结了一下在qml中调用c 的方法 那反过来如何在业务逻辑中直接修改qml呢 qml调用c 总结 QML和QWidget混合开发 初探 添Qml调用C 方法之自定义

随机推荐

  • IMX6学习记录(9)-实现网络连接,rz/sz文件传输

    上面是我的微信和QQ群 欢迎新朋友的加入 现在我已经自己编译过uboot kernel和rootfs了 遇到一个比较麻烦的事情 拷贝文件需要插拔SD卡 考虑的之后开发的便捷性 准备实现rz sz方式的数据传输 1 修改内核配置 把设备树和默
  • 错误处理--CUDA error: device-side assert triggered(很有效)

    embeding中词的总数设小了 在函数 nn Embedding vocab size embedding dimension 中 参数vocab size 为你字典的总词数 如果在训练中有编号 gt len 字典 的数字出现 就会报这个
  • 服务器怎么打开万向系统,全程监控系统解决方案-20210731072231.doc-原创力文档

    全程监控系统解决方案 全程监控系统解决方案 全程监控系统解决方案 呼集老高速公路 全程监控系统解决方案 二零一零年一月 目录一 需求剖析 错误 不决义书签 二 系统设计方案 错误 不决义书签 系统规划 错误 不决义书签 全程无盲点监控和视频
  • Jira插件安装

    一 Jira插件列表 可以将下面免费插件直接下载 然后登陆jira 在 插件管理 gt 上传插件 将下载后的免费插件直接进行上传安装即可 序号 插件名称 功能概要 供应商 资源 100用户报价 1 GreenHopper 敏捷项目管理 At
  • elasticsearch集群正确关闭、重启方式

    问题原因 在elasticsearch集群中 当集群发现某个节点关闭时 将延迟一分钟后 默认 再开始将该节点上的分片复制到集群中的其他节点 这可能涉及很多I O 由于该节点不久将要重新启动 因此该I O是不必要的 您可以通过在关闭节点之前禁
  • 【博客705】chatgpt:编写日志rotate框架

    chatgpt 编写日志rotate框架 场景 我们的网关服务等为了持久化日志以供排查问题 往往将日志输出到文件 此时如果文件太大 可能导致磁盘被写满 此时就需要对日志文件进行rotate 以保存最新的日志 实现 package main
  • Pytorch中计算自己模型的FLOPs

    转自 Pytorch中计算自己模型的FLOPs thop profile 方法 yolov5s 网络模型参数量 计算量统计 墨理学AI CSDN博客 Pytorch 用thop计算pytorch模型的FLOPs 简书 安装thop pip
  • gcc/gdb/gprof/gcov/valgrind使用

    gcc gdb gprof gcov valgrind使用 ning 发表于 2012年10月05日 23 44 Hits 796 Tag all Table of Contents gcc编译带符号 gdb 启动参数 gdb 查看结构体
  • Blender基础:几何节点修改器

    1 几何节点修改器 几何节点修改器Geometry Node Editor 本质上一种自定义修改器 2 节点的添加 添加节点 节点Node 代表一个函数 功能 演示 添加一个节点 几何数据 变换 连接端口 修改节点的参数 几何节点修改器 是
  • ssh端口转发禁用

    配置1 vi etc ssh sshd config 修改内容 AllowTcpForwarding yes GatewayPorts yes 生效 etc rc d init d sshd restart 配置2 vi etc sysct
  • react中使用useMemo和useCallback

    之前学到的memo是用来优化函数组件的重渲染问题 当传入的属性值都没变化时就不会触发组件的重渲染 否则组件就会重渲染 和类组件中的PureComponent组件是类似 useMemo功能是判断组件中的函数逻辑是否重新执行 用来优化性能 im
  • LUA中的and与or

    逻辑运算符认为false和nil是假 false 其他为真 0也是true and的优先级比or高 其它语言中的and表示两者都为真的时候 才返回为真 而只要有一个假 都返回假 lua虽不仅返回假的语义 还返回导致假的值 也就是说 a an
  • webbench 压力测试软件

    1 安装 wget http home tiscali cz cz210552 distfiles webbench 1 5 tar gz tar xzvf webbench 1 5 tar gz cd webbench 1 5 make
  • Ubuntu Linux输入法fcitx方块乱码解决设置

    Ubuntu Linux 10 04自带的输入法不是很好用 linux下的输入法和windows下的比起来还是有很大差距的 相对来说比较好的输入法我看还是fcitx还不 错 不过在Ubuntu下通过 sudo apt get install
  • java 接口返回json数据封装

    前言 首先 采用的是springboot 在controller中使用了 RestController或者 ResponseBody注解 返回的数据本身就是json格式 但是这样的json串在前后端分离使用中并不满足实际的效果 因此需要进行
  • 18. Python中的模块与包

    Hi 大家好 我是茶桁 这一段Python之旅怎么样 还算顺利吧 之前我们都学习了些什么 有基本常识 流程 函数 不同类型的数据以及一些模块对吧 并且还做了一些练习来巩固所学过的内容 那么今天 我们接着来学习模块 不过今天要学的模块和以往不
  • IPP图像处理常用函数说明

    IPP图像处理常用函数 专栏目录 说明 一 阈值处理 1 函数原型 2 计算公式 3 Threshold Val函数 1 函数原型 2 说明 4 相关参数含义 1 源图像指针和步长 2 roiSize 3 ippCmpOp 5 官网开发手册
  • mysql日期和字符串相互转化

    一 日期转字符串 1 函数 date format date format 2 例 select date format now Y m d H i S 结果 2017 10 29 14 02 54 select date format n
  • C++成员函数指针的定义与使用

    成员函数指针是相对于对象来说的 在说成员函数指针之前 先要明白普通函数指针的定义与使用 用vs先建立一个项目 名称随意 然后在源文件中声明并且定义一个函数 代码如下 include pch h include
  • uboot简介

    1 嵌入式Linux软件结构与分布 在一般情况下嵌入式Linux系统中的软件主要分为以下及部分 1 引导加载程序 其中包括内部ROM中的固化启动代码和Boot Loader两部分 而这个内部固化ROM是厂家在芯片生产时候固化的 作用基本上是