嵌入式软件开发知识点总结-uboot&文件系统

2023-05-16

【推荐阅读】

浅析linux 系统进程冻结(freezing of task)

30分钟了解linux操作系统内核总结

深入linux内核架构--进程&线程

需要多久才能看完linux内核源码?

概述Linux内核驱动之GPIO子系统API接口

Uboot

什么是bootloader?

Linux系统要启动就必须需要一个 bootloader程序,也就说芯片上电以后先运行一段bootloader程序。这段 bootloader程序会先初始化时钟,看门狗,中断,SDRAM,等外设,然后将 Linux内核从 flash(NAND, NOR FLASH,SD,MMC等)拷贝到SDRAM中,最后启动Linux内核。当然了, bootloader的实际工作要复杂的多,但是它最主要的工作就是启动 Linux内核。

bootloader和 Linux内核的关系就跟PC上的BIOS和 Windows的关系一样, bootloader就相当于BIOS。总得来说,Bootloader就是一小段程序,它在系统上电时开始执行,初始化硬件设各、准备好软件环境,最后调用操作系统内核

uboot启动过程中做了那些事?

第一阶段

初始化时钟,关闭看门狗,关中断,启动ICACHE,关闭DCACHE和TLB,关闭MMU,初始化SDRAM,初始化NAND FLASH,重定位。

第二阶段

初始化一个串口,检测系统内存映射,将内核映象和根文件系统映象从 Flash上读到SDRAM空间中,为内核设置启动参数,调用内核。

uboot和内核如何完成参数传递?

uboot启动后已经完成了基本的硬件初始化(如:内存、串口等),接下来,它的主要任务就是加载Linux内核到开发板的内存,然后跳转到Linux内核所在的地址运行。

PS:只要问到uboot,面试官必问uboot和内核的参数传递,所以一定要知道!

具体是如何跳转呢?做法很简单,直接修改PC寄存器的值为Linux内核所在的地址,这样CPU就会从Linux内核所在的地址去取指令,从而执行内核代码。

在前面我们已经知道,在跳转到内核以前,uboot需要做好以下三件事情:

(1) CPU寄存器的设置

R0=0

R1=机器类型ID;对于ARM结构的CPU,其机器类型ID可以参见 linux/arch/arm tools/ mach-types

R2=启动参数标记列表在RAM中起始基地址

(2) CPU工作模式

必须禁止中断(IRQs和FIQs)

CPU必须为SVC模式

(3) Cache和MMU的设置

MMU必须关闭

指令 Cache可以打开也可以关闭

数据 Cache必须关闭

其中上面第一步CPU寄存器的设置中,就是通过R0,R1,R2三个参数给内核传递参数的。

为什么要给内核传递参数呢?

在此之前,uboot已经完成了硬件的初始化,可以说已经”适应了“这块开发板。然而,内核并不是对于所有的开发板都能完美适配的(如果适配了,可想而知这个内核有多庞大,又或者有新技术发明了,可以完美的适配各种开发板),此时,对于开发板的环境一无所知。所以,要想启动Linux内核,uboot必须要给内核传递一些必要的信息来告诉内核当前所处的环境

如何给内核传递参数?

uboot把机器ID通过R1传递给内核,Linux内核运行的时候,首先就从R1中读取机器ID来判断是否支持当前机器。这个机器ID实际上就是开发板CPU的ID,每个厂家生产出一款CPU的时候都会给它指定一个唯一的ID,大家可以到uboot源码的arch\arm\include\asm\mach-type.h文件中去查看。

R2存放的是块内存的基地址,这块内存中存放的是uboot给Linux内核的其他参数。这些参数有内存的起始地址、内存大小、Linux内核启动后挂载文件系统的方式等信息。很明显,参数有多个,不同的参数有不同的内容,为了让Linux内核能精确的解析出这些参数,双方在传递参数的时候要求参数在存放的时猴需要按照双方规定的格式存放

除了约定好参数存放的地址外,还要规定参数的结构。Linux2.4.x以后的内核都期望以标记列表(tagged_list)的形式来传递启动参数。标记,就是一种数据结构;标记列表,就是挨着存放的多个标记。标记列表以标记ATAG_CORE开始,以标记ATAG_NONE结束。

标记的数据结构为tag,它由一个tag_header结构和一个联合(union)组成。tag_header结构表示标记的类型及长度,比如是表示内存还是表示命令行参数等。对于不同类型的标记使用不同的联合(union),比如表示内存时使用tag_ mem32,表示命令行时使用 tag_cmdline。具体代码见arch\arm\include\asm\setup.h。

从上面可以看出,struct_tag结构体由structtag_header+联合体union构成,结构体struct tag_header用来描述每个tag的头部信息,如tag的类型,tag大小。联合体union用来描述每个传递给Linux内核的参数信息。

为什么uboot要关掉caches?

caches是cpu内部的一个2级缓存,它的作用是将常用的数据和指令放在cpu内部。caches是通过CP15管理的,刚上电的时候,cpu还不能管理caches。上电的时候指令cache可关闭,也可不关闭,但数据cache一定要关闭,否则可能导致刚开始的代码里面,去取数据的时候,从cache里面取,而这时候RAM中数据还没有caches过来,导致数据预取异常 。

文件系统

什么是根文件系统?

根文件系统首先是一种文件系统,该文件系统不仅具有普通文件系统的存储数据文件的功能,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所挂载(mount)的第一个文件系统内核代码的映像文件保存在根文件系统中,系统引导启动程序会在根文件系统挂载之后从中把一些初始化脚本(如rcS,inittab)和服务加载到内存中去运行,里面包含了 Linux系统能够运行所必需的应用程序、库等,比如可以给用户提供操作 Linux的控制界面的shell程序、动态连接的程序运行时需要的glibc库等。

我们要明白文件系统和内核是完全独立的两个部分。在嵌入式中移植的内核下载到开发板上,是没有办法真正的启动Linux操作系统的,会出现无法加载文件系统的错误。

根文件系统为什么这么重要?

根文件系统之所以在前面加一个”根“,说明它是加载其它文件系统的”根“,那么如果没有这个根,其它的文件系统也就没有办法进行加载的。根文件系统包含系统启动时所必须的目录和关键性的文件,以及使其他文件系统得以挂载(mount)所必要的文件。例如:

  • init进程的应用程序必须运行在根文件系统上。
  • 根文件系统提供了根目录“/”。
  • linux挂载分区时所依赖的信息存放于根文件系统/etc/fstab这个文件中。
  • shell命令程序必须运行在根文件系统上,譬如ls、cd等命令。

总之:一套linux体系,只有内核本身是不能工作的,必须要rootfs(上的etc目录下的配置文件、/bin /sbin等目录下的shell命令,还有/lib目录下的库文件等)相配合才能工作。

可执行映像文件通常由几部分构成,它们有什么特点?

可执行映像文件通常由以下几部分构成。

  • 一个或多个代码段,代码段的属性为只读。
  • 零个或多个包含初始化数据的数据段,数据段的属性为可读写。
  • 零个或多个不包含初始化数据的数据段,数据段的属性为可读写。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式软件开发知识点总结-uboot&文件系统 的相关文章

  • vector

    include lt iostream gt include lt vector gt include lt algorithm gt using namespace std 容器 xff1a vector 相当于一个数组 迭代器 xff1
  • STM32外设之TIM定时器使用及输出比较模式PWM生成,PWM频率和占空比计算,文末有固件库TIM驱动文件的函数讲解

    TIM 定时器是stm32单片机中的一个外设 xff0c STM32有8个定时器 xff0c 分别是2个高级定时器TIM1TIM8 xff0c 4个通用定时器TIM2 5 2个基本定时器TIM67 根据不同型号的单片机 xff0c 挂载的定
  • Java多线程之~~~~使用wait和notify实现生产者消费者模型

    在多线程开发中 xff0c 最经典的一个模型就是生产者消费者模型 xff0c 他们有一个缓冲区 xff0c 缓冲区有最大限制 xff0c 当缓冲区满 的时候 xff0c 生产者是不能将产品放入到缓冲区里面的 xff0c 当然 xff0c 当
  • 拷贝、移动构造

    include lt iostream gt using namespace std class temp private char a public temp char c char b a 61 new char 2 a 0 61 c
  • Dockerfile

    Dockerfile Dockerfile简介1 Dockerfile基本介绍2 Dockerfile构建过程3 Dockerfile指令用法 Dockerfile构建镜像1 Dockerfile使用CentOS构建apache镜像1 1相
  • MySQL数据库备份与恢复

    在项目的开发过程中数据库的备份是非常重要的 xff0c 为了防止数据库受到破坏 xff0c 造成不可估量的损失 xff0c 所以一定要进行数据库的备份 xff0c 并且需要掌握数据库恢复方法 xff0c 在发生数据库损坏的时候 xff0c
  • Linux设备驱动基础知识

    一 认识驱动 1 什么是驱动 不知道的情况下 xff0c 我们一般会去问度娘 xff0c 但是度娘的这个回答比较专业化 xff0c 对小白来说并不容易理解 xff0c 依旧不明白驱动到底是个啥 度娘 xff1a 驱动 xff0c 计算机软件
  • 接口及实现方法

    什么是接口 接口 xff08 英文 xff1a Interface xff09 xff0c 在JAVA编程语言中是一个抽象类型 xff0c 是抽象方法的集合 xff08 接口中的所有的方法都是抽象方法 xff09 xff0c 接口通常以in
  • JS中Document对象

    Document对象 Document对象就是一个标记性文档对象 它就是HTML文件本身 当浏览器把一个html文件加载到内存中之后 xff0c 在内存中就会形成这个document对象 document URL xff1a 返回当前页面的
  • Sphinx环境配置以及VScode编写Rst文档转html

    Sphinx环境配置 安装python3通过python3安装sphinx sphinx官方网站 xff1a Installing Sphinx Sphinx documentation python官方网站 xff1a Welcome t
  • js实现防抖和节流

    防抖 xff1a 防抖就是在连续多次触发该事件 xff0c 事件触发间隔小于设定的事件 xff0c 事件只会执行最后一次 节流 xff1a 规定的时间内 xff0c 只能触发一次该事件 接下来看代码 xff1a lt DOCTYPE htm
  • 树莓派系统镜像一键瘦身备份脚本, 生成最小化镜像img(一)

    开发 测试环境 树莓派 xff1a Raspberry Pi 3b 43 TF 存储卡 xff1a 32GB操作系统 xff1a 2020 05 27 raspios buster full armhf xff08 官方版本 xff09 程
  • 分享——网页上的虚拟机

    大家还记得之前的Windows系统吗 xff1f 相信大家一定想要重温或体验以前Windows的系统吧 xff0c 可有些朋友想体验但又嫌装虚拟机太麻烦 xff0c 怎么办呢 其实 xff0c 还有 网上的虚拟机 现在 xff0c 我就给大
  • 单片机编程中的裸机编程和多任务系统FreeRTOS系统详解,以及怎么学习FreeRTOS,看哪家的教程?(合集)

    单片机编程中的裸机系统和多任务系统 学习了那么久的stm32还停留在裸机 xff1f xff1f xff1f 单片机编程中的裸机系统和多任务系统 1 裸机系统1 1轮询系统1 2 前后台系统 2 多任务操作系统3 为什么要学习多任务操作系统
  • Selenium+Pytest自动化测试框架实战,还不会点这里一清二楚,全网最细教程!

    如果下方文字内容没有看明白的话 xff0c 我推荐大家看一套视频 xff0c 比文字内容讲的更加详细 xff01 在华为工作了10年的大佬出的Web自动化测试教程 xff0c 华为现用技术教程 xff01 哔哩哔哩 bilibili 在华为
  • Firewalld防火墙基础

    目录 前言 一 概述 2 Firewalld和iptables的关系 2 1 Firewalld和iptables的关系 3 Firewalld区域 3 1 firewalld区域的概念 3 2 firewalld防火墙定义了9个区域 3
  • Matlab/simulink控制,遗传pid,模糊pid,滑模控制,自抗扰ADRC控制

    Matlab simulink控制 xff0c 遗传pid 模糊pid xff0c 滑模控制 xff0c 自抗扰ADRC控制 xff0c 鲁棒控制 xff0c LADRC控制等 xff0c 以上控制均已封装为simulink模块 xff0c
  • USB串口转CAN通讯盒资料

    公司开发低成本USB串口转CAN通讯盒 xff0c 其他项目优先 xff0c 停止开发 xff0c 自己闲暇时间继续开发而成 出资料 主控是stm32f103c8t6 整套资料 xff0c 很适合初学者学习上下位机通讯控制入门 xff0c
  • I2C读取IST8310

    文章目录 I2C简介I2C传输过程I2C仲裁IST8310磁力计Cube配置相关函数HAL I2C Mem Read函数HAL I2C Mem Write函数IST8310的初始化 程序流程代码编写 I2C简介 2C是一种半双工双向二线制的
  • 开发型C板IST8310磁力计的读写过程

    文章目录 读取单字节过程读取多字节过程写入单字节过程写入多字节过程 对于开发板C型的IST8310 xff0c I2C的地址是0x0E xff0c 读取0x00寄存器的值 读取单字节过程 发送一个起始信号 xff08 如图一 xff09 发

随机推荐