第三章 嵌入式操作系统_进程及进程调度Bootloader

来源:互联网 发布:php中文分词算法 编辑:程序博客网 时间:2024/04/29 15:16

1.在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。程序是一个普通文件,是机器代码指令和数据的集合,这些指令和数据存储在磁盘上的一个可执行映像中,程序一般只包含正文段和用户数据段。进程是由正文段、用户数据段及系统数据段共同组成的一个执行环境,它是一个动态实体。程序是硬盘上存放的一个文件,当程序运行时,它也就成为了进程。进程的组成部分详解:

正文段:存放被执行的机器指令。这个段是只读的,它允许系统中正在运行的两个或多个进程之间能够共享这一代码,但是不能对其内容进行更改。

用户数据段:存放进程在执行时直接进行操作的所有数据,包括进程使用的全部变量在内。显然,这里包含的信息可以被改变。虽然进程之间可以共享正文段,但是每个进程需要有它自己的专用的用户数据段。

系统数据段:该段有效地存放程序运行的环境。这也是进程和程序不同的一个原因之一。

2.线程是系统分配处理器时间资源的基本单元或者说是进程之内独立执行的一个单元。对于操作系统来说,其调度单元是线程。一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或者多个附加线程,这就是所谓基于多线程的多任务。对于Linux内核而言,线程和进程没有本质的区别,它们都是调度的基本单位。Linux进程一般分为交互进程、批处理进程和守护进程3类。

3.Linux在启动的时候就创建一个称为init的特殊进程,其进程标识符(PID)为1,它是用户态下所有进程的祖先进程,以后诞生的所有进程都是它的子进程。1号进程运行时查询系统当前存在的终端数,然后为每个终端创建一个新的管理进程,这些进程在终端上等待着用户的登陆。当用户正确登陆后,系统再为每一个用户启动一个Shell进程,由Shell进程等待并接受用户输入的命令。应用程序可以通过fork、vfork或clone函数建立新的用户线程,这些函数分别通过系统调用sys_fork、sys_vfork或sys_clone内核函数建立新线程,而这三个系统调共同调用的函数为do_fork。

4.Linux进程调度策略

SCHED_NORMAL:非实时,基于优先级的轮转法

SCHED_FIFO:实时,先进先出算法

SCHED_RR:实时,基于优先级的轮转法

SCHED_BATCH:与SCHED_NORMAL类似,该调度算法将使得调度器假定进程对CPU时间要求较多

SCHED_ISO:还未实现

SCHED_IDLE:进程优先级降为最低

   为了实现进程之间的调度,每一个多任务操作系统都会为不同的任务分配一个优先级,进程之间是竞争资源关系,这个竞争优劣是通过一个数值来实现的,这就是谦让度。高谦让度表示进程优先级别最低,负值或0表示高优先级,对其他进程不谦让,也就是拥有优先占用系统资源的权力,谦让度的值从-20到19。

   由于硬件技术的发展,一般情况下不用设置进程优先级。Linux系统提供了nice命令来完成命令优先级的调整。

# nice –n 6 vim

解析:将运行vim程序,并为它指定谦让度增量为6。

   2.6版本的Linux内核提供了140个优先级,后40个和nice值一一对应,属于SCHED_NORMAL调度策略,前100个属于SCHED_FIFO和SCHED_RR策略。在调度算法的实现上,Linux中每个任务有4个与调度相关的参数,它们是rt_priority、policy、priority(niec)、counter。在SCHED_NORMAL调度策略中,调度器总是选择那个priority+counter值最大的进程来调度执行。priority是固定不变的值,counter在每一个调度周期的开始将priority的值赋给counter,然后每次该进程被调度执行,counter值都减少,counter值减为0则本调度周期内不再参与调度。

5.硬盘磁道最外侧是0磁道,次外层是1磁道。目录是一类特殊的文件,利用它可以构成文件系统的分层树形结构。每个目录的第一项都表示目录本身,并以“.”作为它的文件名。每个目录的第二项是“..”,表示该目录的父目录。当把文件添加到一个目录中时,该目录的大小会增长,以便容纳新文件名。当删除文件时,目录的尺寸并不减小,而是核心对该目录项做上特殊标记,以便下次添加一个文件时重新使用它。

6.Linux文件系统分为3部分,第一个部分是Virtual FileSystem(VFS),另外两个分别是Cache和真正的文件系统(如Ext3等)。VFS是Linux文件系统对外的接口,任何要使用文件系统的程序都必须经过这层接口来使用它。

7.Linux的I/O控制方式

(1)轮询,现在已经比较少使用。

(2)中断。

(3)DMA。

(4)通道。

8.Bootloader的操作模式

启动加载模式:Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是嵌入式产品发布时的通用模式。

下载模式:目标机上的Bootloader将通过串口连接或者网络连接等通信手段从主机上下载文件,例如下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到RAM中,然后写到Flash中。这种模式一般使用在系统更新时。

   Bootloader与主机间进行文件传输可以通过串口实现,传输协议通常为xmodem/ymodem/zmodem协议中的一种。也可以通过网线,传输协议为TFTP。

9. Bootloader启动大多数都分为两个阶段。

第一阶段主要包含依赖于CPU的体系结构硬件初始化的代码,通常都用汇编语言来实现。这个阶段的任务有:

A.基本的硬件设备初始化(屏蔽所有的中断、关闭处理器内部指令/数据Cache等)。

B.为第二阶段准备RAM空间。

C.如果是从某个固态存储媒质中,则复制Bootloader的第二阶段代码到RAM。

D.设置堆栈。

在第一阶段中为什么要关闭Cache?通常使用Cache以及写缓冲是为了提高系统性能,但由于Cache的使用可能改变访问主存的数量、类型和时间,因此Bootloader通常是不需要的。

第二阶段通常用C语言完成,以便实现更复杂的功能,也使程序有更好的可读性和可移植性。这个阶段的任务有:

A.用汇编语言跳转到第二阶段的C程序入口点。

B.初始化本阶段要使用到的硬件设备。

C.检测系统内存映射。

D.将内核映像和根文件系统映像从Flash读到RAM。

E.为内核设置启动参数。

F.调用内核。

0 0