嵌入式考纲
简答题:1-2微处理器,2-1-2ARM处理器和指令集内部结构2,4嵌入式软件编程技术 5开发环境和调试技术 7-1linux操作系统 8嵌入式文件系统 课后思考题
1.5.6.7
2.3.4.5.6.7.9.11.13
4
5
7.2.5.8.10
8
文章目录
- 嵌入式考纲
- 第一章
- 第二章
- **1.ARM** **微处理器的特点;**
- ARM7系列
- ARM9系列
- ARM9E系列
- ARM10E系列
- Xscale
- **3.CISC** 与 **RISC** **体系结构的特点及区别;**
- **4.冯.诺依曼结构和哈佛结构的特点及区别**
- **5.ARM** **微处理器的工作状态及区别;**
- **6.ARM体系结构的存储器格式;**
- **7.ARM** **处理器的** **7** **种工作模式;**
- **9.程序状态寄存器(**CPSR**)的结构与作用;(**SPSR**)**
- **11.异常的响应及返回;**
- **12.ARM** **处理器的寻址方式**
- **13.ARM** **的指令格式(立即数、条件码);**
- **存储器访问指令(Load/Store)**、协处理器指令
- 第三章 嵌入式Linux系统
- 第四章 嵌入式软件编程技术
- 第五章 开发环境和调试技术
- 第六章 BootLoader技术
- 第七章 ARM-Linux内核
- 第八章 嵌入式文件系统
- 第九章 嵌入式驱动设计
第一章
1.嵌入式系统的前世今生及应用领域;
首个嵌入式系统:AGC
军事
- 武器控制系统
- 数字化单兵系统
工业制造
- 智能测量仪表
- 机电一体化机械设备
- 数控装置
- 工业机器人
- 可编程控制器,控制机
- 分布式控制系统
- 现场总线仪表及控制系统
仪器仪表
- DCG
- 监护仪
智能家居
智能家电
智能汽车
商业、办公自动化及通信
PMP
-
protable media player
-
sixth sense系统
-
可佩戴式多点触控投影机
-
健身服
-
指套探测器
-
表皮电子
-
tacit project手套
-
flora kit电脑
环境检测
地址灾害监控
2.嵌入式系统的发展阶段;
操作系统:
- 无操作系统阶段
- 简单操作系统阶段
- 实时操作系统阶段
- 面向Internet阶段
无操作系统阶段
将嵌入式软件固化在只读内存,汇编编程
- 前提:没有操作系统的支持,通过汇编语言对系统直接控制,运行结束后清除内存,只能执行一些单线程的程序
- 主要特点:系统结构和功能相对单一,处理效率较低,存储容量较小,几乎没有用户接口。使用简便,价格低。主要用于工业控制领域
简单操作系统阶段
开发简单的应用软件
-
前提:微电子工艺水平的提高
-
主要特点:出现了大量高可靠、低功耗的嵌入式CPU,此时的嵌入式系统虽然比较简单,但是初步具有一定的兼容性和扩展性,内核精巧并且效率高。主要用于控制系统负载以及监控应用程序的运行
实时操作系统
实时控制;软实时;硬实时;增加用户体验
- 前提:分布控制、柔性制造、数字化通信和信息家电的需求。硬件实时性的提高
- 主要特点:操作系统的实时性得到提高,能够运行在各种不同类型的微处理器上,具有高度的模块化和扩展性。具备了文件和目录管理、设备管理、多任务、网络、图形用户界面等功能,提供了大量的应用程序接口
面向Internet的阶段
传感网络,物联网,工业物联网,CPS(信息物理社会)
- 前提:Internet技术与信息家电、工业控制技术等的结合
PC时代
- 特点:PC机+Windows操作系统为主要应用开发环境,以互联网为信息共享媒介
后PC时代
- 特点:计算机微型化,提供专用、可移动、多样化硬/软件开发平台,以无线网络及互联网为信息共享媒介
3.嵌入式系统的定义;
嵌入式系统是以应用为中心,以计算机技术为基础,采用可剪裁软硬件,适用于对功能、实时性、可靠性、功耗等有严格要求的专用计算机系统
4. 嵌入式系统与桌面通用系统的区别;
- 运行的任务专用而确定:形式多样、面向特定应用;桌面通用系统:支持大量的、需求多样的应用程序
- 处理器和处理器体系结构类型多
- 实时性要求高:强实时型,一般实时型,弱实时型
- 运行需要高可靠性保障(硬件的看门狗定时器,软件的内存保护和重启动机制)
- 大多数都有功耗约束(间歇工作方式)
- 可用资源少
- 嵌入式系统开发需要专用工具和特殊方法
- 嵌入式系统开发是一项综合的计算机应用技术
5. 嵌入式处理器的基本特征;
-
微处理器是整个系统的核心,通常由三大部分组成:控制单元、算数逻辑单元和寄存器
-
存储器包括主存和外存,外存采用flash芯片存储数据,体积小、功耗低、抗震。
-
大多数输入、输出接口和部分设备已经集成在嵌入式微处理器中
-
相对通用处理器,嵌入式处理器的特点:
- 体积小、集成度高、价格较低,
- 可扩展的处理器接口,功耗低,
- 对实时多任务由很强的支持能力,
- 具有功能很强的存储保护功能,
- 用于桌面和服务器的微处理器芯片内部通常只包括CPU核心、Cache、MMU、总线结构等
- 嵌入式处理器还集成了各种外部接口和设备
6. 嵌入式处理器的种类及特点(MCU、DSP、MPU、SOC);
种类 | 特点与不同之处 | 用途 |
---|---|---|
微处理器MPU | 相对于通用计算机中的CPU:1.只保留和嵌入式应用紧密相关的功能硬件,去除其它冗余的功能,以最低功耗和成本实现特定的需求2.在工作温度、抗电磁干扰、可靠性等方面对CPU做了各种增强3.微处理器装配在专门设计的电路板上,系统的可靠性较低,技术保密性较差4.不是为任何已有的特定计算目的而设计的芯片, | Am186/88,386EX,SC-400,Power PC,68000,MIPS,ARM系列等 |
微控制器MCU | (1)以某一微处理器内核为核心 (2)芯片内部集成各种必要功能和外设) (3)特点:单片化、体积大大减小,从而使成本和功耗下降、可靠性提高 | 1.通用系列:8051,P51XA,MCS-251,MCS-96/196/291等 2.半通用系列:支持USB接口的C540,C541;支持I2C,LCD及众多专用MCU和兼容系列 |
DSP处理器 | (1)采用哈弗结构和专用的硬件乘法器 (2)使用快速DSP指令(RISC) (3)适用于处理器运算速度要求较高、向量运算较多的应用领域 | 1.数字信号处理 数字滤波, 2.移动电话、语音识别 3.智能化嵌入式系统 |
SOC | (1)一种系统集成芯片,功能可以完全由硬件完成,也可以由软硬件完成 (2)高密度、高速度、高抗干扰性 | 1.ARM+ARM 2.ARM+DSP 3. ARM+FPGA |
7. 典型嵌入式处理器的特点及应用场景(ARM、MIPS、POWERPC)
典型嵌入式处理器 | 特点 | 应用场景 |
---|---|---|
ARM | (1)体积小、低功耗、低成本、高性能 (2)支持Thumb/ARM双指令集 (3)大量使用寄存器 (4)寻址方式灵活 (5)固定长度的指令 | 1.Cortex M系列处理器:低端嵌入式应用市场 2. 经典ARM及Cortex R系列处理器:中高端嵌入式应用市场 3.Cortex A系列处理器:高端嵌入式应用市场 |
MIPS | 高性能、高处理能力的高端嵌入式处理器 | 应用于消费类电子、下一代网络、宽带产品、智能卡、机顶盒、数字电视、DVD |
POWERPC | 可伸缩性好、方便灵活 | 应用于DSL调制解调器、SOHO路由器、远程接入服务器、DSLAM、执行局交换机设备、无线基站、企业路由器 |
8. 嵌入式软件系统的体系结构及各个层次的任务;
嵌入式软件系统体系结构:驱动层,操作系统层,中间件层,应用层
- 驱动层
- 板级初始化程序
- 与系统软件相关的驱动
- 与应用软件相关的驱动
- 硬件抽象层
- 通过特定的上层接口与操作系统进行交互,屏蔽了底层硬件的多样性
- 操作系统层
- 包括 嵌入式内核,嵌入式TCP/IP网络系统,嵌入式文件系统,嵌入式GUI系统和电源管理等部分
- 中间件层
- 应用层
- 应用层软件主要由多个相对独立的应用任务组成
- 每个应用任务完成特定的工作
9. 嵌入式操作系统的主要特性;
- 可配置,可剪裁
- 实时任务调度策略
- 适应多种处理器,可剪裁,轻量型,实时可靠,可固化
- 基于优先级的,可抢占的调度算法
- 按照应用对象有偏控制类和偏人机交互类之分
10.嵌入式操作系统的分类;
嵌入式软件系统体系结构:驱动层,操作系统层,中间件层,应用层
- 驱动层
- 板级初始化程序
- 与系统软件相关的驱动
- 与应用软件相关的驱动
- 硬件抽象层
- 通过特定的上层接口与操作系统进行交互,屏蔽了底层硬件的多样性
- 操作系统层
- 包括 嵌入式内核,嵌入式TCP/IP网络系统,嵌入式文件系统,嵌入式GUI系统和电源管理等部分
- 中间件层
- 应用层
- 应用层软件主要由多个相对独立的应用任务组成
- 每个应用任务完成特定的工作
- 能否简述嵌入式系统的主要特性?
- 可配置,可剪裁
- 实时任务调度策略
- 适应多种处理器,可剪裁,轻量型,实时可靠,可固化
- 基于优先级的,可抢占的调度算法
- 按照应用对象有偏控制类和偏人机交互类之分
- 能否简述嵌入式系统的分类?
- 嵌入式处理器的位数
4.8.16.32.64位嵌入式系统
- 应用
信息家电类,移动终端类,汽车电子类,工业控制类,通信类
- 速度
- 强实时系统,毫秒或者微妙
- 一般实时系统,几秒
- 弱实时系统,数十秒或更长
- 确定性
- 硬实时系统
如果系统响应时间不能满足,会引起系统崩溃或致命的错误
- 软实时
不会导致系统出现致命错误或崩溃
- 嵌入式系统软件复杂程度
循环轮询系统
有限状态机系统
前后台系统
单处理器多任务系统
多处理器多任务系统
- 嵌入式系统的商业模式
- 商业型
- 开源型
11. 典型嵌入式操作系统的特点及应用场景(Linux 、VXwork、QNX、uC/OS)。
嵌入式操作系统 | 特点 | 应用场景 |
---|---|---|
Linux | (1)广泛的硬件支持 (2) 内核高效稳定 (3)开放源码,软件丰富 (4)优秀的开发工具 (5)完善的网络通信和文件管理机制 | Android、MeeGo |
VXwork | 高可靠性、高实时性、可剪裁性好、但非常昂贵 | 用于美国“极地登陆者”号、“深空二号”和火星气候轨道器等登陆火星探测器上 |
QNX | 高可靠性、高安全性、高度伸缩性、可灵活剪裁 | 广泛嵌入到汽车、智能机器、智能仪器仪表、机顶盒、通讯设备、PDA等应用,目前作为黑莓手机及黑莓平板电脑的操作系统 |
uc/OS | 开源、结构小、可剥夺、实时的 (缺点:不支持时间片轮转调度法) | 用于控制类等低端应用中。如照相机行业、医疗检测仪器、音响设施等 |
第二章
1.ARM 微处理器的特点;
- 高性能、低成本、低功耗
- 大量的寄存器,可用于多种用途
- Load/Store体系结构,多寄存器Load/Store指令
- 3地址指令(两个源操作数寄存器和结果寄存器)
- 每条指令都条件执行
- 能通过协处理器指令集扩展ARM指令集,在编程模式下增加了新的寄存器和数据类型
- 在Thumb体系结构中以高密度16位压缩形式表示指令集
2.ARM 各体系架构版本与各系列产品的特点;
架构 | 区别 | 应用场景 |
---|---|---|
v1 | 基本指令 | 只在原型机ARM1出现过 |
v2 | 对V1进行了扩展,增加了指令以及寻址空间 | ARM2与ARM3架构 |
v3 | 增加了CPSR和SPSR寄存器;寻址空间;中止和未定义处理器模式 | |
v4 | 引进了16位的Thumb指令集 | |
v5 | 新增指令 | |
v6 | 在芯片功耗和多媒体处理上有所突破 | 根下一代的消费类电子、无线设备、网络应用和汽车电子产品等需求制定 |
v7 | 采样Thumb-2技术,兼容性好 | |
v8 | 支持64微指令集的处理器架构;包含两个执行状态:AArch64和AArch32 | 基于64微Cortex-A5X系列的百度ARM服务器 |
- A:面向简短的基于虚拟内存的操作系统和用户应用
- R:针对实时系统
- M:对微控制器和低成本应用提供优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5TULiqLS-1608779280944)(D:\数据可视化\大数据分析学习\图片\image-20201221143448012.png)]
3.能够举例分析ARM微处理器系列芯片的特点?
ARM7系列
- 广泛应用于多媒体和嵌入式设备,包括Internet设备、网络和调制解调器设备,以及移动电话、PDA等无线设备
ARM9系列
- 主要应用于引擎管理,仪器仪表,安全系统和机顶盒等领域
ARM9E系列
- 允许在硬件中执行Java字节码
- 主要应用于下一代无线设备、数字消费品、成像设备、工业公职、存储设备和网络设备等领域
ARM10E系列
- 使用向量浮点(VFP)单元VFP10提高高性能的浮点解决方案
- 用于视频游戏机和高性能打印机等场合
Xscale
- 应用于手提式通讯和消费类电子类设备
3.CISC 与 RISC 体系结构的特点及区别;
特点 | |
---|---|
CISC | (1)指令的种类繁多 (2) 指令功能强大 (3)指令机器码长度因指令不同而不同 (4)指令执行时间有较大的差异 (5)高性能微指令结构耗用大量晶体管,造成体积成本增加 |
RISC | (1)具有一个短小精悍的指令集 (2)指令具有相同的机器码位长 (3)95%的指令执行时间为一个时钟周期 (4)节省了大量晶体管,但无法实现高性能指令 (5)采用载入(Load/Store)模式 |
指标 | RISC | CISC |
---|---|---|
指令集 | 一个周期执行一条指令,通过简单指令的组合实现复杂操作;指令长度固定 | 指令长度不固定,执行需要多个周期 |
流水线 | 流水线每周期前进一步 | 指令的执行需要调用微代码的一个微程序 |
寄存器 | 更多通用寄存器 | 用于特定目的的专用寄存器 |
Load/Store结构 | 独立的Load/Store指令完成数据在寄存器和外部存储器之间的传输 | 处理器能够直接处理存储器中的数据 |
4.冯.诺依曼结构和哈佛结构的特点及区别
哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。
- 特点:
- 使用两个独立的存储器模块分别存储指令和数据,使用两条独立的总线进行访问
- CPU可以进行进行的操作,提高处理器的执行效率
冯.洛依曼结构的处理器指令和数据使用同一个存储器
- 特点:
- 指令和数据存储字相同的内存空间,但是存储地址不同
- 处理器利用相同的总线处理内存中的指令和数据,指令和数据具有相同的数据宽度,指令和数据无法同时存取
5.ARM 微处理器的工作状态及区别;
ARM状态,此时处理器执行32位的、字对齐的ARM指令
Thumb状态,此时处理器执行16位的、半字节对齐的Thumb指令
ARM微处理器开始执行代码是,应该处于ARM状态
进入Thumb状态:
- 大概操作数寄存器的状态为位1时,采用执行BX指令的方法
- 当处理器处于Thunb状态发生异常时,在异常处理返回时,自动切换到Thumb状态
进入ARM状态
- 当操作数寄存器的状态位为0时,执行BX指令
- 处理器进行异常处理时,把PC指针放入异常模式链接寄存器中,从异常向量地址开始执行程序
ARM指令集和Thumb指令集在应用上的区别?
- 并非所有ARM指令都有对应的Thumb指令
- Thumb代码使用的存储空间比ARM少,指令数更多,执行速度快,功耗更低
6.ARM体系结构的存储器格式;
ARM体系结构将存储器看作是从零地址开始的字节的线性组合
从零字节到三字节放置第一个存储的数据
从第四个字节到第七个字节放置第二个存储的字数据,依次排列
作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB
ARM体系结构可以用两种方法存储字数据,分别是大端格式、小端格式
7.ARM 处理器的 7 种工作模式;
工作模式 | 运用场合 | 说明 |
---|---|---|
用户(usr) | 运行用户应用程序 | 不能直接切换到其它模式 |
系统(sys) | 运行操作系统 | 与用户模式类似,但具有可以直接切换到其它模式等特权 |
块中断(fiq) | 高速I/O数据传输处理 | FIQ异常响应时进入该模式 |
中断(irq) | 常规I/O数据传输处理 | IRQ异常时进入该模式 |
管理(svc) | 开机/复位程序及软中断掉 | 系统复位和软件中断时进入此模式 |
访问中止(abt) | 用于支持虚拟内存和/或存储器保护 | 仅用于ARM9及后续结构 |
未定义(und) | 自定义指令,协处理器软件仿真 | 未定义指令异常响应式进入此模式 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wD6Pdyzv-1608779280946)(D:\数据可视化\大数据分析学习\图片\image-20201221150548978.png)]
- 后五种为异常模式,程序和特定异常进入,每个异常模式都有独立的寄存器
- 用户和系统模式使用完全相同的寄存器组
8.ARM 状态下的寄存器组织(未分组的寄存器
<R0~R7>、分组寄存器<R8~R12、R13、R14>、
PC 寄存器);
任何时候,通用寄存器R14-R0、程序计数器PC、一个或两个状态寄存器都是可以访问的
R0-R7为未分组的寄存器,在中断或异常处理时,使用相同的物理寄存器
R8-R12为分组寄存器,取决于当前的处理器模式,有两组寄存器,一组用于FIQ,一组用于其它
R14为链接寄存器(LR),保存子程序返回地址;发生异常时,将R14对应的异常模式版本设置为异常返回地址。将PC的当前值拷贝个R14,执行完子程序后,将R14的值拷贝会PC
寄存器R13常作为堆栈指针.
寄存器R15用作程序计数器(PC)。
在ARM状态下,位[1:0]为0,位[31:2]用于保存PC;
在Thumb状态下,位[0]为0,位[31:1]用于保存PC;
9.程序状态寄存器(CPSR)的结构与作用;(SPSR)
CPSR反映了当前处理器的状态:
4个条件代码标志(负(N)、零(Z)、进位©和溢出(V) );
2个中断禁止位,分别控制一种类型的中断;
5个对当前处理器模式进行编码的位;
1个用于指示当前执行指令(ARM还是Thumb)的位。
- CPSR:当前程序状态寄存器,反映当前处理器的状态
- SPSR:备份程序状态字,保存异常发生前的CPSR
10.异常的基本概念及分类;
非预知的引发处理器暂时脱离正常指令序列并转到另外的 程序段去运行的现象
异常包括异常和中断两种类型。
(1) 异常 (Exceptions) 是因指令的执行而产生的,属于软件触发, 且大部分是不可屏蔽的。
(2) 中断 ( Interrupt) 通常是由电信号作用到处理器专门的中断 请求引脚触发的,属硬件触发。而且通常 可以通过对中断屏蔽位的设置禁止或允许 对其的响应
ARM处理器共设置了七种不同类型的异常,包括:
- 两种硬件触发的中断:
- 普通中断(IRQ);快中断(FIQ)
- 五种软件触发的异常:
- 复位; 未定义指令; 软件中断; 指令预取中止; 数据中止
11.异常的响应及返回;
对异常的响应:
- 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行
- 将CPSR复制到相应的SPSR中
- 根据异常类型,强制设置CPSR的运行模式位
- 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处,同时设置中断禁止位,以禁止中断发生
异常返回:
- 将连接寄存器LR的值减去相应的偏移量后送到PC中
- 将SPSR复制回CPSR中
- 若在进入异常处理时设置了中断禁止位,要在此清除
12.ARM 处理器的寻址方式
寻址方式 | 说明 |
---|---|
立即寻址 | 也叫立即数寻址,操作数包含在指令的操作码中 |
寄存器寻址 | 利用寄存器中的内容作为操作数 |
寄存器移位寻址 | 操作数有寄存器的数值进行相应移位得到 |
寄存器间接寻址 | 以寄存器中的内容作为操作数的地址 |
基址变址寻址 | 将寄存器的内容与指令中给出的地址偏移量相加,得到操作数的地址 |
多寄存器寻址 | 一条指令可以完成多个寄存器的传送,这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值 |
堆栈寻址 | 使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶 |
相对寻址 | 以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,两者相加后的到操作数的地址 |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ArpSNMkn-1608779280948)(D:\数据可视化\大数据分析学习\图片\image-20201221161613837.png)]
13.ARM 的指令格式(立即数、条件码);
<opcode> {<cond>} {s} <Rd> ,<Rn>{,<op2>}
<>号内的项是必须的,{}号内的项是可选的
opcode:指令助记符;cond:执行条件
S:是否影响CPSR寄存器的值
Rd:目标寄存器; Rn:第一个操作数的寄存器
op2:第二个操作数
14.ARM9 的指令系统(跳转指令、数据处理指令、
存储器访问指令(Load/Store)、协处理器指令
杂项指令、饱和算术指令)
存储器访问指令:
- 把数据从存储器到寄存器中的传送叫加载,数据从寄存器到存储器的传送叫存储
- 分为3类:单寄存器数据加载/存储指令;多寄存器加载/存储指令;数据交换指令
数据处理指令:
- 只能对寄存器得内容进行操作,不允许对存储器中得数据进行操作,也不允许指令直接使用存储器的数据或在寄存器与存储器之间传送数据
- 分为三大类:数据传送指令;算数逻辑运算指令;比较指令
跳转指令:
-
即分支指令,能够跳转到指定地址或根据跳转地址的最低位来切换处理器状态
-
助记符 说明 操作 条件码位置 B label 分支指令 PC<–label B {cond} BL label 带链接的分支指令 LR<-PC-4, PC<-label BL{cond} BX Rm 带状态切换的分支指令 PC<-Rm,切换处理器状态 BX{cond} BLX RM 带链接与状态切换的指令 LR<-PC-4,PC<-Rm,切换处理器状态 BLX{cond}
协处理器指令:
- 初始化ARM处理器、协处理器处理数据,协处理器与处理器数据交互等
杂项指令:
- 软中断指令,读状态寄存器指令,写状态寄存器指令,断点指令
15.ARM 的四条伪指令(ADR、ADRL、LDR、NOP);
- ADR:将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中
- ADRL:基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令读取更大范围的地址
- LDR:用于加载32位的立即数或一个地址值到指定寄存器
- NOP:在汇编时将会被代替乘ARM中的空操作
第三章 嵌入式Linux系统
1.Linux 发展的 5 大支柱;
Unix操作系统:诞生了c语言,只能自己使用和发放到大学得科研机构中
Minix操作系统:用于教学,开放源码。微内核结构
GNU计划:1987年6月完成得11万行源代码开放得编译器
POSIX标准
Internet:
2.Linux 的发行版( **RedHat 家族与 Debian 家族);
RedHat:使用数量最多得Linux发行版
Debian:自由社会使用最多得发行版
Ubuntu:基于Debian的一个发行版
3.Linux 版本的发展;
从Linux诞生以来,Linux内核就没有停止过升级,从1991年0.01版本到1999年具有里程碑意义的2.2版本,一直到我们现在看到的x.x.xx版本
- Linux内核版本有两种:稳定版和开发版
- Linux内核的命名机制:num.num.num(第一个数字是主版本号、第二个数字是次版本号、第三个数字是修订版本号)
4.Linux 主机开发环境搭建;
- 光盘
- 硬盘
- 网络安装(HTTP,FTP,NFS)
- 虚拟机(Xen,VMware)
- u盘启动。。。
5.Linux 基本命令(用户系统相关命令、文件目录相
关命令、压缩打包相关命令、比较合并文件相关命
令、网络相关命令);
文件目录命令
命令 | 作用 |
---|---|
ls / ls -l | 列目录 |
pwd | 显示当前目录名称 |
cd /etc --> cd ../bin | 更改当前目录 (即从etc目录到bin目录) |
mkdir mydir-->rmdir mydir | 建立和删除目录 |
文件操作命令:
命令 | 功能 |
---|---|
file | 显示指定文件的类型 |
touch | 建立指定名称的文件或更新文件时间 |
cp | 复制文件或目录 |
rm | 删除文件或目录 |
mv | 移动文件或目录,文件或目录重命名 |
find | 在指定目录查找符合条件的文件 |
文本文件查看命令:
命令 | 功能 |
---|---|
cat | 显示文本文件内容 |
more | 分页显示文本文件内容 |
less | 分页显示文本文件内容,并可方便反复浏览 |
head | 显示文件首部内容 |
tail | 显示文件尾部内容 |
压缩打包相关命令:
文件后缀 | 解压命令 | 示例 |
---|---|---|
.a | tar xv | tar xv hello.a |
.z | uncompress | uncompress hello.z |
.gz | gunzip | gunzip hello.gz |
.tar.gz/.tgz | tar xvzf | tar xvzf hello.tar.z |
.tar.bz2 | tar jxvf | tar jxvf hello.tar.bz2 |
.rpm | 安装:rmp -i 解压:rmp2cpio | 安装:rpm -i hello.rpm 解压:rmp2cpio hello.rpm |
.deb | 安装:dpkg -i 解压:dpkg-dep --fsys-tarfile | 安装:dpkg -i hello.deb 解压:dpkg-dep --fsys-tarfile hello.deb |
-zip | unzip | unzip hello.zip |
6.Linux 软件的安装;
Linux | 管理机制 | 使用指令 | 线上升级机制 |
---|---|---|---|
Red Hat/Fedora | RPM | rpm | YUM(yum) |
Debian/Ubuntu | DPKG | dpkg | APT(apt-get |
7.Linux 程序开发过程及其使用的工具;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oHVBLYpj-1608779280949)(D:\数据可视化\大数据分析学习\图片\image-20201221185954155.png)]
文档编辑VI
GCC工具
GDB工具
Make工具
8.vi 三种工作模式的相互转换关系;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPGMJgpi-1608779280951)(D:\数据可视化\大数据分析学习\图片\image-20201221190205279.png)]
9.vi 的基本操作命令;
i:在当前光标所在处插入要输入的字符,光标后面的字符会向后退
o:在光标所在行的下方插入一行
a:从当前光标的下一个字符的位置添加字符,已存在的字符会向后退
10.GCC 编译处理流程及文件类型;
- 预处理:分析各种预处理命令,如#define,#include,#if
- 编译:根据输入文件产生汇编语言程序
- 汇编:将汇编语言输入,产生扩展名为.o的目标文件
- 链接:以.o目标文件,库文件作为输入,生成可执行文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtNVgxj2-1608779280952)(D:\数据可视化\大数据分析学习\图片\image-20201221190526545.png)]
11.GCC 的常用选项及 GCC 的常用编译指令;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N8ZVi4Ys-1608779280953)(D:\数据可视化\大数据分析学习\图片\image-20201221190637991.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pC9Nsp8V-1608779280954)(D:\数据可视化\大数据分析学习\图片\image-20201221190653166.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZF3hoFO7-1608779280955)(D:\数据可视化\大数据分析学习\图片\image-20201221190702725.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SssHxrfW-1608779280955)(D:\数据可视化\大数据分析学习\图片\image-20201221190712351.png)]
GCC常用编译指令:
选项 | 用法 | 作用 |
---|---|---|
无选项编译链接 | gcc hello.c | 将hello.c预处理、汇编、编译并链接形成可执行文件,这里未指定输出文件,默认输出为a.out |
选项-o | gcc hello.c -o hello | 将hello.c预处理、汇编、编译并链接形成可执行文件helllo,-o选项用来指定输出文件的文件名 |
选项-E | gcc -E hello.c -o hello.i | 将hello.c预处理输出hello.i文件 |
选项-S | gcc -S hello.i | 将预处理输出文件hello.i汇编成hello.s文件 |
选项-c | gcc -c hello.s | 将汇编输出文件hello.s编译输出为hello.o文件 |
无选项链接 | gcc hello.o -o hello | 将编译输出文件hello.o链接成最终可执行文件hello |
选项-O | gcc -O1 hello.c hello | 使用编译优化级别1编译程序,级别为1~3,级别越大优化效果越好,但编译时间越长 |
选项-Wall | gcc -Wall hello.c -o hello | 能够显示所有的警告信息,以便于修改调试 |
12.GDB 的基本用法与命令;
- 编译时使用调试选项 gcc -g hello.c main.c -o hello
- 启动GDB
- help查询命令用法
- quit或ctrl+d退出GDB
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EATbY8pi-1608779280956)(D:\数据可视化\大数据分析学习\图片\image-20201221191033312.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HpLaQTFj-1608779280957)(D:\数据可视化\大数据分析学习\图片\image-20201221191042183.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmmiVMsd-1608779280957)(D:\数据可视化\大数据分析学习\图片\image-20201221191052133.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aG804qZE-1608779280958)(D:\数据可视化\大数据分析学习\图片\image-20201221191112205.png)]
13.Make 程序和 Makefile 文件;
Make:自动编译所有内核代码文件,要
使用make工具程序,必须编写一个名称为
makefile(或Makefile)的文件。
Makefile:主要包含一些make要遵守的执
行规则和要求执行的命令等内容,用于告诉
make需要对所涉及的源文件做哪些操作和处
理以生成相应的目标文件。
14.Makefile 里主要包含的五个东西;
显式规则,隐含规则,变量定义,文件指示和注释
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8DVNCXDm-1608779280959)(D:\数据可视化\大数据分析学习\图片\image-20201221191310815.png)]
16.make 的工作原理;
- make在当前目录下找名字为Makefile或makefile的文件
- 将文件中的第一个目标文件作为最终目标文件
- 如果最终目标文件不存在或者最终目标文件依赖的后面的.o文件的文件修改时间更新,执行后面定义的命令生成最终目标文件
- 如果依赖的.o文件不存在,make在当前文件中找目标为该.o文件的依赖规则,生成.o文件
17.Makefile 的语法-常用变量、自动变量、自动生成
依赖性、伪目标;
- = 使用时展开
- := 定义时展开
- += 变量追加
- ?= 若未定义则定义,若一定义则不执行此定义
自动推导文件以及文件依赖关系后面的命令
伪目标:即便该命令执行出错,make也不管:.PHONY
伪目标是一个标签
第四章 嵌入式软件编程技术
1.GUN ARM 汇编编程基础: GUN ARM 汇编语句
格式、常用的预定义寄存器名称、GNU 汇编语言定
义入口点、常用伪操作(.end;.include;.gobal)。
GUN
执行指令,伪操作,伪指令
R0-R15:通用寄存器
A1-A4:入口参数,处理结果,暂存
IP:保存栈指针
LR:链接寄存器
CPSR:当前程序状态寄存器
SPSR:程序状态备份寄存器
GNU
汇编程序段:text代码段,数据段,未初始化,端数据
默认入口时_start标号,也可以使用ENTRY标记指明其他入口点
十进制,二进制0B,八进制0,十六进制
字符串“xxx\n”
表达式,其他符号使用与C语言类似
常用伪操作:数据定义伪操作,函数定义伪操作
伪操作:穿插在汇编编译、链接程序将源程序正确生成目标代码并合理分配存储区的一类符号
.end:表明源文件的结束
.include:在指定位置展开文件
.gobal:全局标号
主要作用:标识段的气质及属性,定义数据的类型,分配存储区大小,定义过程及其类型,表示程序的结束位置等
2.汇编语言的简单程序编程;
理解例题,会写展开代码
用GNU ARM汇编1程序设计实现20的阶乘,并将其64位结果放在R9和R8寄存器中(其中R9放高32位,R8放低32位)
.global _start
.text
_start:
MOV R8, #20 @低32位初始化为20
MOV R9, #0 @高32位初始化为0
SUB R0,R8, #1 @初始化计数器
Loop:
MOV R1,R9 @暂存高位值
UMULL R8,R9,R0,R8 @[R9 : R8] = R0 * R8 R9存储高8位的值,R8存储低8位的值
MLA R9,R1,R0,R9 @R9 = R1 * R0 + R9
SUBS R0,R0,#1 @计数器递减
BNE Loop @计数器不为0时继续循环
.Stop:
B Stop
.end @文件结束
3.可重入函数及其解决方法;
- 如果某个函数可被多个任务并发调用而不会造成数据错误,则该函数具有可重入性
- 可重入函数可在任意时刻被中断,稍后继续运行时不会造成错误
- 解决:
- 将全局变量变为局部变量
- 使用信号量操作
- 使用中断处理函数:Disable_IRQ()
4.中断及处理的硬件部分及软件部分;
硬件部分:
- 复制CPSR到SPSR_
- 设置正确的CPSR位
- 切换到
- 保存返回地址到LR_
- 设置PC跳转到相应的异常向量表入口
软件部分:
- 把SPSR和LR压栈
- 把中断服务程序的俱存其压栈
- 开中断,允许嵌套中断
- 中断服务程序执行完后,恢复寄存器
- 弹出SPSR和PC,恢复执行
5.高级语言与低级语言混合编程;
- 汇编代码简洁,采用内联汇编
- 将汇编程序以文件的形式加入到项目中,按照ATPCS过程调用标准
子程序间通过寄存器R0-R3传递参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FTcETynE-1608779280960)(D:\数据可视化\大数据分析学习\图片\image-20201223145818873.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRDe5PBs-1608779280961)(D:\数据可视化\大数据分析学习\图片\image-20201223145828860.png)]
汇编程序调用C程序
- 在汇编程序中使用import伪指令事先声明将要调用的C语言函数
- 通过BL指令来调用c函数
c程序调用汇编程序
- 在汇编程序中使用EXPORT伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用
- 在C程序中使用extern关键字声明要调用的汇编子程序为外部函数
内联汇编:
- 事先一些高级语言不能事先或者不容易事先的功能
- 时间要求紧迫
- 支持大部分ARM指令和Thumb指令
asm(
汇编语句模板
输出部分
输入部分
修改部分(用寄存器保存下来)
)
第五章 开发环境和调试技术
1.宿主机-目标机开发模式;
宿主机:资源丰富
目标机:资源受限
4种链接方式:串口,以太网,USB,JTAG
2.嵌入式软件开发流程;
()为中间得到的结果文件
代码编程(c/汇编源程序)->交叉编译(OBJ文件)->交叉链接(系统映像文件)->重定向与下载到目标板->目标板与宿主机开发平台一起调试
3.交叉编译与本地编译的区别;
- 交叉编译指在一种平台上编译出能在另一种平台(体系结构不同)上运行的程序
- 本地编译在本机平台上编译出能在本机上运行的程序
4.交叉调试与本地调试的区别;
交叉调试 | 本地调试 |
---|---|
调试器和被调试程序运行在不同的计算机上 | 调试器和被调试器运行在同一台计算机上 |
可独立运行 | 需要操作系统的支持 |
被调试程序的装载由调试器完成 | 被调试程序的装载由Loader程序完成 |
需要通过外部通信的方式控制被调试程序 | 不需要通过外部通信的方式来控制被调试程序 |
可以调试不同指令集的程序 | 只能调试相同指令集的程序 |
5.嵌入式开发环境构建;
-
交叉编译环境构建,主从机通信环境构建,交叉调试环境构建
-
交叉开发环境:交叉编译,交叉连接,交叉调试在内的嵌入式应用软件开发环境
6.主从机通信环境构建;
**串口 **
特点及应用场合
- 驱动实现最简单
- 传输速度慢,距离短,不适合大数据量、长距离数据传输
- 需要在宿主机、目标寄两端均提供驱动
- 常用于宿主机-目标机的字符流通讯
网络
- 驱动实现相对复杂,一般采用精简的网络通讯协议
- 常用于宿主机-目标机的 大数据量数据传输,可以作为串口通讯的补充
- 需要在宿主机、目标寄两端均提供驱动
- 宿主机端实现服务器,目标机端提供客户端
- TFTP:简单文件传输协议
- BOOTTP:实现客户端IP地址的获取
USB
- USB接口支持热插拔,即插即用,传输速度快
- 简单易用
- 通常分主从设备端,主机端为主设备段,目标板为从设备端
- 主机端需要安装驱动程序,识别从设备后,可以传输数据
JTAG
- 是一个标准,对具有JTAG接口的芯片硬件电路进行边界扫描和故障检测
文件传输方式
- 串口传输方式
- 网络传输方式
- USB接口传输方式
- JTAG接口传输方式
- 移动存储设备
7.开发环境构建中的仿真技术;
宿主机端的仿真
- 利用虚拟化、仿真化手段建立开发环境
- API仿真器:MinGW
- 虚拟机:VMWare
目标机端的仿真
- 硬件仿真开发
- ROM Emulator:替代目标机上的ROM芯片
- ICE:替代目标机上CPU的设备,支持软断点和硬件断点的设置,设置各种复杂的断点和触发器,实时跟踪目标程序的运行
- OCD:CPU芯片提供的一种调试功能
- 软件仿真开发
- 仿真精度:指令级,周期级,时序级
- 仿真能力:指令集仿真,全系统仿真
- Android仿真器
8.嵌入式交叉开发环境构建;
- 交叉编译器
- 从头编译
- 分别编译和安装工具链所需要的各种库及源代码
- 脚本编译
- 利用Crosstool脚本工具,选择合适的平台,一次性编译生成
- 下载使用
- 最为简单能满足所有人的开发需求
-
交叉汇编器
-
交叉链接器
-
用于处理可执行程序和库的一些基本工具
9.远程调试的方法(stub)及常见的三种方法;
stub:在目标寄OS和宿主机OS分配添加一些功能模块
三种方法:
- ROM Monitor调试目标程序
- KGDB调试系统内核
- gdbserver调试应用程序
GDB Server
- 远程调试类Unix系统下的应用程序
- 通过类Unix系统提供的ptrace系统调用来实现对被调试应用程序的访问和控制
- 无法实现操作系统级的调试,只能实现应用程序级调试
- 应用程序代码无需与调试模块链接就能实现远程调试
10.Linux 内核的三种调试方式;
- Printk:调试内核代码时最常用的技术,在内核代码中加入printk(),可以把所关心的信息打印到屏幕上
- KGDB:提供了一种使用GDB调试Linux内核的机制,可以在内核中进行设置断点、检查变量值、单步跟踪程序运行等操作。使用KGDB调试,需要两台及其,通过串口或网口相连
- 在Linux内核上提供调试器功能补丁
- 开发者需要调试操作系统模块,设备驱动模块
- 使用插桩(stub)技术实现系统级调试,在目标操作系统内核中加入了调试功能模块
- KDB:由SGI公司开发的遵循GPL许可证的linux内核调试程序
第六章 BootLoader技术
1.嵌入式系统启动流程;
- 硬件加电
- 加载引导程序
- Boot代码,Bootloader等
- 操作系统内核,如Linux内核
- 根据特定的目标嵌入式硬件系统,定制的内核及启动参数
- 加载文件系统
- 包括根文件系统以及建立于Flash内存设备上的文件系统
- 运行用户程序
- 用户编写的完成特定功能的程序
- 一些用户程序运行在一个嵌入式图形用户界面上
2.典型引导加载方式;
- PC机上 磁盘启动方式
- BIOS基本输入输出系统,位于硬盘MBR中的OS Boot loader
- BIOS:硬件初始化
- OS Boot Loader:启动操作系统
- LILO
- GNU GRUB
- 动态可配置性
- 高度可移植性
- 丰富的用户接口
- 通过网络下载系统镜像
- 流程
- 系统加电启动时,系统BIOS负责 检测并启动加载控制卡上的BIOS
- BIOS在完成硬件检测后,将硬盘MBR中的 Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader
- Boot Loader的主要运行任务就是将内核映像从硬盘上读到RAM中,然后 跳转到内核的入口点去运行,即开始启动操作系统
- 网络启动
- 目标板由串口,以太网接口或者其他连接方式
- 开发板不需要配置较大的存储介质
- Flash启动方式
- 大多数嵌入式系统都使用Flash存储介质
- NOR Flash:支持随机访问,介质上的代码可以运行
- NAND Flash:价格低,存储容量大,通过专用控制器的I/O方式来访问,不随机访问
3.Boot Loader 概念;
-
在操作系统内核运行之前运行的一段小程序
-
功能
- 初始化硬件设备
- 建立内存空间的映射图
- 调整系统的软硬件环境,以便操作系统内核启动
-
不通用
- 依赖于处理器架构,具体的板级配置,不同的CPU有不同的Boot Loader
Linux系统启动过程
- BootLoader运行阶段
- Linux初始化阶段
- 系统的正常运行阶段
4.BootLoader 操作模式;
-
启动加载模式
- 自主模式是BootLoader的正常工作模式
- 流程
- 从目标机某个固态存储设备上将OS加载到RAM
- 准备好内核运行所需的环境和参数
- 在RAM运行操作系统内核
-
下载模式
- 用户干预进入下载模式,在控制台打印提示信息,等待用户输入
- 流程
- 从主机下载的文件首先被Boot Loader保存到目标机的RAM中
- 被BootLoader写道目标机的FLASH类固态存储设备中,或者直接在RAM中运行
-
通用bootloader一般同时支持两种工作模式
- 比如Blob或UBoot
- 允许用户在这两种工作模式之间进行切换
5.BOOTLOADER 的生命周期;
- 初始化硬件,如检测存储器等
- 设置启动参数,告诉内核硬件的信息,比如用哪个启动界面
- 跳转到操作系统的首地址
- 消亡
6.Boot Loader 的 stage1 与 stage2 主要步骤;
stage1:
-
硬件设备初始化、为加载Boot Loader的stage2准备RAM空间,拷贝Boot Loader的stage2到RAM空间中,设置好堆栈,跳转到stage2的C入口点
-
汇编
-
简单的硬件初始化
stage2
-
初始化本阶段要使用到的硬件设备、检测系统内存映射,将kernel映像和根文件系统映像从flash读到RAM空间中,为内核设置启动参数、调用内核
-
C语言
-
复制数据
-
设置启动参数
-
串口通信等功能
7.典型 Boot loader 的特点及应用场景;(LILO、
GRUB、U-Boot、RedBoot、VIVI、BLOB);
LILO
- 引导Linux操作系统的启动
GNU GRUB
- 允许用户在开机时从多个操作系统选择一个内核镜像启动,并可以向其传递参数
- 动态可配置性
- 高度可移植性
- 丰富的用户接口
- 通过网络下载系统镜像
U-Boot
- 通用引导加载程序
- 对PowerPC系列处理器/对Linux支持最完善
- 功能:系统引导,基本辅助,设备驱动,上电自检功能,特殊功能等等等
- 三类目录
- 处理器体系结构或者开发板硬件直接相关
- 一些通用的函数或者驱动程序
- U-Boot的应用程序、工具或者文档
- 阶段一
- 汇编庇阿涅
- 通常与CPU紧密相关
- 初始化CPU
- 初始化相关设备
- 在start.s文件中实现
- 阶段2
- C语言编写
- 初始化
- 进入命令循环
- 加载操作系统内核
RedBoot
- 以eCos为基础的引导程序
- 为 **管理FLASH映像,映像下载,Redboot配置以及其他如串口、以太网口提供了一个交互式命令行接口
VIVI
- 为S3C24XX处理器引导Linux
- 由韩国Mizi公司开发
- 适合于ARM9处理器
BLOB
- MIPS公司开发的
第七章 ARM-Linux内核
- 常见嵌入式 Linux 的特征;
- uCLinux
- 专门针对微控制领域设计的Linux系统
- 专门针对没有MMU的处理器设计
- RT-Linux
- 源代码开放的具有硬实时特性的多任务操作系统
- 航天飞机的空间数据采集,科学一起测控和电影特技图像处理等领域
- 红旗嵌入式Linux
- 精简内核
- 完善的嵌入式GUI和嵌入式X-Windows
- 提供嵌入式浏览器,邮件程序和多媒体播放程序
- 提供完善的开发工具和平台
2. Linux 内核的特点;
- 采用单内核体系结构,使用模块机制
- 不支持完全意义上的用户态线程,用进程共享上下文实现LWP机制
- 内核可抢占,允许在内核执行的任务优先执行
- 支持堆成多出力
- 自由
- Linux 内核的组成;
- 进程调度程序(SCHED)
负责控制进程访问CPU,保证进程能够公平的访问CPU,同时保证内核可以准时执行一些必需的硬件操作
- 内存管理系统(MM)
是多个进程可以安全的共享机器的主存系统,并支持虚拟内存
- 虚拟文件系统(VFS)
通过提供一个所有设备的公共接口,VFS抽象类不同硬件设备的细节
- 网络接口(NET)
提供对许多建网标准和网络硬件的访问
- 进程间通信(IPC)
子系统为进程和进程间通信提供了一些机制
- 内核源代码目录结构;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zSZBfKZg-1608779280961)(D:\数据可视化\大数据分析学习\图片\image-20201223182520062.png)]
主要功能模块:初始化,内存管理,进程调度,进程间通信,中断处理,设备驱动,文件系统,网络通信,模块编程,其他
5. 内核的裁剪;
-
解压源代码
-
配置内核
-
编译内核和模块
-
配置启动文件
-
内存管理主要工作;
地址映射,内存空间分配,地址保护机制
ARM7及以下不支持MMU
ARM9及以上支持MMU
任务:屏蔽各种硬件的内存结构并向上层返回同一的访问接口
- MMU 主要作用;
用一组寄存器实现:地址映射;地址访问保护与限制
8. 内核空间与用户空间;
内核空间:Linux内核的运行空间
用户空间:用户程序所在的空间
内核空间可以执行任意命令,调用系统的一切资源;
用户空间只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(又称 system call),才能向内核发出指令
- 物理内存空间的管理;
Linux对物理内存空间按照分页方式进行管理,把物理内存划分成大小相同的物理页面
10. 虚拟内存实现机制间的相互关系;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-drHwgjGI-1608779280962)(D:\数据可视化\大数据分析学习\图片\image-20201223183844124.png)]
进程控制块PCB
task_struct:进程标示符,状态,优先级,程序计数器,内存指针,上下文数据,I/O状态信息,记账信息
13. Linux 进程状态转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KK8a7BIk-1608779280962)(D:\数据可视化\大数据分析学习\图片\image-20201223184139569.png)]
fork():通过系统调用创建一个与原来进程几乎完全相同的进程,父进程返回进程ID,子进程返回0,错误返回负值
Unix进程创建:
- fork():通过拷贝当前进程创建一个资金车工
- exec():负责读取可执行文件将其载入地址空间运行
写时拷贝:推迟甚至免除拷贝数据的技术,只有在需要写入的时候,,数据才会被赋值,从而使各个进程拥有各自的拷贝
进程终止:正常的进程结束,通过信号,exit函数的调用
孤儿进程:父进程提前退出,子进程在退出时永远处于僵死状态
- Linux 进程的调度(调度时机、依据及策略);
调度时机:
- 进程状态转换:进程终止,进程睡眠等
- 当前进程的时间片用完时
- 设备驱动程序
- 进程从中断,异常及系统调用返回到用户态时
调度依据:
普通进程和实时进程,进程优先级,实时进程优先级
进程调度策略:
- SCHED_OTHER 分时调度策略
- SCHED_FIFO 实时调度策略,先到先服务
- SCHED_RR 实时调度策略,时间片轮转
动态优先级+轮转法+分时调度
16. ARM-Linux 模块机制;
内核模块是一种没有经过链接,不能独立运行的目标文件,是在内核空间中运行的程序。经过链接装载到内核里面成为内核的一部分,可以访问内核的公用符号(函数和变量)
内核模块可以让操作系统内核在需要时载入和执行,在不需要时由操作系统卸载。它们扩展了操作系统内核的功能却不需要重新启动系统
如果没有内核模块,我们不得不一次又一次重新编译生成单内核操作系统的内核镜像来加入新的功能。
Linux支持动态可加载内核模块
模块的编译需要配置过的内核源码,生成的内核模块后缀为.ko
可根据需要动态加载/卸载,载入内核后,便为内核的一部分,与其他部分地位一致
内核更加模块化
配置更加灵活
Linux的模块主要由6部分组成:
1.模块的加载函数(必须)
2.模块的卸载函数(必须)
3.模块许可证(LICENSE)
4.模块参数(可选)
5.模块导出符号(可选)
6.模块作者等信息声明(可选)
内核模块相关命令:
lsmod:列出内核已载入模块的状态
insmod:向Linux内核添加删除模块
rmmod:删除内核中的一模块
modprobe:Linux内核添加删除模块
depmod:分析可加载模块的依赖性,生成modules.dep文件和映射文件
modinfo:显示内核模块的信息
- ARM-Linux 中断管理;
中断处理:中断响应,中断处理,中断返回
ARM将中断控制器集成在CPU内部,由外设产生的中断请求都由芯片上的中断控制器汇总成一个IRQ中断请求
中断控制器向CPU提供一个中断请求寄存器和中断控制寄存器
- ARM-Linux 系统调用
实现:封装C库调用,直接调用
- 保存当前运行的信息
- 根据系统调用号查找相应的函数去执行
- 恢复原先保存的运行信息返回
第八章 嵌入式文件系统
1.嵌入式文件系统设计目标
- 使用方便
- 安全可靠
- 实时响应
- 接口标准的开放性和可移植性
- 可伸缩性和可配置性
- 开放的体系结构
- 资源有效性
- 功能完整性
- 支持热插拔
- 支持多种文件类型
2.常用的嵌入式文件系统
本地文件系统:
- FAT
- EXT2
- JFFS2
- YAFFS
网络文件系统
- Samba
- NFS
3.Linux 常见文件系统
windows下一切皆设备
-:普通文件,b:块设备文件,c:字符设备文件,d:目录,l:链接文件,p:命名管道文件,s:本地套接口
ext2,ext3,ext4,XFS和Btrfs。
-
XFS和Btrfs都使用了B-tree,
-
ext2文件系统所有数据块被划分成若干个分许,每个组包含相同个数的数据块。
-
ext3在ext2的基础上实现了支持日志,自动扩展,目录下的文件和子目录数不再受性能限制。数据安全性提高,目录下的文件和子目录数不再受性能限制
-
ext4文件系统容量、性能、扩展性、安全都得到了进一步提高。
- Linux默认的文件系统,inode数量固定,小文件过多会导致inode用光
- 一次分配多个数据块
- 支持在线快速扫描,支持在线碎片整理
- 日志支持校验码
- 支持纳秒级的时间戳等等
-
xfs支持的文件和分区大,动态分配。
- 支持的最大文件和分区都达到了8EB
- inode动态分配,从而不受inode数量的限制
-
Btrfs支持的文件和分区更大,支持备份和恢复等。
基于4K的块大小
文件系统 | 最大文件名长度 | 最大文件大小 | 最大分区大小 |
---|---|---|---|
ext2 | 255bytes | 2TB | 16TB |
ext3 | 255bytes | 2TB | 16TB |
ext4 | 255bytes | 16TB | 1EB |
XFS | 255bytes | 8EB | 8EB |
Btrfs | 255bytes | 16EB | 16EB |
文件系统 | 适用场景 | 原因 |
---|---|---|
ext2 | U盘 | U盘一般不会存很多文件,且U盘的文件在电脑上有备份,安全性要求不高。ext2的兼容性没有fat好,大部分U盘格式使用fat |
ext3 | 对稳定性要求高的地方 | 没ext4好,只是ext4还不稳定 |
ext4 | 小文件较少 | ext系列的文件系统都不支持inode动态分配,如果有大量小文件需要存储,不建议使用ext4 |
xfs | 小文件多或者需要大的xttr空间 | xfs支持inode动态分配,所以不存在inode不够的情况,xttr的最大长度可以达到64k |
btrfs | 没有频繁的写操作,且需要dbtrfs的一些特性 | btrfs虽然还不稳定,但是支持众多的功能,如果需要这些功能并且不会频繁的写文件,选择btrfs |
4.Linux 虚拟文件系统
proc是一个虚拟文件系统,只存在于内存中,通过它可以查询,设置系统的运行情况级各种系统参数。
lsmode==cat /proc/modules
/proc下的**“数字目录”指代了相应pid的进程**
5.NOR 型闪存与 NAND 型闪存的特点
Flash设备的特性:主要依靠储存电荷保存数据,具有抗机械正东、轻巧、紧凑、节能等良好特性。
问题:损耗均衡,坏块处理问题,掉电保护问题
Flash类型:NAND,NOR,DINOR,AND。
- NOR:作为EEPROM的替代品设计
- NOR:
- 具有独立的地址线、数据线,支持快速随机访问,容量较小;
- 具有芯片内执行的功能,按照字节进行随机写;适合存储少量的可执行代码。
- NAND:专门为数据存储而设计,
- NAND:
- 地址线、数据线共用,单元尺寸比NOR小,具有更高的价格容量比,达到高存储密度和容量;
- 读、写操作单位采用512字节的页面;
- 更适合作为高密度数据存储
6.NAND 闪存管理中的问题
- 损耗均衡:闪存上的每个块都具有擦除次数的上线
- 坏块处理问题:NAND器件的坏块是随机分布的,使用NAND器件的初始化阶段进行扫描以发现坏块,并家当坏块标记为不可用
7.常见的 FLASH 文件系统
- 日志文件系统
- 采用数据库系统中日志的概念;
- 对数据的更新采用前向写入
- 通过检查点、回滚技术等可以将数据恢复到某时刻的一致状态
- Jffs2
- 主要用于NOR型闪存,基于MTD驱动层
- 可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护提供写平衡支持等;
- 用该类的方法很难保证磨损均衡的确定性
- yaffs/yaffs
- 是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统;
- 自带NAND芯片的驱动
- CRAMFS
- 简单,压缩,只读;
- 将文件数据以压缩形式存储,在需要运行的时候进行解压缩,调用到RAM
- ROMFS
- 支持的、紧凑的、只读的文件系统,不支持动态间歇保存,按顺序存放数据,支持应用程序以XIP方式运行
- 不能直接在Flash上运行
8.常见的 RAM 文件系统
Ramdisk:
-
将一部分固定大小的内存当作分区来使用
-
经常被访问不会被更改的文件;
ramfs/tmpfs:
-
工作于虚拟文件系统(VFS)层
-
存储一些临时性或经常要修改的数据
-
不能格式化,文件系大小可随所含文件内容大小变化
9.网络文件系统
通过TCP/UDP对NFS Client和NFS Server进行通信
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HjMGDTh4-1608779280963)(D:\数据可视化\大数据分析学习\图片\image-20201224093328320.png)]
10.根文件系统的作用及目录结构
根文件系统是内核启动所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在跟文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中运行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8s7Xqg2-1608779280964)(D:\数据可视化\大数据分析学习\图片\image-20201224093926470.png)]
目录 | 内容 |
---|---|
bin | 必要的用户命令 |
sbin | 必要的系统管理员命令 |
usr | 大多数用户使用的应用程序和文件目录 |
proc | 提供内核和进程信息的proc文件系统 |
dev | 设备文件及其他特殊文件 |
etc | 系统配置文件 |
lib | 必要的链接库 |
*boot | 引导加载程序使用的静态文件 |
*home | 用户主目录 |
mnt | 临时挂在的文件系统的挂载点 |
*opt | 附加软件的安装目录 |
*root | root用户主目录 |
tmp | 临时文件目录 |
var | 监控程序和工具程序存放的可变数据 |
Linux跟文件系统包含文件:
- 链接库lib
- 设备文件dev
- 手动建立/dev条目
- 使用devfs自动建立/dev条目
- 使用udev自动建立/dev条目
- 系统应用程序(各种命令)busybox
- 系统初始化文件init
- 从主机拷贝
- 用busybox的代码
11.如何创建根文件系统
1.将交叉编译器内的库文件拷贝到对应的lib目录下
2.建立/dev目录
3.下载系统应用程序
4.创建并执行系统初始化文件
一、编译busybox
- 下载busybox源码,修改Makefile
- make menuconfig, Busybox Setting–>Build Opdions–>选择[]Build BusyBox as a static binary(no shared libs)使用静态编译
- make报错,进入make menuconfig,在菜单中Networking Utilities–>Support RPC serverces取消选择,再次make:
- make,产生install文件;make install,产生文件夹_install
二、制作根文件系统目录
- 在主目录下执行:
mkdir rootfs
cd rootfs
//建立目录结构
mkdir bin etc dev lib proc tmp root home sys usr sbin var mnt
//运行库-来自工具链
cp -a /usr/arm-linux-gnueabi/lib/* lib
//busybox工具集
cp -a /home/gantang/busybox-1.21.0/_install/* .
//设备文件
sudo cp -a /dev/console /dev/loop0 /dev/loop1 /dev/null /dev/ram0 /dev/tty /dev/tty0 /dev/tty1 /dev/tty2 /dev/zero dev
- 修改mdev配置,mdev负责自动生成设备节点。mdev.conf是配置文件
vim etc/mdev.conf
- 修改启动配置
vi etc/init.d/rcS
第九章 嵌入式驱动设计
1.外部设备与 CPU 的通讯信息;
- 控制信息:告诉要进行什么处理
- 状态信息:当前设备的状态
- 不同的设备,传输数据类型及编码各异
2.输入、输出方式控制;
- 直接控制I/O方式:通过指令直接对端口进行输入、输出控制
- 内存映射方式:可以访问较大的地址空间,实现快速数据交换
- 中断方式:采用中断实现数据的输入/输出
- DMA方式:采用DMA控制器,实现数据传输
- 数据量不大,如字符设备,采用中断方式
- 大量数据传输的I/O设备,如磁盘,网卡灯,采用DMA方式,减少CPU资源占用
3.什么是驱动程序;
设备驱动程序是操作系统中唯一知道控制器有几个寄存器及它们用途的程序
4.驱动程序与应用程序的区别;
- 主动与被动的区别
- 应用程序有一个main函数,总是从这些函数开始主动执行一个任务,二驱动程序安装之后,便停止工作,并等待被应用程序调用
- 使用的库函数不同
- 程序运行的区域不同。驱动程序工作在内核态,应用程序工作在用户态
5.设备分类;
- 字符设备:无需缓冲直接读写
- 块设备
- 通过buffer或cache进行读写
- 支持块的随机访问
- 网络设备:通过BSD套接口访问
6.设备文件和设备号之间的关系;
每个设备文件对应两个设备号
- 主设备号,表示设备的种类,使用的驱动程序
- 次设备号,标识使用同一设备驱动程序的不同硬件设备
7.Linux 设备驱动的特点;
- 核心代码
- 核心接口
- 核心机制
- 动态客家在
- 可配置
**8.设备文件接口(**file operation);
-
抽象接口,驱动程序里面去实现需要的接口
-
Linux应用程序可以通过设备文件的一组固定的入口点来访问驱动程序,这组入口点是由每个设备的设备驱动程序提供的
-
系统试图使它对各类设备的输入输出看起来像是对普通文件一样,把设备映射为一种特殊的文件
9.字符设备驱动框架;
- 字符设备驱动程序是嵌入式Linux最基本,最常用的驱动程序
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A2WFZozz-1608779280964)(D:\数据可视化\大数据分析学习\图片\image-20201224105927239.png)]
10.file结构体与inode之间的关系;
- file结构体:打开文件,在内核空间创建的文件描述符
- inode:文件的索引节点
- 在内核中inode结构体用来标识文件,file是标识打开文件的结构体
11.cdev 结构体与其操作函数;
- 字符设备在linux内核中使用struct cdev结构表示
12.分配和释放设备号;
-
在使用cdev_add()向系统注册字符设备之前应先申请设备号
-
已知设备号:int register_chrdev_region(dev_t from,
unsigned count, const char *name);
-
未知设备号:int alloc_chrdev_region(dev_t *dev,
unsigned baseminor, unsigned count, const char *name);
-
使用上面两种方式申请的设备号,都应该在不使用设备时,释放设备号。设备号的释放统一使用下面的函数:
-
void unregister_chrdev_region(dev_t from, unsigned count);
13.内核空间与用户空间之间复制数据的方法;
- 在用户空间不能直接访问内核空间的内存,借助两个函数,分别用来把数据从用户空间拷贝到内核空间,以及把数据从内核空间拷贝到用户空间
#从用户态拷贝到内核态:
unsigned long copy_from_user(void *to, const void _user* from, unsigned long count);
#从内核态拷贝到用户态:
unsigned long copy_to_user(void _user* to, const void *from, unsigned long count);
指令直接对端口进行输入、输出控制
- 内存映射方式:可以访问较大的地址空间,实现快速数据交换
- 中断方式:采用中断实现数据的输入/输出
- DMA方式:采用DMA控制器,实现数据传输
- 数据量不大,如字符设备,采用中断方式
- 大量数据传输的I/O设备,如磁盘,网卡灯,采用DMA方式,减少CPU资源占用
3.什么是驱动程序;
设备驱动程序是操作系统中唯一知道控制器有几个寄存器及它们用途的程序
4.驱动程序与应用程序的区别;
- 主动与被动的区别
- 应用程序有一个main函数,总是从这些函数开始主动执行一个任务,二驱动程序安装之后,便停止工作,并等待被应用程序调用
- 使用的库函数不同
- 程序运行的区域不同。驱动程序工作在内核态,应用程序工作在用户态
5.设备分类;
- 字符设备:无需缓冲直接读写
- 块设备
- 通过buffer或cache进行读写
- 支持块的随机访问
- 网络设备:通过BSD套接口访问
6.设备文件和设备号之间的关系;
每个设备文件对应两个设备号
- 主设备号,表示设备的种类,使用的驱动程序
- 次设备号,标识使用同一设备驱动程序的不同硬件设备
7.Linux 设备驱动的特点;
- 核心代码
- 核心接口
- 核心机制
- 动态客家在
- 可配置
**8.设备文件接口(**file operation);
-
抽象接口,驱动程序里面去实现需要的接口
-
Linux应用程序可以通过设备文件的一组固定的入口点来访问驱动程序,这组入口点是由每个设备的设备驱动程序提供的
-
系统试图使它对各类设备的输入输出看起来像是对普通文件一样,把设备映射为一种特殊的文件
9.字符设备驱动框架;
- 字符设备驱动程序是嵌入式Linux最基本,最常用的驱动程序
[外链图片转存中…(img-A2WFZozz-1608779280964)]
10.file结构体与inode之间的关系;
- file结构体:打开文件,在内核空间创建的文件描述符
- inode:文件的索引节点
- 在内核中inode结构体用来标识文件,file是标识打开文件的结构体
11.cdev 结构体与其操作函数;
- 字符设备在linux内核中使用struct cdev结构表示
12.分配和释放设备号;
-
在使用cdev_add()向系统注册字符设备之前应先申请设备号
-
已知设备号:int register_chrdev_region(dev_t from,
unsigned count, const char *name);
-
未知设备号:int alloc_chrdev_region(dev_t *dev,
unsigned baseminor, unsigned count, const char *name);
-
使用上面两种方式申请的设备号,都应该在不使用设备时,释放设备号。设备号的释放统一使用下面的函数:
-
void unregister_chrdev_region(dev_t from, unsigned count);
13.内核空间与用户空间之间复制数据的方法;
- 在用户空间不能直接访问内核空间的内存,借助两个函数,分别用来把数据从用户空间拷贝到内核空间,以及把数据从内核空间拷贝到用户空间
#从用户态拷贝到内核态:
unsigned long copy_from_user(void *to, const void _user* from, unsigned long count);
#从内核态拷贝到用户态:
unsigned long copy_to_user(void _user* to, const void *from, unsigned long count);