嵌入式Linux综述

2019-07-12 18:11发布

通常,理解特定任务的的最佳途径是从全局角度认识它。很多基本概念会给嵌入式系统开发的新手带来挑战。
读《嵌入式Linux基础教程》总结

嵌入与非嵌入

你可能认为桌面PC不是一个嵌入式系统,但是在远程数据中心运行的桌面PC可能就是嵌入式系统,这个平台完成至关重要的监控和报警任务。
嵌入式系统的常见 特性:
  • 包含一个处理引擎
  • 一般是针对某种具体的应用或目的而设计的
  • 资源有限
  • 有一个用户界面
  • 受到供电的限制
  • 内置应用程序
  • 出厂时软硬件已经预先集成
  • 常针对无人值守的应用环境

BIOS和引导程序

BIOS,全称basic input /output software,实际存储在一个闪存中,便于升级BIOS程序。
在典型的嵌入式系统中,引导程序和BIOS完成的功能基本相同,但是在定制嵌入式系统中,需要开发针对具体硬件的引导程序。
引导程序在系统上电时完成的任务列表:
  • 初始化硬件
  • 初始化系统内存,并将控制权移交给操作系统
  • 为外设分配必要的系统资源
  • 提供一个定位和加载操作系统镜像的机制
  • 加载操作系统
    需要记住的是,如果泥的嵌入式系统基于定制的硬件平台,这些引导加载程序的功能必须由你、也就是系统的设计者来提供。

剖析嵌入式系统

比如一个典型的嵌入式系统来说,32位的RISC处理器为中心,闪存用于存储非易失性程序和数据,主存储器是SDRAM,容量从几兆到几百兆,由电池供电的实时时钟,以太网接口、USB接口、串行接口,利用串行接口基于RS232访问控制器。很多处理器都包含外设,有时被称为片上系统(SOC,system on chip)。

存储

嵌入式Linux开发的一个挑战性源自系统物理资源有限。

闪存

典型的嵌入式Linux系统对存储容量的需求是16MB-256MB。
闪存可以在软件的控制下写入和擦除数据。闪存的存储空间被分割成相对较大的可擦除单元,称为擦除块(erase block)。闪存的显著特征就是闪存的写入方式和擦除方式。典型的NOR型闪存,数据可以在软件的控制下,直接将某个存储单元地址的数据从二进制1改为0。然而,将0改为1需要擦除整个擦除块。通常引导加载程序存储在较小的块中,内核和其他必要的数据则存放在更大的块中。
为了修改存储在闪存阵列中的数据,必须完全擦除期待修改数据所在的块。即使只修改某块中的一个字节,都必须擦除并重新写入整个块。
闪存的块大小常见为64KB,典型的高性能硬盘的可写扇区大小为512B或者1024B,显然,更新闪存中的数据所耗费的时间会是硬盘驱动器的很多倍。另一个需要考虑的是闪存的寿命,有擦除次数限制。避免系统日志输出到闪存。
NAND型闪存,通过提供更小的块尺寸改进了传统闪存的一些限制,可以更快有效的进行写操作,大大提高了闪存阵列的使用效率。NOR型走并行接口通讯,而NAND是串行接口。
总的来说,NOR型闪存可以被微处理器直接访问,但实际上,很多处理器不能像对待DRAM一样缓存访问内存的指令。NANA型闪存更适合于以文件系统的格式大容量存储数据,而不是撇开文件系统。

闪存的用途

在最简单的系统中,资源没有过度受限,可以将原始的二进制数据存储在闪存设备中。系统引导时,存储在闪存中的文件系统镜像被读入Linux内存磁盘(ramdisk)块设备中。这个块设备由Linux挂载为一个文件系统,并且只能从内存中访问。但是当系统重启或者掉电时,内存磁盘中文件的修改会丢失,务必牢记这一点。
典型的闪存布局:从底到顶依次为:更新空间、文件镜像系统、Linux内核、引导加载程序及配置。一般来说,Linux内核和ramdisk文件系统镜像都被压缩过,并由引导加载程序在系统引导时解压。

闪存文件系统

上面描述的简单闪存布局策略有局限性,但是可以通过使用闪存文件系统来客服。闪存文件系统的一个改进就是引入了耗损均衡(wear leveling)算法,延长使用寿命。
目前比较受欢迎的一种闪存文件是JFFS2,或者称为第二代日志闪存文件系统(Journaling Flash File System2)。旨在提升整体性能,延长闪存寿命并降低系统掉电时数据丢失的风险。

内存空间

典型的嵌入式系统内存布局:DRAM、PCI、闪存。
高性能的微处理器都包含一个复杂的硬件引擎,称为内存管理单元MMU(Memory manage unit)。MMU的作用是使此操作系统能够在很大程度上管理和控制地址空间,包括操作系统自身的地址空间,和分配给进程的地址空间。这种控制主要体现为两种形式,访问权限控制和内存地址转换。访问权限控制系统允许操作系统将特定的内存访问控制权分配给特定的进程,内存地址转换允许操作系统将其地址空间虚拟化。
Linux内核利用这些硬件MMU实现了一个虚拟内存操作系统,虚拟内存带来最大好处之一就是,可以让系统的内存看起来比实际的物理内存多,这样能够更加有效的利用物理内存,其它的好处就是,内核在为任务或进程分配系统内存时,可以指定这块内存的访问权限,从而防止某个进程错误的访问属于另一个进程或内核自身的内存或其他资源。

嵌入式Linux发行版

到底什么是发行版Linux。Linux内核完成引导后,它会找到并挂载一个根文件系统。一旦合适的根文件系统被成功挂载,启动脚本会启动很多系统需要的程序和实用工具。这些程序一般会调用其他程序来完成具体的任务,例如生成一个登陆shell,初始化网络设备接口和运行用户的应用程序。每一个程序都有一些必须由系统中其他成员来满足的具体需求。
下面列出一些嵌入式Linux发行版中可能存在的软件包,并说明它们的功能。
  • initscript包含了基本的系统启动和关闭脚本
  • apache 实现了留下的Apache web服务器
  • telnet-server包含了实现远程登录服务器功能的必要文件,运行你远程登陆到嵌入式目标上
  • glibc实现了标准C程序库
  • busybox包含了很多命令行工具的精简版本