BIOS

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

BIOS,Basic Input Output System 基本输入输出系统,意思是主板级别的一个小系统。负责系统(主要是主板)的硬件初始化,例如CPU,内存,硬盘,键盘,显示卡,网卡等等硬件的初始化。初始化是BIOS的主要工作。传统的个人电脑上面BIOS会有一个int19 软件中断功能,在初始化完成后,BIOS会进入int19中断,寻找启动介质,如软盘,光盘,硬盘,flash或者网络等等,读取第一个扇区的内容到内存的0000:7C00处,跳入这个地址执行。这里int19就是一个bootloader,启动引导器。所以BIOS具有Boot Loader的功能。当然,目前的BIOS功能已经被扩充了很多,例如电源管理方面的ACPI接口,USB驱动,PXE网络引导功能,硬盘加密,TPM接口,BIOS配置界面,BIOS自动恢复等等。

BootLoader

BootLoader操作系统内核运行之前运行的一段小程序,可以把它想象成PC机linux上的GRUB/LILO引导程序,只不过在嵌入式linux中,没有BIOS,而是直接从flash中运行,来装载内核。

它可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。`

每种不同的 CPU 体系结构都有不同的 Boot Loader。有些 Boot Loader 也支持多种体系结构的 CPU,比如 U-Boot 就同时支持 ARM 体系结构和MIPS。除了依赖于 CPU 的体系结构外,Boot Loader 实际上也依赖于具体的嵌入式板级设备的配置。

从固态存储设备上启动的 Boot Loader 大多都是 2 阶段的启动过程,也即启动过程可以分为 stage 1 (汇编部分)和 stage 2 (C语言部分)两部分。

第一阶段:A,基本的硬件初始化(屏蔽依赖于CPU体系架构的所有中断,关闭CACHE);B,为第二阶段准备RAM;C,复制第二阶段的CODE到RAM;D,设置堆栈;E,跳转到第二阶段的C入口点

第二阶段:A,初始化本阶段的硬件设备;B,建立内存映射;C,将内核映像和根文件系统映像从FLASH读到RAM中;(这一步我觉得有些奇怪,内核映像和根文件系统映像读到内存里会很占用内存呀?不过放到内存里速度变快)D,设置内核启动参数;E,调用内核。

<这里用的RAM也就相当于内存条,操作系统中的某些引导要加载到RAM里面>

  • CODE:代码区,指程序中代码即函数体的大小,注意程序中未使用的函数也会算在CODE中,也即会占用FLASH空间,因此不用的函数最好删除掉,以免占用过多FLASH空间;
  • RO-DATA:RO就是只读的意思,程序中只读的变量(也就是带Const的)和已初始化的字符串等;
  • RW-DATA:特指已初始化的可读可写全局/静态变量;
  • ZI-DATA:未初始化的可读可写全局/静态变量,注意初始化为0也算做未初始化,用到的堆空间和栈空间也会被算入这里面,只有上电了才有;

注意点1:

操作系统(内核+文件系统)也好,应用程序也罢,通通都存放在外存储中。CPU刚上电时,内存空空如也,什么都没有。
要通过引导过程,将操作系统加载到内存中,并且建立相应的数据结构(如进程控制块、文件控制块等)。
要始终记得:

操作系统既包括内核,也包括文件系统

疑问1:将内核映像和根文件系统映像从FLASH读到RAM中,这里的映像是什么东西?他要在RAM上使用大小会不会很大?

Linux内核在PC上以文件的形式存在(保存成磁盘文件形式),就是所谓的“映像文件”。Linux内核映像文件最终是要烧录到目标板的flash中。内核映像大小约2M,所以内核映像不会很大。

Linux 内核映像文件有两种:一种是非压缩版本,叫Image;另一种是它的压缩版本,叫zImage。zImage是Image经过压缩形成的,所以它的大小比Image小。为了能使用zImage这个压缩版本,必须在它的开头加上解压缩的代码,将zImage 解压缩之后才能执行,因此它的执行速度比Image要慢。但考虑到嵌入式系统的存储空容量一般都比较小,内核要常驻内存,采用zImage可以占用较少的存储空间,因此牺牲一点性能上的代价也是值得的,所以一般嵌入式系统均采用压缩的内核映像文件,即zImage。

根文件系统当中至少包括了一些基本目录,如/etc, /lib,/bin ...一些程序跑起来需要的库,模块驱动,配置文件等等,大小不太固定可能会超过100M。

但是还有一个这个,一般4412开发板上来刷机最开始就是最小根文件系统,最小根文件系统他只包括了启动所需要的最基本的文件,例如/etc/init.d/rcS, /bin/busybox, /lib/libc.so ...等等,它的大小实际上也只要几M。如果仅仅是完成最基本的启动,那么这个文件系统已经足够了。所以他也不会很大。

uboot

uboot(universal bootloader)是一种可以用于多种嵌入式CPU的BootLoader程序,换言之,uboot是bootloader的一个子集。

uboot 属于bootloader的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核所以,由上面描述的,就知道,UBOOT需要具有读写flash的能力。

uboot是怎样引导启动内核的?

uboot刚开始被放到flash中,板子上电后,会自动把其中的一部分代码拷到内存中执行,这部分代码负责把剩余的uboot代码拷到内存中,然后uboot代码再把kernel部分代码也拷到内存中,并且启动,内核启动后,挂着根文件系统,执行应用程序。

uboot启动的大过程是怎么样的?

uboot启动主要分为两个阶段,主要在start.s文件中,第一阶段主要做的是硬件的初始化,包括,设置处理器模式为SVC模式,关闭看门狗,屏蔽中断,初始化sdram,设置栈,设置时钟,从flash拷贝代码到内存,清除bss段等,bss段是用来存储静态变量,全局变量的,然后程序跳转到start_arm_boot函数,宣告第一阶段的结束。

第二阶段比较复杂,做的工作主要是1.从flash中读出内核。2.启动内核。start_arm_boot的主要流程为,设置机器id,初始化flash,然后进入main_loop,等待uboot命令,uboot要启动内核,主要经过两个函数,第一个是s=getenv("bootcmd"),第二个是run_command(s...),所以要启动内核,需要根据bootcmd环境变量的内容启动,bootcmd环境变量一般指示了从某个flash地址读取内核到启动的内存地址,然后启动,bootm。

uboot启动的内核为uImage,这种格式的内核是由两部分组成:真正的内核和内核头部组成,头部中包括内核中的一些信息,比如内核的加载地址,入口地址。

uboot在接受到启动命令后,要做的主要是,1,读取内核头部,2,移动内核到合适的加载地址,3,启动内核,执行do_bootm_linux

do_bootm_linux主要做的为,1,设置启动参数,在特定的地址,保存启动参数,函数分别为setup_start_tag,setup_memory_tag,setup_commandline_tag,setup_end_tag,根据名字我们就知道具体的段内存储的信息,memory中为板子的内存大小信息,commandline为命令行信息,

2,跳到入口地址,启动内核

启动的函数为the_kernel(0,bd->bi_arch_number,bd->bi_boot_param)

bd->bi_arch_number为板子的机器码,bd->bi_boot_param为启动参数的地址

总结:uboot到底是干嘛的,对应下面uboot必须要解决哪些问题!

1)uboot主要作用是用来启动操作系统内核。体现在uboot最后一句代码就是启动内核。

2)uboot还要负责部署整个计算机系统。体现在uboot最后的传参。

3)uboot中还有操作Flash等板子上硬件的驱动。例如串口要打印,ping网络成功,擦除、烧写flash是否成功等。

4)uboot还得提供一个命令行界面供人来操作。很简单,至少你能看到。

计算机系统的组成部件非常多,不同的计算机系统组成部件也不同。但是所有的计算机系统运行时需要的主要核心部件都是3个东西:CPU + 外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM)。而一般的PC机启动过程为:PC上电后先执行BIOS程序(实际上PC的BIOS就是NorFlash),BIOS程序负责初始化DDR内存,负责初始化硬盘,然后从硬盘上将OS镜像读取到DDR中,然后跳转到DDR中去执行OS直到启动(OS启动后BIOS就无用了)。

嵌入式系统和PC机的启动过程几乎没有两样,只是BIOS成了uboot,硬盘成了Flash。

3 uboot必须解决哪些问题?

3.1自身可开机直接启动

1)一般的SoC都支持多种启动方式,譬如SD卡启动、NorFlash启动、NandFlash启动等•••••uboot要能够开机启动,必须根据具体的SoC的启动设计来设计uboot

2)uboot必须进行和硬件相对应的代码级别的更改和移植,才能够保证可以从相应的启动介质启动。uboot中第一阶段的start.S文件中具体处理了这一块。

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

1)uboot的终极目标就是启动内核。

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

3.3能提供系统部署功能

1)uboot必须能够被人借助而完成整个系统(包括uboot、kernel、rootfs等的镜像)在Flash上的烧录下载工作。

2)裸机教程中刷机(ARM裸机第三部分)就是利用uboot中的fastboot功能将各种镜像烧录到iNand中,然后从iNand启动。

3.4 能进行soc级和板级硬件管理

1)uboot中实现了一部分硬件的控制能力(uboot中初始化了一部分硬件),因为uboot为了完成一些任务必须让这些硬件工作。譬如uboot要实现刷机必须能驱动iNand,譬如uboot要在刷机时LCD上显示进度条就必须能驱动LCD,譬如uboot能够通过串口提供操作界面就必须驱动串口。譬如uboot要实现网络功能就必须驱动网卡芯片。

2)SoC级(譬如串口)就是SoC内部外设,板级就是SoC外面开发板上面的硬件(譬如网卡、iNand)

3.5 uboot的"生命周期"

1)uboot的生命周期就是指:uboot什么时候开始运行,什么时候结束运行。

2)uboot本质上是一个裸机程序(不是操作系统),一旦uboot开始SoC就会单纯运行uboot(意思就是uboot运行的时候别的程序是不可能同时运行的),一旦uboot结束运行则无法再回到uboot(所以uboot启动了内核后uboot自己本身就死了,要想再次看到uboot界面只能重启系统。重启并不是复活了刚才的uboot,重启只是uboot的另一生)

3)uboot的入口和出口。uboot的入口就是开机自动启动,uboot的唯一出口就是启动内核。uboot还可以执行很多别的任务(譬如烧录系统),但是其他任务执行完后都可以回到uboot的命令行继续执行uboot命令,而启动内核命令一旦执行就回不来了。

总结:uboot的一切都是为了启动内核。

BIOS和BootLoader uboot相关推荐

  1. [架构之路-25]:目标系统 - 系统软件 - bootloader uboot内存映射与启动流程

    目录 第1章 uboot概述 1.1 概述 1.2 内存映射(案例) 1.3 uboot在嵌入式系统启动中的位置 第2章 uboot启动流程(源码分析) 2.1 入口函数:_start 2.3 执行流 ...

  2. BIOS和Bootloader的区别

    BIOS和Bootloader它们都是有基本的初始化系统,USB下载和硬件测试等功能的系统启动程序.不同之处在于中断矢量的定位,由于 bootloader要启动uClinux,因此必须按照uClinu ...

  3. Linux系统引导过程(BIOS和Bootloader部分)

    Linux系统引导过程(BIOS和Bootloader部分) 刘建文( http://blog.csdn.net/keminlau ) KEY:x86体系 CPU 系统引导 启动过程 Linux LI ...

  4. Linux系统基础——BIOS和Bootloader

    BIOS和Bootloader 特此说明: 刘超的趣谈linux操作系统是比较重要的参考资料,本文大部分内容和所有图片来源于这个专栏. 1 了解背景 1.1 目的 操作系统不是在板子上电就直接运行的, ...

  5. 趣谈Linux操作系统随笔——2.0 从BIOS到bootloader:创业伊始,有活儿老板自己上

    从BIOS到bootloader:创业伊始,有活儿老板自己上 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统 开发环境:Linux ...

  6. 【整理】BIOS、BootLoader、uboot对比

    bios BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统".其实,它是一组固化到计算机内 ...

  7. Linux嵌入式 -- Bootloader , Uboot

    1. Bootloader作用 PC机中的引导加载程序由BIOS(其本质是一段固件程序)和GRUB或LILO一起组成.BIOS在完成硬件检测和资源分配后,将硬盘中的引导程序读到系统内存中然后将控制权交 ...

  8. [架构之路-26]:目标系统 - 系统软件 - bootloader uboot使用方法、常用命令

    目录 第1章 uboot简介 1.1 uboot与Linux的关系 1.2 bootloader的类型 1.3 uboot的主要版本 1.4 uboot的作用与功能 1.5 SoC支持的启动方式 第2 ...

  9. linux常用的BootLoader U-boot的前世今生

    U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目.U-Boot的作用是系统引导. U-Boot从FADSROM.8xxROM.PPCBOOT逐步发展演化而 ...

最新文章

  1. 2.抽取代码(BaseActivity)
  2. Qt中树形结构显示目录结构
  3. 手机端适应_不轻易透露的超强技巧!详解iVX中怎样做设备自适应
  4. vscode 调试参数_如何通过vscode运行调试javascript代码
  5. 2016.01.10 论文扩充、精修、查重
  6. HDU 1233 - 还是畅通工程
  7. 关于对H264码流的PS的封装的相关代码实现
  8. MAC编译OpenJDK8:clang: error: include path for libstdc++ headers not found(独家解决办法)
  9. 程序员应该知道的Mac工具
  10. OpenWrt 固件定制
  11. 会计计算机论文,关于计算机论文格式模板,关于电算化会计相关论文范文资料...
  12. 【开发】MFC到Delphi的皮肤移植
  13. 苹果手机左上角的数字怎么弄_手把手教你把抖音视频音乐设置为手机铃声。
  14. Qt Flash 播放
  15. 【python量化】用时间卷积神经网络(TCN)进行股价预测
  16. 树莓派CM4设置静态IP地址(已解决)
  17. 图片轮播——Swiper实例
  18. 海外众筹:kickstarter众筹创建成功项目分享
  19. kaggle实战—泰坦尼克(四、数据可视化)
  20. 临床试验中lm是什么职位_除了CRX职位,临床试验中还有这些岗位

热门文章

  1. mysql主从搭建详细步骤
  2. 已重置应用默认设置html,Win10提示已重置应用默认设置怎么办?Win10已重置应用默认设置的解决方法...
  3. usb的endpoint,pipe之间的关系
  4. 基于IXP2800处理器的VPLS转发设计与实现
  5. Android Studio安装及SDK下载安装2021
  6. Kruskal算法求解最小生成树
  7. 推荐一个网站给大家哦
  8. 百度飞桨学院神奇AI技术
  9. oracle 11g proc/c...,Windows下Oracle 11g的下载与安装
  10. Excel快速插入空白列