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:进程优先级降为最低
# nice –n 6 vim
解析:将运行vim程序,并为它指定谦让度增量为6。
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中。这种模式一般使用在系统更新时。
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.调用内核。