关于uboot的简介——uboot的一些常识介绍

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、uboot的由来

1、uboot从哪里来的?

  • uboot是SourceForge上的开源项目。
  • uboot项目的作者:一个德国人最早发起的项目。
  • uboot就是由一个人发起,然后由整个网络上所有感兴趣的人共同维护发展而来的一个bootloader。

2、uboot的发展历程

  • 自己使用的小开源项目。
  • 被更多人认可使用。
  • 被SoC厂商默认支持。
  • uboot经过多年发展,已经成为事实上的业内bootloader标准。现在大部分的嵌入式设备都会默认使用uboot来做为bootloader。

3、uboot的版本号问题

  • 早期的uboot的版本号类似于uboot1.3.4,后来版本号变成类似于uboot-2010.06。
  • uboot的核心部分几乎没怎么变化,越新的版本支持的开发板越多而已,对于一个老版本的芯片来说,新旧版本的uboot并没有差异。

4、uboot的可移植性的理解

  • uboot就是universal bootloader(通用的启动代码),通用的意思就是在各种地方都可以用,所以说uboot具有可移植性。
  • uboot具有可移植性并不是说uboot在哪个开发板都可以随便用,而是说uboot具有在源代码级别的移植能力,可以针对多个开发板进行移植。

二、uboot的作用

1、计算机系统的主要部件

  • 典型的计算机系统有:PC机(台式机+笔记本)、嵌入式设备(手机、平板电脑、游戏机)、单片机(家用电器像电饭锅、空调);
  • 所有的计算机系统运行时需要的主要核心部件都是3个东西:CPU + 外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM)

2、PC机的启动过程

  • 典型的PC机的部署:BIOS程序部署在PC机主板上(随主板出厂时已经预制了),操作系统部署在硬盘上,内存在掉电时无作用,CPU在掉电时不工作。
  • 启动过程:PC上电后先执行BIOS程序(实际上PC的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了)。

3、典型嵌入式linux系统启动过程

  • 典型嵌入式系统的部署:uboot程序部署在Flash(能作为启动设备的Flash)上,OS部署在FLash(嵌入式系统中用Flash代替硬盘)上、内存在掉电时无作用,CPU在掉电时不工作。
  • 启动过程:嵌入式系统上电后先执行uboot、然后uboot负责初始化DDR,初始化Flash,然后将OS从Flash中读取到DDR中,然后启动OS(OS启动后uboot就无用了)

4、android系统启动过程

  • android系统的启动和linux系统(前面讲的典型的嵌入式系统启动)几乎一样,只是在内核启动后加载根文件系统后不同了
  • 可以认为启动分为2个阶段:第一个阶段是uboot到OS启动;第二个阶段是OS启动后到rootfs加载到命令行执行。
  • 现在我们主要研究第一个阶段,android的启动和linux的差别在第二阶段。

5、uboot的作用

  • uboot主要作用是用来启动操作系统内核。
  • uboot还要负责部署整个计算机系统。
  • uboot中还有操作Flash等板子上硬盘的驱动。
  • uboot还得提供一个命令行界面供人来操作。

三、uboot的特点

1、自身可开机直接启动

  • 一般的SoC都支持多种启动方式,譬如SD卡启动、NorFlash启动、NandFlash启动等。
  • uboot要能够开机启动,必须根据具体的SoC的启动设计来设计uboot。
  • uboot必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。
  • uboot中第一阶段的start.S文件中具体处理了这一块。

2、能够引导操作系统内核启动并给内核传参

  • uboot的终极目标就是启动内核。
  • linux内核在设计的时候,设计为可以被传参。我们可以在uboot中事先给linux内核准备一些启动参数,放在内存中特定位置然后传给内核,内核启动后会到这个特定位置去取这些参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。

3、能提供系统部署功能

  • uboot必须能够(被人借助而)完成整个系统(包括uboot、kernel、rootfs等的镜像)在Flash上的烧录下载工作。
  • 可以利用uboot中的fastboot功能将各种镜像烧录到iNand中,然后从iNand启动。

4、能进行soc级和板级硬件管理

  • 为了完成一些任务,uboot中必须初始化一部分硬件。比如uboot要实现刷机必须能驱动iNand,比如uboot要在刷机时LCD上显示进度条就必须能驱动LCD,比如uboot能够通过串口提供操作界面就必须驱动串口,比如uboot要实现网络功能就必须驱动网卡芯片。
  • SoC级就是SoC内部外设(比如串口),板级就是SoC外面开发板上面的硬件(比如网卡、iNand)。

5、uboot的生命周期

  • uboot的生命周期,指uboot什么时候开始运行,什么时候结束运行。
  • uboot本质上是一个裸机程序(不是操作系统),一旦uboot开始SoC就会单纯运行uboot,别的程序是不可能同时运行的,一旦uboot结束运行则无法再回到uboot。
  • uboot的入口是开机自动启动,uboot的唯一出口就是启动内核。
  • uboot还可以执行很多别的任务(譬如烧录系统),一般任务执行完后都可以回到uboot的命令行,但启动内核命令一旦执行就回不来了。

四、uboot与kernel的区别

1、uboot是一个裸机程序,内核也是一个裸机程序

  • uboot的本质是一个裸机程序,操作系统内核也是一个裸机程序。
  • 操作系统运行后,在软件上分为内核层和应用层,两层的权限不同。在内存访问和设备操作的管理上更加精细(内核可以随便访问各种硬件,而应用程序只能被限制地访问硬件和内存地址)。

2、均部署在SD卡中特定分区内

静止时,bootloader、kernel、rootfs等都以镜像的形式存储在启动介质中。X210中是iNand/SD卡。

不能将镜像放在SD卡的任意位置。我们需要对SD卡进行分区,然后将各镜像存放到对应分区中,这样在启动过程中就知道去哪里找uboot、kernel和rootfs了。另外uboot和kernel中的分区表必须一致,同时和SD卡的实际使用的分区要一致。

运行时,都是在DDR内存中运行的,与存储介质无关。

从静止态到运行态的过程,即启动过程。即一个从SD卡逐步搬移到DDR内存,并且运行启动代码进行相关的硬件初始化和软件架构的建立,最终达到运行时稳定状态的过程。

3、运行时都必须先加载到DDR中链接地址处

uboot在第一阶段进行重定位时,将第二阶段(整个uboot镜像)加载到DDR的0xc3e00000地址处,该地址即uboot的链接地址。

uboot启动内核时,将内核从SD卡读取放到DDR中(也是重定位的过程),必须放在内核的链接地址处,否则启动不起来(比如内核移植时,因为解压缩地址不是内核的链接地址,因此没有正确解压缩,内核运行不起来)。

4、内核启动需要启动参数

uboot是无条件启动的,而内核的启动需要uboot帮忙。比如uboot帮助内核实现重定位(从SD卡到DDR),给内核提供启动参数。

五、uboot的工作方式

1、从裸机程序镜像uboot.bin说起

  • uboot的本质就是一个裸机程序,和我们写的那些裸机程序xx.bin并没有本质区别。如果非说要有区别,那就是:我们写的大部分小于16KB,而uboot大于16KB(一般uboot在180k-400k之间)。
  • uboot本身是一个开源项目,由若干个.c文件和.h文件组成,配置编译之后会生成一个uboot.bin,这就是uboot这个裸机程序的镜像文件。然后这个镜像文件被合理地烧录到启动介质中,也就是说uboot在没有运行时表现为uboot.bin,一般躺在启动介质中。
  • uboot运行时会被加载到内存中,然后一条指令一条指令的拿给CPU去运行。

2、uboot的命令式shell界面

  • 普通的裸机程序运行起来就直接执行了,执行时效果和代码有关。
  • 有些程序需要和人进行交互,于是程序中就实现了一个shell(shell就是提供人机交互的一个界面),uboot就实现了一个shell。
  • shell不是操作系统,和操作系统一点关系都没有。linux中打开一个终端后就得到了一个shell,可以输入命令回车执行。uboot中的shell工作方式和linux中的终端shell非常像(其实几乎是一样的,只是命令集不一样。譬如linux中可以ls,uboot中ls就不识别)
  • uboot启动后大部分时间和工作都是在shell下完成的(譬如uboot部署系统要在shell下输命令、要设置环境变量也得在命令行下,要启动内核也要在命令行敲命令)
  • 命令就是uboot的shell中可以识别的各种命令。uboot中有几十个命令,其中有一些常用另一些不常用(我们还可以自己给uboot添加命令)。
  • uboot的环境变量和操作系统的环境变量工作原理和方式几乎完全相同。uboot在设计时借助了操作系统的设计理念(命令行工作方式借鉴了linux终端命令行,环境变量借鉴了操作系统的环境变量,uboot的驱动管理几乎完全照抄了linux的驱动框架)。
  • 环境变量可以被认为是系统的全局变量,环境变量名都是系统内置的(认识就认识,不认识就不认识,这部分是系统自带的默认的环境变量,譬如PATH;但是也有一部分环境变量是自己添加的,自己添加的系统就不认识但是我们自己认识)。系统或者我们自己的程序在运行时可以通过读取环境变量来指导程序的运行。这样设计的好处就是灵活,譬如我们要让一个程序更改运行方法,不用去重新修改程序代码再重新编译运行,而只要修改相应的环境变量就可以了。
  • 环境变量就是运行时的配置属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有目标

生活就是每一天都有一个目标,不管大或者小,只要很好的完成了,都会觉得很有成就感!转载于:https://www.cnblogs.com/jackychua/archive/2013/04/01/2994434.html

虚拟机上网以及互ping问题

以下内容源于网络资源的学习与整理,如有侵权请告知删除。 虚拟机设置静态IP和上网问题 (1)在“虚拟机——设置——网络适配器”中选择桥接模式; (2)在“编辑——虚拟网络编辑器”中,选择桥接到有…

php定时执行原理

即使关掉浏览器也能继续执行 ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行. set_time_limit(0); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去 转载于:htt…

php递归无限极分类

递归无限级分类有几种形式&#xff0c;我这里仅仅举例比較经常使用的三种&#xff1a; 第一种&#xff1a;返回有排序的数组&#xff1a; <?php$data array(1 > array(id > 1,pid > 0,user_name > one,),2 > array(id > 2,pid > 1,user_name > tw…

qt 飞扬青云_R语言学习——实例标识符

> patientID> age> diabetes> status> patientdata> #在上述创建的病例数据框中&#xff0c;病人编号(patientID)用于区分数据中的不同个体&#xff0c;在R中实例标识符(case identifier)可以通过数据框操作函数中的rowname选项指定&#xff0c;如下代码&…

Makefile中的赋值符号:=、:=、?=、+=

参考博客&#xff1a; Makefile赋值符号的使用——"" ":" "?" ""_秦伟H的博客-CSDN博客 1、“”&#xff0c;是最基本的赋值 make将整个Makefile展开后再决定变量的值&#xff0c;变量的值等于Makefile中最后给这个变量所指定的值&am…

fck java_FCkjava三种调用方法

测试FCK方法一:toolbarSet "Default" >默认内容测试方法二:FCKeditor oFCKeditor ;oFCKeditor new FCKeditor(request,"content") ;oFCKeditor.setBasePath( "/db/fckeditor/" ) ;oFCKeditor.setWidth("600");oFCKeditor.setHeig…

Spring 容器(Spring 的上下文)

为什么80%的码农都做不了架构师&#xff1f;>>> 最近在做项目时牵扯到有关父子上下文的概念。 何为父子上下文呢&#xff1f; 父上下文&#xff1a; 使用listener监听器来加载配置文件&#xff0c;如下&#xff1a; <listener> <listener-class>org.…

file_operations结构体

以下读书笔记内容摘自宋宝华《Linux设备驱动开发详解》一书。 file_operations结构体在字符设备驱动的地位 file_operations结构体的定义 此结构体定义在x210kernel/include/linux/fs.h文件中。 struct file_operations {struct module *owner;loff_t (*llseek) (struct file …

FlashCC学习札记

前段时间项目中有一个功能模块用到了FlashCC&#xff0c;将C的代码编译成swc文件&#xff0c;以便在Flash工程中使用。开发过程中遇到一些问题&#xff0c;现在记录下来&#xff0c;以便日后查阅。 一、开发环境搭建 说明:本文所使用的FlashCC版本为1.0.1&#xff0c; 操作系统…

Java制作报表系统流程_基于JAVA报表生成系统设计与实现.doc

基于JAVA报表生成系统设计与实现摘 要现在是信息社会&#xff0c;各种信息都需要处理并直观展现&#xff0c;如股票&#xff0c;物价等信息都需要通过数据报表来展现、分析&#xff0c;因此高质量报表软件系统具有重要的实际意义。本论文课题研究探索了报表系统的开发方法与技术…

”凉凉“ 的故事

某一天&#xff0c;我在给数据匹配编码的时候发现一个数据匹配不到编码&#xff0c;我怀疑是码表问题&#xff0c;终于发现一个非常奇妙的事情&#xff1a;两个一模一样的字符串竟然不相等&#xff1f;&#xff1f;&#xff1f; 屌爆了&#xff0c;我上下左右看遍了也没看出这2…

struct file 结构体

该结构体在x210kernel/include/linux/fs.h文件中定义。 struct file {/** fu_list becomes invalid after file_free is called and queued via* fu_rcuhead for RCU freeing*/union {struct list_head fu_list;struct rcu_head fu_rcuhead;} f_u;struct path f_path; #def…

左右替换循环

$i1; while($i<5){$i;if(($i%2)0){echo 文字在左&#xff0c;<img src"img/logo_sports.png"><br /><br />;}else{echo <img src"logo_sports.png">&#xff0c;文字在右<br /><br />;} } 转载于:https://www.cnbl…

面向对象理论概述

2019独角兽企业重金招聘Python工程师标准>>> 转载自&#xff1a;http://my.oschina.net/brucelee80/blog 面向对象与面向过程的区别 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就…

网络设备驱动介绍

以下内容源于朱有鹏《物联网大讲堂》课程的学习&#xff0c;如有侵权&#xff0c;请告知删除。 一、网络设备驱动概述 1、什么是网络设备 &#xff08;1&#xff09;网络设备&#xff1a;物理网卡在linux中形成的体系软件表现。 &#xff08;2&#xff09;物理网卡&#xff…

HTML之二:body标记的属性及属性值

HTML之二&#xff1a;body标记的属性及属性值在HTML之一中&#xff0c;介绍了必须要写入的结构、title用于显示标题栏的内容、网页的内容大部分在body中编辑&#xff0c;下面简单介绍body常用的属性以及属性值。<body background"图片位置" #设置背…

山东理工ACM【2561】九九乘法表

九九乘法表 Time Limit: 1000ms Memory limit: 65536K 有疑问&#xff1f;点这里^_^ 题目描述 九九乘法表是数学学习的基础&#xff0c;今天我们就来看看乘法表的相关问题。《九九乘法歌诀》&#xff0c;又常称为“小九九”,如下图所示。你的任务是写一个程序&#xff0c;对…

java ajax 定时刷新_用ajax技术实现无闪烁定时刷新页面

function makeRequest() {var guid rnd();//记住给个随机数&#xff0c;不然的话有缓存var url "example_b.aspx?id" guid;createXMLHttpRequest();xmlHttp.onreadystatechange handleRefresh;xmlHttp.open("GET", url, false);xmlHttp.send(null);}/…

platform驱动开发套路、DM9000的一些分析

1、 模块加载函数&#xff0c;是通过platform_driver_register()、platfprm_driver_unregister函数进行platform_driver的注册和注销&#xff1b; 原先注册和注销字符设备的工作&#xff0c;被移交给platform_driver的probe()成员函数和remove()成员函数中。 第一句是将硬件信…