目录
嵌入式系统概述
第一节 嵌入式系统概念
嵌入式系统一般定义:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统
嵌入式系统的组成:像一般的计算机系统包括软件和硬件一样,嵌入式系统是由嵌入式硬件(包括存储器、嵌入式处理器、输入输出接口)和嵌入式软件(包括嵌入式操作系统、应用程序)组成
嵌入式系统的特点:1.适应不同的应用场合,个性化很强,软件一般要针对硬件进行移植,追求的是专用而不是通用,这也是嵌入式系统开发周期较长的根本原因;2.一般工作在资源有限的环境中,对功耗、体积等都有着特定的要求,其功能的设计及实现一般不会太复杂;3.应用场合多种多样,功能纷繁复杂,无法按照某一标准定制;4.通常有各自专门的开发工具和环境;5.应用软件很多时候会和操作系统结合在一起,对代码质量和效率要求很高;6.使用嵌入式操作系统,而嵌入式操作系统通常要求内核小、可裁剪、多任务,一些应用场合还对可靠性实时性有着极高的要求
第二节 嵌入式系统与台式计算机
硬件平台比较
名称 | 嵌入式系统 | 台式计算机 |
CPU | ARM等嵌入式处理器 | Intel,AMD 的X86处理器 |
内存 | SDRAM芯片 | 内存条 |
存储设备 | Flash/eMMC芯片 | 硬盘或固态盘 |
输入设备 | 按键,触摸屏 | 鼠标,键盘 |
输出设备 | 通常为LCD | 显示器 |
声音设备 | 音频芯片 | 声卡 |
接口 | MAX3232等芯片 | 主板集成 |
其它设备 | USB及网络等芯片 | 主板集成或外接卡 |
软件平台比较
名称 | 嵌入式系统 | 台式计算机 |
引导代码 | Bootloader引导, 针对电路移植 | 主板的BIOS引导,无须改动 |
操作系统 | Linux,WinCE,VxWorks等, 需要移植 | 一般为Windows, 不需要移植 |
驱动程序 | 每个设备驱动程序都必须针对电路板进行重新开发或移植,一般不能直接下载使用 | 操作系统含有大多数驱动程序, 或从网上下载直 接使用 |
协议栈 | 需要移植 | 操作系统或第三方提供 |
开发环境 | 借助主机进行交叉编译 | 在本机就可开发调试 |
仿真器 | 通常需要 | 不需要 |
第三节 嵌入式系统与单片机
嵌入式系统的定义中没有必须使用操作系统的明确要求,这使得一种特殊的计算机系统被独立出来,即应用软件直接运行在硬件之上的不使用操作系统的单片机系统。3种传统单片机:51系列单片机、PIC系列单片机、AVR系列单片机
硬件平台比较
名称 | 嵌入式系统 | 单片机 |
硬件平台 | 厂家提供通用的硬件平台 | 自己设计制作硬件平台 |
硬件设计 | 以硬件平台为基础裁剪和扩展 | 重新设计 |
CPU | 一般为32位 | 多为8位和16位 |
MMU(内存管理单元) | 支持 | 不支持 |
功能 | 能够实现复杂功能 | 难于实现复杂功能 |
开发人员 | 主要为计算机专业人员 | 硬件设计人员 |
仿真器 | 通常初始化需要,以后可不用 | 全程使用 |
仿真头 | 不需要 | 需要 |
软件平台比较
名称 | 嵌入式系统 | 单片机 |
开发平台 | 主机上相匹配的操作系统 | 主机上的仿真软件 |
功能 | 相对复杂 | 通常比较简单 |
运行环境 | 嵌入式操作系统 | 直接运行在硬件上 |
编程语言 | C、JAVA及框架 | C、汇编 |
协议支持 | 嵌入式操作系统提供,如USB协议和网络协议,移植后使用 | 自己实现 |
驱动程序 | 操作系统提供大部分驱动 | 自己实现 |
调试 | 交叉编译,操作系统环境调试 | 专门的仿真软件在线调试 |
嵌入式处理器
第一节 从传统处理器到片上系统
基于IP核的片上系统(SoC):IP Core(知识产权核 Intellectual Property Core),分为软核(以硬件描述语言编写的程序形式提供给用户)和硬核(以硬件原理图与板图的形式提供给用户);SoC是一种基于IP核的嵌入式系统设计技术,一个MPU或DSP核心与其它功能模块在处理器芯片内部形成系统,构成SoC处理器
第二节 嵌入式处理器之ARM
ARM7/9/11系列处理器是传统的ARM处理器,ARM7通常没有MMU,适用于低端应用,ARM11带有多媒体支持,适用于高端应用,ARM9介于二者之间;定位高端的ARM Cortex-A系列用于高性能的开发应用平台,面向尖端的基于虚拟内存的操作系统和用户应用,特点是具有mmu和cache,高频,高性能,高功耗;定位低端的ARM Cortex-M系列用于单片机风格系统,是针对低功耗的微控制器,特点是没有任何ram等记忆硬件,低能,低耗,目前正逐步取代传统单片机
ARM:一个公司的名字;一类微处理器的通称;一种技术的名字
ARM处理器特性:含有Java加速器Jazelle;支持DSP指令;可提供SIMD功能;支持16位指令集Thumb
第三节 嵌入式处理器与X86
在嵌入式系统中可以直接使用x86计算机的部分或全部硬件
比较
比较点 | 嵌入式处理器 | X86 |
应用 | 特定应用 | 家用PC、笔记本、服务器 |
组成 | ALU、MMU、片内Cache, 集成网卡、USB等控制器 | ALU、MMU、片内Cache, 片内资源有限,其他功能需 要扩展 |
指令系统 | RISC | CISC |
I/O编址方式 | 统一编址 | 独立编址 |
系统存储 | Flash/eMMC,启动后全部加载 | 硬盘,需要时调入内存 |
软件 | 面向特定需求,小,精简 | 多样,复杂,全面 |
产品使用 | 嵌入设备中自动完成 | 通过人机交互实现 |
关联 | X86常作为嵌入式系统的开发主机 |
第四节 其它嵌入式处理器
MIPS公司既开发MIPS处理器结构,又生产MIPS芯片
总的来说,MIPS有更多的寄存器,而ARM有更多的寻址方式,相对ARM和MIPS,PowerPC处理器更高端,价格要贵一些
嵌入式操作系统
第一节 实时操作系统
执行的正确性不仅取决于计算的逻辑结果,而且还取决于结果的产生时间。根据对外界事件做出反应的时间不同分为如下:
硬实时系统:必须对事件做出及时的反应,绝对不能错过事件处理的时限,比如说航天飞机的控制系统,如果出现故障,后果不堪想象
软实时系统:在系统负荷较重的时候,允许发生错过时限的情况而且不会造成太大的危害,如液晶屏刷新允许有短暂的延迟
嵌入式系统的实时性:在嵌入式系统中,实时性的实现依赖于嵌入式操作系统,通常所有的操作系统都可以看作是支持软实时的,实时操作系统和非实时操作系统的区别在于能否支持硬实时系统。 具体到操作系统的实现上,非实时操作系统采用基于优先级的调度算法,着重于提供高速响应和大吞吐量;实时操作系统使用的是调度方式简单,反应速度快的实时调度算法。实时操作系统的首要任务是调度一切可利用的资源完成实时控制任务,虽然事件可能在无法预知的时刻到达,但是实时操作系统必须在事件随机发生时,在严格的时限内做出响应。实时操作系统即使工作在尖峰负荷下,也要保持实时性,响应超时就意味着致命的失败
第二节 完整的有交互能力的嵌入式操作系统
通常,与台式计算机中的操作系统一样,嵌入式操作系统有着类似的使用模式---首先要在嵌入式系统中安装嵌入式操作系统和相应的根文件系统,然后再使用嵌入式操作系统提供的用户接口(shell)下载和运行应用程序,完成特定功能
这种嵌入式操作系统有2个不可或缺的特性:
- 要单独安装独立运行
- 提供了用户接口
第三节 与应用程序一体化的嵌入式操作系统
这种与应用程序一体化的嵌入式操作系统,相对比较简单,如uC/OS和QNX等,特点如下:
- 不需要单独安装独立运行
- 不存在提供交互能力的用户界面(Shell)
- 操作系统和应用程序一起形成最终可执行程序,两位一体
- 和单片机系统一样通过仿真器及配套软件进行开发调试
在这种嵌入式操作系统上开发程序,操作系统是”看不见”的,在程序员眼中,这只是一些支持多任务的API函数
这种操作系统内部缺乏通用的硬件驱动程序支持,程序员需要自己编写直接基于硬件的驱动程序,难以得到操作系统的支持;这种操作系统通常都是实时的抢占式的,代码体积小,速度快,适合无存储管理的低配置硬件上的简单应用,相当于单片机系统的进阶模式
第四节 嵌入式操作系统之Linux
Linux不是一个实时操作系统,如果面向实时应用,则必须进行实时性改造
主要特性:
- 完全免费,可以任意修改代码,兼容POSIX1.0标准,可以方便地获得第三方软硬件厂商的支持,驱动程序及其它资源丰富
- 有大量的且不断增加的开发工具,这些工具为嵌入式系统的开发提供了良好的开发环境
- 有完善的网络支持,适应物联网时代
- 可以运行在多种硬件平台上,易于定制裁剪,支持包括x86在内的几乎所有CPU芯片,可以运行在掌上电脑、机顶盒或游戏机上
- 内核小、功能强、稳定健壮、效率高、多任务,作为嵌入式开发的基础平台,还可拓展,安卓就是Linux的拓展
- 包含嵌入式浏览器、邮件程序、MP3播放器、MPEG播放器和记事本等丰富的应用程序
嵌入式系统开发模式
第一节 计算机系统开发模式之单片机
传统单片机系统的开发采用的是“主机+仿真器+仿真头+自制硬件”模式
如上图,要先进行硬件系统开发设计,自己制作硬件。而后在主机(PC)上编写C语言或者汇编语言程序,为单片机系统进行软件的开发调试。如果硬件平台设计发生错误,则需要重新开始这个过程。软件通常都比较简单,一般由单片机硬件的设计者自己编写,软件开发环境由主机上的仿真软件提供,调试程序时要下载到自制的目标板上的内存,仿真运行,调试好的程序最终要经过烧写固化
单片机系统开发的设计难点主要在于硬件平台可能要经过不止一次的设计和实现
第二节 嵌入式系统开发模式
- “主机+仿真器+硬件平台” 模式(一些新的嵌入式硬件平台不再提供仿真器,而是使用SD卡或USB接口)
- “主机+硬件平台”模式
完整的嵌入式操作系统:初始化时一般需要通过仿真器向硬件平台下载嵌入式操作系统的启动加载程序Bootloader,在通过Bootloader安装了嵌入式操作系统之后,就不再需要仿真器了,只需要利用网络通信(有时也可以利用USB或串口),下载或通过网络文件系统在目标机上运行程序
与应用程序一体化的操作系统:开发时使用的是仿真器提供的开发环境,这时在整个开发过程中仿真器不可或缺。这种方式除了自制硬件平台被通用硬件平台代替外,与单片机系统开发类似
与单片机开发相比:嵌入式系统把开发者从反复进行的硬件平台设计过程中解放出来,从而把主要精力放在编写特定的应用程序上;嵌入式操作系统屏蔽掉了底层硬件的很多复杂信息,通过操作系统API可以完成大部分工作,类似于在PC机上的某个操作系统下开发程序
与PC相比:在开发环境上会有一些弱化,并增加了一个交叉编译环节,但整体上属于PC类的开发模式,而不是单片机的开发模式。嵌入式系统开发者的主要任务是在主机上编写基于操作系统的程序,然后通过交叉编译的方式,在嵌入式操作系统环境下调试和运行
第三节 嵌入式系统开发模式之个人移动设备
个人移动设备,即PMD(Personal mobile device) ,是指一类带有多媒体用户界面的无线设备,比如手机、平板电脑等。类似iphone的手机被称为智能手机,PAD摆脱了电脑作为开发者开发平台的最后一点痕迹,已经成为一个纯粹的应用平台
传统的嵌入式系统通常是不支持二次开发的,而PMD已经拥有了独立的应用平台,允许第3方软件的运行,而传统的嵌入式系统则不能
PMD开发模式:PMD有单独的操作系统平台,使用与一般嵌入式系统类似的操作系统环境(Linux、类UNIX) ;PMD的开发模式同样为主机-目标机模式;PMD并不象PC一样作为开发环境被使用,它仅是一个应用平台而不是开发平台
PMD的操作系统平台主要有2种:IOS是苹果公司不开源的平台;而Android平台是开源的,包括内容提供器、资源管理器、通知管理器和活动管理器,系统构架包括应用程序层、应用程序框架层、系统运行库层和Linux内核层,其开发基于Java语言
嵌入式系统硬件平台概述
第一节 整体构架
台式计算机硬件平台整体构架:逻辑部件包括处理器,存储器,多个输入输出接口和输入输出设备, 处理器和存储器直接挂在总线上,I/O设备通过I/O接口接入总线,各司其职,基本没有功能上的交叉,如下图所示
嵌入式系统硬件平台整体构架:嵌入式处理器内部带有存储器、NandFlash及LCD等I/O接口,可以直接连接这类外设,一些接口甚至连同外设一起被集成到芯片内部,如看门狗(watchdog),实时时钟(RTC)等,如下图所示
嵌入式处理器内部有了独立的嵌入式处理器内核,有了一些被称为“控制器”的I/O接口。在处理器内部,这些部件通过内部总线连接起来,就象计算机系统一样,这正是片上系统SOC含义所在,由于其中每个部件都是一个独立的IP核,也清楚地说明了SOC是基于IP核技术的
由于嵌入式处理器内部提供了常用的I/O接口,很多外部I/O设备就可以直接与处理器相连,形成了“处理器+外设”的嵌入式系统的硬件结构。一方面简化了系统的构建,降低硬件设计工作量;另一方面结构伸缩性强,可以适应嵌入式系统领域应用的多样性
第二节 两类嵌入式主机板
主机板:指台式计算机中把各部件连接到一起的印刷电路板
对于嵌入式系统,其主机板通常就是不含外设的嵌入式系统,嵌入式处理器、NandFlash和内存通常都直接作为主机板的一部分,只留有与外部I/O设备的接口。嵌入式主机板通常是能构成完整嵌入式系统的不可分割一块线路板,分为一体式主机板和核心式主机板
一体式主机板:裁剪掉实际应用中不需要使用的多余功能,形成一个整体,嵌入到设备中使用。有固定的功能和应用领域,更具专用性,一般不需要再改变,适合在有一定批量和通用性的嵌入式产品中使用,如PMD主机板就是这种类型的代表
核心式主机板:只包含核心硬件,相当于基于嵌入式处理器的最小系统,使用时通过外围板扩展功能。实际嵌入到设备时,在核心板不变的请况下,通过搭配不同外围板实现嵌入式系统的不同应用需求,核心式主机板适用于需要二次开发的场合,与主机板配套的外围板可以由厂家提供,也可自行开发
核心式主机板的印制板一般为6~10层板,尺寸为名片大小,总线通过外部接口引出。核心主机板完成了嵌入式系统中设计和布线最复杂的部分,大大简化了外围板的设计难度。 除了包含嵌入式处理器外,一般还配有内存、电子盘、常用设备和总线接口
第三节 编程模式
片内接口:片内接口的编程通过操作嵌入式处理器内部一组特殊寄存器的完成,称为特殊功能寄存器SFR(三星处理器约定称谓),片内接口的使用按照嵌入式处理器规定好的方式进行
片外接口:外部接口则与外部总线相连,通过端口进行操作,片外接口使用方式按照外部接口采用的接口芯片或电路进行,片外接口的使用按照片外接口芯片的数据手册及片外接口电路进行
第四节 可配置的引脚
嵌入式处理器采用复用引脚,每个引脚都有多个功能,只在需要时才配置成对应功能
GPIO引脚:最简单的外设就是开关量装置,通常嵌入式系统中可配置的复用引脚功能中至少都包含有通用目的的输入输出(GPIO) 。这种引脚被称为GPIO引脚,在不需要设置为其它专用外设引脚的时候,至少可以配置为使用量最大的输入和输出功能,以利于充分利用引脚资源
基于IMX6的最小系统
第一节 IMX6处理器
相关电路了解
第二节 主存储器
如下图一个实际的IMX6与存储芯片的连接
第三节 辅助存储器
Flash和EEPROM比较:Flash和EEPROM都是常用的非易失性存储技术,但Flash的容量远远超过EEPROM,二者的最主要的区别还是在读写特性上---Flash在写入之前,必须要经过擦除(erase)操作,而且擦除只能以块(block)为单位,整块擦除,即使要修改一个字节的数据,也需要擦除整个块的内容;而EEPROM是可以逐字节修改的
NandFlash与NorFlash比较:
NandFlash | NorFlash |
擦除时数据变为0xFF,写入时只能由1变0 | 擦除时数据变为0x00,写入时只能由0变1 |
读速度不如Norflash,而擦、写速度高,容量大,价格低,有取代磁盘的趋势 | 读速度高,而擦、写速度低,容量小,价格高 |
使用地址和数据引脚构成通用的I/O口,通过多次寻址存取数据,其读和写操作以512(或者2K)字节的页(page)为单位 | 接口时序与SRAM一样,其地址、数据及读写控制引脚能与CPU的三总线直接连接,就可以很容易地存取其内部的每一个字节 |
有单独时序,不可在其上直接运行代码 | 可在其上直接运行代码,使用简单 |
块的最大擦写次数是一百万次甚至千万次 | 而Nor的擦写次数是十万次数量级 |
发生位交换错误的次数多,需要使用ECC校验算法 ,需要初始化扫描,标记坏块 | 位交换发生次数远远少于NandFlash |
eMMC:nand flash+主控IC,对外的接口协议,简化了电路设计、容量大、成本低,在封装中集成了一个控制器,提供标准接口并管理闪存
IMX6内部接口
第一节 GPIO
GPIO即通用目的的输入输出,泛指处理器中可作为开关量使用的输入输出引脚。IMX6有大量的复用引脚,每个引脚最多可配置成8种不同的功能,其中就包括GPIO功能。设置成GPIO引脚后,就可以通过编程进行操作,以后要完成的驱动程序实验就利用GPIO控制led灯的亮灭,IMX6处理器共有128个GPIO引脚
第二节 PWM(脉宽调制)
PWM是指对一个方波序列信号的占空比按照要求进行调制,而不改变信号的幅度和周期,因此脉宽调制信号是数字式的。如果调制信号的频率远远大于信号接受者的分辨率,则接收者获得的是信号的平均效果,因此模拟信号可以使用PWM实现
IMX6内部的PWM如下图所示:
周期寄存器也常被称为初值寄存器,采样寄存器也常被称为观察寄存器,IMX6的PWM没有比较寄存器,无法控制占空比的变化
第三节 UART
UART串行通信引脚:
TXD:发送数据引脚 RXD:接收数据引脚 最简单的串行通信除了共同的地线外,只需要上述这2个引脚
如果需要握手,则需要流控信号:RTS:请求对方发送 CTS:清除请求发送
数据帧格式:串行通信双方按照约定好的数据帧进行通信 数据帧包含1个开始位、5到8个数据位、1个可选的奇偶校验位、1个或2个停止位,常设置成8N1(8数据有效位,无奇偶校验,1停止位)
第四节 USB
通用串行总线,是应用最广泛的外设接口规范。支持即插即用,可以从系统中直接汲取电流,无需单独供电,使用非常方便。USB规范主要有3种:USB1.1(最高12Mb/s);USB2.0(最高480Mb/s);USB3.0(最高5Gb/s)。IMX6支持 USB2.0
USB分为主机(HOST)、设备(DEVICE)和集线器(HUB)。一个完整的USB拓扑,只有一个主机,可以连接127个设备, 既可以使用菊花链形式串行连接,也可以使用集线器连接
第五节 显示及摄像头接口
台式计算机中的主要显示设备是显示器和显卡,显示器是图像的载体,而显卡的主要功能则是把显存中的图像数据高速传送给显示器
嵌入式系统的显示设备以LCD液晶屏为主,“显卡”通常就是LCD控制器。IMX6处理器中显示接口包括HDMI、LVDS、MIPI及EPDC(e-ink电子墨水屏接口),摄像头接口为20位CSI
分辨率直接算即可
LCD裸屏控制信号自行学习
第六节 IIC
IIC(Inter-Integrated Circuit),也写做I2C,即集成电路总线,是为实现在器件间进行简单的消息传递而设计的
IIC总线只需要2个引脚,即串行数据线SDA和串行时钟线SCL
总线空闲时,SDA和SCL为高电平;启动数据传输时SCL保持为高,SDA由高变低,停止数据传输时SCL为高SDA由低变高;数据传输时,SCL为高期间,SDA必须保持稳定,数据的改变必须在SCL为低时完成, 时钟上升沿采集数据
IIC的从芯片有一个7位地址,所以一路IIC总线最多可以连接128个芯片,实际使用中,可以循环测试这些地址,以找到总线连接的从芯片。同一种IIC芯片有相同的地址,所以同一种IIC芯片不能挂载到同一个IIC总线上,若应用系统需要使用IIC总线提供2路模拟输入(AD),必须提供2种不同的IIC芯片,或使用2路IIC总线。IMX6最多可配置3个IIC总线控制器,可以按着应用需要连接相应IIC芯片
第七节 音频支持
IMX6一般通过AC‘97或IIS总线连接音频芯片,提供“声卡”功能
第八节 SPI
SPI(Serial Peripheral Interface)串行外围设备接口,是处理器与外设芯片间一种高速、低成本、易使用的全双工同步串行总线
SPI以主从方式工作,通常有一个主设备和一个或多个从设备
SPI接口占用了六根线,IMX6最多可配置5个:
- MOSI:主设备数据输出,从设备数据输入
- MISO:主设备数据输入,从设备数据输出
- SCLK:用来为数据通信提供同步时钟信号,由主设备产生
- SS0-2:从设备使能信号,由主设备控制
调试接口JTAG
第一节 嵌入式系统调试概述
嵌入式系统调试指的是连接仿真器通过JTAG接口来调试目标板,即绕过了操作系统,直接调试硬件的方法
下列几种情况要进行嵌入式系统调试:
- 通过JTAG小板或仿真器烧写启动代码
- 通过仿真器调试无操作系统的简单应用程序
- 通过仿真器调试操作系统与应用程序一体化的嵌入式系统
- 无法装入操作系统时通过仿真器调试硬件故障
嵌入式调试硬件连接图
第二节 JTAG --- 概述
JTAG:一种国际标准测试协议,通过JTAG接口,可对芯片内部的所有部件进行访问。基本思想是在靠近芯片的输入/输出引脚上增加一个移位寄存器单元,也就是边界扫描寄存器。当芯片处于调试状态时,边界扫描寄存器可以将芯片和外围的输入/输出隔离开来,通过边界扫描寄存器单元,可以实现对芯片输入/输出信号的观察和控制
常用的JTAG接口有20针、14针和10针3种。IEEE1149.1规定了JTAG的引脚信号,最主要的信号有4个:TCK:时钟信号,输入;TMS:模式选择信号 输入,控制状态机的转换;TDI:数据输入信号;TDO:数据输出信号
JTAG的抓取图
JTAG的移位图
JTAG的更新图
JTAG小板是一种简易的并口仿真器,一般仅用于目标板的flash烧写,并不用于目标板的仿真调试
仿真器主要用于目标板的仿真调试,但也可用于目标板的flash烧写
JTAG小板和仿真器(并口)的比较:
- 仿真器具有性能优势,JTAG小板下载文件所需的时间是仿真器的6倍以上
- 仿真器内部拥有存储器等资源,调试时不再利用系统除了边界扫描寄存器外的任何其他资源(尤其是目标机CPU),JTAG小板内部无资源
- 仿真器的价格一般在千元左右,JTAG小板的价格一般在百元左右,存在将近10倍的差别
- 在与目标板的兼容方面,简易JTAG能够与多个调试软件兼容,而仿真器只能使用专门的调试软件,具有一定的局限性
- 通常JTAG小板用于烧写Flash,仿真器则用于单片机式的计算机系统调试。过去,JTAG烧写flash使用的都是这种方式,近来,由于台式机不再提供并口支持,也开始直接使用仿真器(USB口)进行烧写
嵌入式系统硬件安全
第一节 嵌入式系统硬件安全
嵌入式系统硬件可能剖析、仿制和破坏。潜在的硬件缺陷一旦被发现,很难通过打补丁方式修正;硬件攻击通常很容易被实现,例如可能仅需要一台示波器或一个读卡器;硬件设计时应尽可能考虑安全问题,最好有补救措施,一旦发现安全问题,宁可报废,也不能泄露;硬件被破解,破坏性很强
第二节 硬件设备与网络空间安全
网络空间中存在的四方面安全问题:
- 电磁设备:应对在网络空间中信息系统设备所面对的安全问题,包括物理安全、环境安全、设备安全等
- 信息通信系统:应对在网络空间中信息系统自身所面对的安全问题,包括网络安全、软件安全等
- 运行数据:应对在网络空间中处理数据的同时所带来的安全问题,包括数据安全、身份安全、隐私保护
- 系统应用:应对在信息应用的过程中所形成的安全问题,包括内容安全、应用安全等
第三节 基于可信技术的安全性
可信计算用于构建硬件安全模块(TPM模块,Trusted Platform Module)支持下的可信计算平台。 由于终端是最薄弱的安全环节,可信技术能构建牢固的终端体系结构,解决安全之根本
可信芯片内部组成
Linux开发环境
第一节 Linux简介
相关历史:GNU计划和自由软件基金会FSF旨在创造一套完全自由免费,兼容于Unix的操作系统GNU(GNU's Not Unix!),1991年芬兰大学生李纳斯在GPL条例下发布他自己创作的Linux操作系统内核,至此GNU计划正式完成,操作系统被命名为GNU/Linux(或简称Linux)
Linux被称为“GNU/Linux”的原因:Linux只是一个内核,GNU软件为Linux操作系统的开发创造了一个合适的环境,因此Linux操作系统被称为“GNU/Linux”,Linux同样是UNIX的一种克隆系统,是一种准(类)UNIX
第二节 Linux命令
文件权限设定命令chmod:chmod [-R] mode name 其中,-R将指定目录及其子目录下面的所有文件,name为文件名或目录名。 mode: 3个(文件拥有者u、组g和其他用户o,所有人的权限,简写a)8进制数字或rwx的组合
chmod 755 dir1(创建者可读可写可执行,组用户可读可执行,其他用户可读可执行)
chmod u+x file2,chmod o-r file3,chmod a+x file4
第三节 编译工具链
linux编译和链接生成的默认文件名是a.out
gcc具有丰富的命令选项,如-o,-c,-L(指定库所在目录),-l(小写L)(指定库文件),-I(大写i)指定头文件目录),-O(指定编译时的优化级别)等
共享函数库与静态函数库比较:
- 静态函数库:用.a作为文件的后缀,生成目标代码时会被加入到其中,生成代码体积大,速度快。ar用于生成静态函数库,可以将多个可重定位的目标模块归档为一个函数库文件
- 共享函数库:存放可执行程序在运行的时候才会被加载的函数,函数库名字必须lib作为前缀,后缀是.so及版本号信息,生成代码可以共享,便于升级, 如libgui.so.1
第四节 使用实例
自行了解
第五节 make与makefile
make命令根据一个称为makefile的文件来完成并自动维护编译工作。 Makefile文件需要按照某种语法进行编写,其中说明了如何编译各个源文件并链接生成可执行文件,并定义了源文件之间的相互依赖关系。 当修改了其中某个源文件时,如果其他源文件依赖于该文件,则也要重新编译所有依赖该文件的源文件
在一行的开始给初变量名字,后面跟一个":="及要设定的值,即可定义变量:VARNAME:=string,使用时把变量用括号括起来,并在前面加上$:${VARNAME}
例如:OBJS:=prog.o code.o
CC:=gcc
test:${ OBJS }
${ CC } –o test ${ OBJS }
Makefile使用“=”和“:=”的不同:"="赋值,这种形式是以递归的形式展开变量,及被赋值的变量只有在被使用时才会展开;":="赋值,这种形式是直接展开式赋值,立即生效
如下例证:
foo = $(bar)
bar = $(ugh)
ugh = Huh?
all:
echo $(foo)
结果:
echo Huh?
Huh?
foo := $(bar)
bar = $(ugh)
ugh = Huh?
all:;echo $(foo)
结果:
echo
foo := $(bar)
bar = $(ugh)
ugh = Huh?
all:
echo $(foo)
foo := hello
结果:
echo hello
hello
简单makefile文件编写:自行练习
第六节 shell编程
通常在shell程序开始声明类型,如#!/bin/sh和#!/bin/bash
用户变量:要把值存入变量,只要写出变量名或紧跟一个=再加变量值即可,例如---count=1
在程序中使用变量的值时,要在变量名前面加上一个符号“$”,例如---echo $variable
环境变量:export 命令标记环境变量---$ export MYENV=1 $ echo $MYENV
使用 set 命令可以获取当前上下文中全部的环境变量,使用 env 命令可以查看系统中全部环境变量
位置变量:总共有十个位置参数,其对应的名称依次是$0,$1,$2,...$9,其中$0表示命令名或Shell脚本名,不可或缺,其它位置参数可有可无
shift命令:把位置参数左移,原来$1中的值丢失,参数变量的个数自动减1
$#变量:存放命令行中所键入的参数个数
$*变量:可以引用传递给程序的所有参数
$@变量和$*变量功能基本相同
$?变量:shell自动将最后所执行命令的退出状态设置到shell变量$?中,可以用echo命令在终端上显示它的值,退出状态为0表示运行成功,非零表示运行失败
三种通配符:
- *星号,它匹配任意字符的0次或多次出现。但注意,文件名前面的圆点(.)和路径名中的斜线(/)必须显式匹配
- ?问号,匹配任意一个字符
- [ ] 一对方括号,其中有一个字符组。其作用是匹配该字符组所限定的任意一个字符
- * 和 ?在方括号内,就不是通配符了
- !叹号,若它紧跟在一对方括号的左方括号[之后,则表示不在一对方括号中所列出的字符
引号与反斜线:
- 双引号“ ”括起来的字符, 除$、倒引号和反斜线(\)仍保留其功能外,其余字符通常作为普通字符对待
- 单引号‘ ’括起来的字符都作为普通字符出现
- 倒(反)引号 ` ` 用于设置系统命令的输出到变量,反引号中的内容作为一个系统命令并执行
- 反斜线 \ 为转义字符,若想在字符串中使用反斜线本身,则必须采用(\\)的形式
Expr求值表达式:expr命令一般用于整数值,但也可用于字符串。一般格式为---expr argument operator argument,其中operator为+ - * / %,但对*的使用要用转义符\ ---例v3=`expr $v1 \* $v2`
简单shell程序编写:自行练习
嵌入式Linux开发环境
主机Linux开发环境
嵌入式Linux开发环境图
开发嵌入式Linux软件需要在主机上运行Linux,并安装交叉编译环境。针对目标机处理器的交叉编译工具可以免费下载,安装后,使用Linux一般方法编译程序,只是针对平台不同,命令也不同
NFS的设定与作用:
安装 nfs 软件包:apt-get install nfs-kernel-server---修改/etc/exports,设置nfs目录---启动nfs服务:/etc/init.d/rpcbind restart /etc/init.d/nfs-kernel-server restart---虚拟机网络设置为桥接方式,目标机和主机设定一个网段IP,目标机ping通主机(需要关闭主机无线网再打开)---目标机挂载nfs
对于嵌入式系统调试,使用NFS非常方便,程序可以存放在主机上,被目标机上的Arm linux访问,省去了烧录和下载的过程;NFS目录在主机的etc/exports中指定,NFS可以在目标机linux启动后,通过mount使用,使用结束时需卸载(如umount /mnt);NFS指定的目录也可以做为嵌入式linux(需正确配置)的启动根目录,一般通过Bootloader指定
嵌入式Linux开发环境
目标机Linux开发环境 --- BootLoader:系统加电后运行的第一段软件代码,有u-boot、vivi、blob三类,u-boot是嵌入式系统中最常用的Bootloader之一
嵌入式系统的NandFlash中的存储内容分布图
linux配置内核常用2个不同命令中的一个:
- make menuconfig:不带图形界面
- make xconfig(gconfig):带图形界面
嵌入式linux内核配置通常使用第一个命令,pc linux内核则通常使用第二个命令。命令执行的结果是产生一个 .config文件,并在每个c语言文件中加入<linux/config.h>,以便使所有CONFIG_XXX起全局作用,根据这个生成不同的内核
配置内核:[*]---将该功能编译进内核;[ ]---不将该功能编译进内核;[M]---将该功能编译成可以在需要时动态插入到内核中的模块
内核源码目录:用source指定交叉编译器:
# export ARCH=arm
# source /opt/poky/1.7/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
编译:# make clean # make zImage # make imx6dl-sabresd.dtb
编译成功后会生成内核镜像文件arch/arm/boot/zImage和设备树文件arch/arm/boot/dts/imx6dl-sabresd.dtb
system.map是内核符号映射文件,应用程序所有可以使用的符号应该在其中
嵌入式Linux根文件系统:Linux启动时挂载为根目录的文件系统,被称为根文件系统。根文件系统的具体形式就是我们平时看到的linux目录
基于imx6的嵌入式linux烧写过程:复制烧写工具目录mfgtools(为绿色版,在光盘资料“演示程序烧写目录”目录之下),然后将要烧写的4个文件复制到mfgtools目录下的Profiles\Linux\OS Firmware\files中,4个文件如下
- 编译u-boot已经生成了文件:u-boot.imx,复制时要更名为u-boot-imx6dlsabresd_sd.imx
- 编译内核生成了文件:zImage,imx6dl-sabresd.dtb复制时要更名为zImage-imx6dl-sabresd.dtb
- 生成根文件系统压缩包rootfs.tar.bz2
注意:此方法适用于无法启动Linux时
嵌入式系统软件平台
Linux驱动程序
Linux有2种工作状态:内核态和用户态,应用程序处于用户态,用户态无法直接访问硬件设备,需要借助驱动程序进入内核态才能访问硬件
Linux驱动程序按它们操作的设备被分为三类,本课程主要针对字符设备。 初始化字符设备时,驱动程序在内核的字符设备开关表chrdevs中增加一个device_struct条目,它包含2个元素:驱动程序名和文件操作指针,主设备号为这个条目的索引。 每个字符设备文件对应一个设备文件,其中包含主次设备号,可以找到相应条目,并最后把相应的文件系统操作映射到驱动程序函数
应用程序与驱动程序区别:
应用程序是一个进程,编程从主函数main()开始,主函数main()返回即是进程结束
驱动程序是一系列内核函数,包含了一些函数,是内核的一部分,如open()、close()、read()、write()。这些函数由内核在适当的时候来调用,可以用来完成硬件访问等操作
驱动程序加载:
Linux驱动程序加载方式有2种---1.驱动程序直接编译入内核,在内核启动时就已经在内存中,可以保留专用存储器空间 2.驱动程序以模块形式存储在文件系统里,需要时动态载入内核,按需加载,不用时节省内存,相对独立于内核,升级灵活,授权方式灵活
Linux驱动程序编程:自行练习