1. 入门
1.1 linux的特点:
a. 支持的硬件设备繁多
b. 支持非常多应用程序和网络协议
c. 扩展性好
d. 部署linux不需要缴纳专利费
e. ....
1.2 开源和GPL
“当我们讨论自由软件时,我们指的是自由,而不是价格上的免费”
2. 综述
2.1 什么是嵌入式系统
BIOS和引导加载程序
BIOS: Basic input/output software.
主要任务:初始化硬件,并且从PC的硬盘驱动器中加载操作系统。
引导加载程序:
a. 初始化关键硬件:SDRAM控制器,I/O控制器,图形控制器
b. 初始化系统内存,并准备将控制权移交给操作系统
c. 为外设控制器分配必要的系统资源,比如内存和中断电路
d. 提供一个定位和加载操作系统镜像的机制
e. 加载操作系统,并将控制权移交给它,同时传递必要的启动信息。
这些信息包括:内存总容量,时钟频率,串行端口速率和其他底层硬件相关的配置数据。
2.2 剖析嵌入式系统
2.2.1 嵌入式linux开发环境
主机开发系统 - 通过网线 - 嵌入式linux目标板
- 通过串口 - 嵌入式linux目标板
2.2.2 启动目标板
第一阶段:
第一次加电,目标板上的引导加载程序立即获得处理器的控制权。
该程序执行底层硬件的初始化工作:包括处理器和内存的设置,初始化UART用于控制串行端口,
以及初始化以太网控制器。
第二阶段:
加载并引导Linux内核。
引导加载程序与BIOS区别:
当linux内核掌握控制权时,引导加载程序就不复存在了。Linux内核会要求收回那些之前被引导加载程序
所占用的内核和系统资源。
将控制权交回给引导加载程序的唯一方法就是:重启目标板。
而BIOS是可能专门存储在一块闪存FLASH中的。
2.2.4 内核初始化
linux必须有一个文件系统。
一个文件系统由一组预定义的系统目录和文件组成,这些目录和文件按照特定的布局存储在硬盘或其他
存储介质上,而Linux内核可以挂载这些介质作为其根文件系统。
2.2.5 第一个用户空间进程:init
在还没有运行用户空间的进程,内核只是自己执行初始化代码,这时系统运行在:内核上下文(kernel context)的环境中;
在这个运行状态下,内核拥有所有的系统内存并且全权控制所有的系统资源。
内核能够访问所有的物理内存和所有的I/O子系统。它在内核虚拟地址空间中执行代码,使用一个由内核
自己创建和支配的栈。
当内核完成其内部初始化并挂在了根文件系统后,默认会执行一个名为init的应用程序。内核一启动init,它随即
进入用户空间(user space)或用户空间上下文运行。
在这个运行状态下,用户空间进程对系统的访问是受限的,必须使用内核系统调用(system call)来请求内核服务。
这些用户空间进程或程序,运行在一个由内核选择和管理的虚拟内存空间中。在处理器中专门的内存管理硬件(MMU)的协助下,
内核为用户空间进程完成虚拟地址到物理地址的转换。
这种架构的最大好处是:某个进程中的错误不会破坏其他进程的内存空间。
2.3 存储
台式机:拥有大容量的硬盘:笨重,包含旋转部件,对物理震动敏感,并且要求提供多种供电电压。
嵌入式系统:不适合硬盘。
2.3.1 闪存
compact Flash卡,SD卡: 这些基于闪存技术的模块可以看做是固态硬盘。
它们没有活动的部件,相对坚固,只需要提供一种供电电压。
闪存的写入和擦除相对于硬盘来说 相当慢。
闪存的存储空间被分割成相对较大的可擦除单元,称为 擦出快(erase block).
为了修改存储在闪存阵列中的数据,必须完全擦除待修改数据所在的块。
相对于传统硬盘的扇区,闪存的块大小相对较大,而一个高性能的硬盘的可写扇区大小为512B或者1024B。结果:更新闪存
中的数据所耗费的写入时间会是硬盘驱动器的很多倍。
闪存另一个限制:存储单元的写寿命。
2.3.2 NAND型闪存
NOR型闪存:有并行的数据总线和地址总线,CPU可以直接访问,甚至代码都可以直接在NOR上运行;
NAND: 通过复杂的接口串行访问的,而且这些接口因厂商而异。
NAND写入时间比NOR快,而且写寿命比NOR高出一个数量级。
NAND更适合于以文件系统的格式大容量存储数据。
2.3.3 闪存的用途
闪存布局:
闪存顶部
------------------
引导加载程序及配置
------------------
linux内核
------------------
内存磁盘ramdisk的文件系统镜像
------------------
更新空间
------------------
系统引导时,存储在闪存中的文件系统镜像被读入到Linux内存磁盘(ramdisk)块设备中,这个块设备由Linux挂载为一个文件
系统,并且只能从内存中访问。
引导加载程序通常存放在闪存阵列的顶部或底部。
引导加载程序之后的存储空间被分配给Linux内核和内存磁盘文件系统镜像。这个镜像中包含了根文件系统。
一般来说,Linux内核和ramdisk文件系统镜像都被压缩过,并由引导加载程序在系统引导时解压。
2.3.4 闪存文件系统
闪存文件系统以类似于硬盘驱动器组织数据的方式来管理闪存设备中的数据。
改进:
a. 引入"耗损均衡算法",将写操作均匀分布到闪存的各个物理擦除块上,以延长闪存芯片的寿命。
b. 防止系统掉电或者意外关机后数据丢失的风险。
闪存文件系统:
JFFS2: Journaling Flash File System 2。
重要改进:完善耗损均衡,压缩和解压缩,以及对linux的硬连接(hard link)的支持。
ext2, ext3, ext4, JFFS2, yaffs2......
2.3.5 内存空间
系统内存空间的大小是跟CPU相关的。如果CPU有24条物理地址线,则其寻址空间就是 0 - 16MB。
MMU: 内存管理单元(memory management unit)
作用:
使得操作系统能够在很大程度上管理和控制地址空间,包括操作系统自身的地址空间和分配给进程的地址空间;
这种控制体现为两种形式:
a. 访问权限控制(access right): 允许操作系统将特定的内存访问权分配给特定的进程。
b. 内存地址转换(memory translation): 允许操作系统将其地址空间虚拟化,从而带来很多好处。
linux内核利用MMU实现了一个虚拟内存操作系统,好处是:
a. 它可以让系统的内存看起来比实际的物理内存多,这样能够更加有效地利用物理内存。
b. 内核在为任务或进程分配系统内存时,可以指定这块内存的访问权限,从而防止某个进程错误地访问
属于同一个进程或内核自身的内存或其他资源。
2.3.6 执行上下文
内核上下文,中断上下文。
用户空间,内核空间。
当应用程序执行系统调用,造成上下文的切换而进入内核时,内核会代表这个进程执行内核代码,
这种情况称为内核运行于"进程上下文"中。
相反,处理IDE驱动器的中断处理程序(ISR)也是内核代码,但在运行时并不代表任何特定的进程,
这种情况被称为内核运行于"中断上下文"中。
2.3.7 进程虚拟内存
一个进程产生时-例如: 当用户在Linux的命令提示符后面输入ls的时候,内核就会为这个进程分配内存及相应的虚拟内存地址范围。
这些地址:
a. 与内核中的地址或正在运行的进程的地址没有固定的关系;
b. 与目标板上的物理内存的地址也没有直接的关系。
实际上,由于系统中存在分页(paging)和交换(swapping)机制,一个进程在其生命周期中常常会占用内存的多个不同的物理地址。
2.3.8 交叉编译环境
2.4 嵌入式Linux发行版
3. 处理器基础
3.1 独立处理器
3.2 集成处理器:片上系统SOC
a. Power:很多网络和电信相关的嵌入式应用领域 - 飞思卡尔, AMCC, ....
b. MIPS: 主导低端消费类设备市场- Boardcom, ...
c. ARM: 用在很多手机中- 德州仪器, 飞思卡尔, ......
阅读(967) | 评论(0) | 转发(0) |