1. Linux系统如何启动
Linux系统开机首先运行BootLoader,然后由BootLoader引导启动内核,由内核检查和初始化硬件设备,载入设备的驱动程序模块,安装root文件系统,然后内核将启动一个名为init的进程。在Init运行完成并启动其它必要的后续进程后,系统开始运行,引导过程结束。init进程启动时需要读取inittab配置文件,该文件确定init在系统启动和关机时的工作特性。
2. Linux的中断处理流程
中断的概念:中断是指CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。分为外部中断(硬件中断)和内部中断(异常)。
中断处理过程由三部分组成
- 准备部分,其基本功能是保护现场,对于非向量中断方式则需要确定中断源,最后开放中断,允许更高级的中断请求打断低级的中断服务程序
- 处理部分,即真正执行具体的为某个中断源服务的中断服务程序
- 结束部分,首先是关中断,以防止在恢复现场过程中被新的中断请求打断,接着恢复现场,然后开放中断,以便返回原来的程序后可响应其它的中断请求,中断服务程序的最后一条指令一定是中断返回指令
中断上下文切换
- CPU关键上下文切换,比如中断信号、中断指令、iret中断返回指令
- 保存现场和恢复现场,中断处理程序的头部和尾部
3. 系统调用
用户态和内核态
Linux操作系统的体系架构分为用户态和内核态。计算机的硬件资源是有限的,为了减少有限资源的访问和使用冲突,CPU和操作系统必须提供一些机制对用户程序进行权限划分。现代的CPU一般都有几种不同的指令执行级别,就是什么样的程序执行什么样的指令是有权限的。在高的执行级别下,代码可以执行特权指令,访问任意内存,这时CPU的执行级别对应的就是内核态,所有的指令包括特权指令都可以执行。相应的,在用户态,代码能够掌握的范围会受到限制。
系统调用
系统调用是一种特殊的中断,中断分为外部中断和内部中断,内部中断又称为异常,异常又分为故障和陷阱。系统调用就是利用陷阱这种软件中断方式主动从用户态进入内核态。一般来说,从用户态进行内核态由中断触发,可能是硬件中断,在用户态进度执行时,硬件中断信号到来,进入内核态,就会执行这个中断对应的中断服务例程。也可能是用户态程序执行过程中,调用了一个系统调用,陷入内核态,叫做陷阱
系统调用的功能和特性
- 把用户从底层的硬件编程中解放出来。操作系统为我们管理硬件,用户态进程不用直接与硬件打交道
- 极大的提高系统的安全性。如果用户态进程直接与硬件设备打交道,会产生安全隐患,可能引起系统崩溃
- 使用户程序具有可移植性,用户程序与具体的硬件已经解耦合并用接口代替了,不会有紧密的关系,便于在不同系统间移植
4. 进程调度
进程的分类
- 批处理进程 :此类进程不需要人机交互,在后台运行,需要占用大量的系统资源,但是能忍受响应延迟,如编译器
- 交互式进程 : 此类进程有大量的人机交互,因此进程不断地处于睡眠状态,等待用户输入,典型的应用比如编译器Vim.此类进程对系统响应时间要求较高,否则用户会感觉系统反应迟缓
- 实时进程 : 实时进程对调度延迟的要求最高,这些进程往往执行非常重要的操作,要求立即响应并执行 。比如视频播放软件
进程的状态
- 运行态
- 可运行态
- 等待态
- 暂停态
- 僵死态
进程的创建
- Frok,Vfork和clone系统调用创建新进程
- exec系统调用执行一个新程序
- exit系统调用终止进程(进程也可以因收到信号而终止)
进程的撤销
撤销时机
- 主动撤销:执行完代码,通知内核释放进程的资源
- 被动:内核有选择地强迫进程死掉
- 当进程接收到一个不能处理或忽视的信号时
- 当内核代表进程在运行时,在内核态产生一个不可恢复的CPU异常
撤销过程分为
- 进程终止:释放进程占有的大部分资源
do_exit()
- 进程删除:彻底删除进程的所有数据结构
进程删除
- 父进程调用wait()类系统调用检查子进程是否终止
- 若子进程包含终止代号,则父进程通过release()释放僵死进程的描述符
进程同程序的比较
- 程序时指令的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
- 程序可以作为一种软件资料长期存在,而进程是有一定生命期的,程序时永久的,进程是暂时的
- 进程更能真实地描述开发,而程序不能
- 进程是由PCB、程序段和数据段三部分组成
- 进程具有创建其它进程的功能,而程序没有
- 同一程序同时运行于若干个数据集上,它将属于若干个不同的进程。也就是说同一程序可以对应多个进程
进程调度的功能
- 记录系统中所有进程的执行情况
- 选择占有处理机的进程
- 进行进程上下文切换。一个进程的上下文包括进程状态、有关变量和数据机构的值、机器寄存器的值和PCB以及有关程序、数据等
进程调度的时机
- 进程状态发生变化时
- 当前进程时间片用完
- 进程从系统调用返回用户态
- 中断处理后,进程返回到用户态
为何要进程调度
- 非剥夺方式
- 剥夺方式:优先权原则,短进程,优先原则,时间片原则
active:活动进程
expired:过去进程
对交互进程和批处理进程的分别处理
- 为提高交互进程的性能,用完时间片的活动批处理进程总是变成过期进程
- 用完时间片的活动交互进程通常仍然是活动进程,调度程序重填时间片把它留在活动进程集合中
- 如果最老的过期进程等待了很长时间,或者过期进程比交互进程的优先级高,调度程序把用完时间片的活动交互进程移到过期进程集合中
实时进程
- 实时进程的动态优先级范围1-99
- 实时进程总是被当做活动进程
- 调度程序总是让优先级高的进程运行
- 几个进程优先级相同,调度程序选择第一个出现在本地CPU的运行队列相应链表中的进程运行
- 实时进程运行的过程中 ,禁止低优先级进程的执行
Linux进程调度策略
- linux的进程调度是基于优先级的调度。进程的优先级是动态的,避免了进程饥饿
- linux的进程分普通进程和实时进程,实时进程的优先级高于普通进程。
- 普通进程采用普通进程的时间片轮转算法
- 实时进程采用实时进程的先进先出或实时进程的时间片轮转算法
进程上下文切换
进程切换:为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复执行以前挂起的某个进程
进程的CPU上下文:在恢复一个进程执行之前,内核必须确保每个寄存器装入了挂起进程时的值。进程恢复执行前必须装入寄存区的一组数据,称为进程的CPU上下文。
硬件上下文:进程恢复执行前必须装入寄存器的一组数据
从本质上说每个进程切换由两部分组成
- 切换页全局目录以安装一个新的地址空间
- 切换内核态堆栈和硬件上下文
5. 文件系统
文件系统是计算机组织、存取和保存信息的重要手段。
按照文件的数据形式分为:
- 源文件
- 目标文件
- 可执行文件
文件控制块
VFS
可以将VFS看成是一种通用文件系统,它位于应用程序和具体文件系统之间,提供了一层通用的接口,在必要时依赖具体的文件系统
VFS支持的文件系统类型
- 基于磁盘的文件系统
- 网络文件系统
- 特殊文件系统
Open操作
所谓打开文件实质上是在进程与文件之间建立连接,而打开文件描述符唯一标识着这个连接。
应用程序对open()的调用将引起内核调用服务例程sys_open()函数,该函数接受的参数为:要打开文件的路径名和访问模式等。该系统调用成功后将返回一个文件描述符,也就是文件对象指针的一个索引,系统调用不成功时返回-1.
6. Linux上的时钟以及如何实现
Linux上有两种时钟,一个是由主板电池驱动的RTC时钟,另一种是内核时钟,有软件来根据时间中断进行计数。内核时钟在系统关机时不存在,操作系统启东时读取RTC时间进行同步,并在系统关机时将时间写会RTC
计时体系结构中的关键数据结构和变量
xtime是从系统中取得的时间,一般是从某一历史时刻开始到现在的时间,即操作系统上显示的时期,它的精度很微妙
jiffies是记录着从开机到现在总共的时钟中断次数。jiffies取决于系统的频率,单位是Hz,是周期的倒数,周期一般是一秒钟中断产生的次数。Linux系统时钟频率是一个常数HZ来决定的,通常HZ==100,精度为10ms。
内核一般通过Jiffies的值来获取当前时间。尽管该数值表示的是自上次系统启动到当前时间间隔,但因为驱动程序的生命期只限于系统的运行期,所以也是可行的。驱动程序利用Jiffies的当前值来计算不同事件间的时间间隔。硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率。