主要内容参考陈向群老师的PPT
进程调度、用户态、内核态。 中断。
进程调度
调度是一种设计,走到这之后,下一步去哪
调度时机:在内核对中断/异常/系统调用处理后,要返回到用户态的时候,要进行进程调度,即出内核态,需要调度
典型的事件举例:
• 创建、唤醒、退出等进程控制操作
• 进程等待I/O 、I/O 中断
• 时钟中断,如:时间片用完、计时器到时
• 进程执行过程中出现abort 异常
• 进程切换:是指一个进程让出处理器,由另一个进程占用处理器的过程
进程切换主要包括两部分工作:
• 切换全局页目录以加载一个新的地址空间 【寄存器,谁上CPU,就放谁的页表起始地址】
• 切换【内核栈】和【硬件上下文】,其中硬件上下文包括了内核执行新进程需要的全部信息,如CPU相关寄存器
上下文切换具体步骤
场景:进程A 下CPU ,进程B 上CPU
• 保存进程A 的上下文环境(**程序计数器、程序状态字、其他寄存器…… **)
• 用新状态和其他相关信息更新进程A 的PCB
• 把进程A 移至合适的队列(就绪、阻塞…… )
• 将进程B 的状态设置为运行态
• 从进程B 的PCB 中恢复上下文(程序计数器 、程序状态字、其他寄存器……)
上下文切换的开销:
直接开销:内核完成切换所用的CPU时间
• 保存和恢复寄存器……
• 切换地址空间(相关指令比较昂贵)
间接开销
• 高速缓存(Cache)、缓冲区缓存(Buffer Cache)和TLB(Translation Look-aside Buffer)失效
操作系统运行环境与运行机制
不同权限的不同指令——目的是为了保护,隔离
内核态(Kernel Mode) :运行操作系统程序
用户态(User Mode) :运行用户程序
• 用户态 → 内核态
唯一途径 → 中断/ 异常/ 陷入机制 (系统调用等)
通过访管指令 如int指令。条特殊的指令:陷入指令(又称 访管指令 )提供给用户程序的接口,用于调用操作系统的功能(服务)
• 内核态 → 用户态
设置程序状态字PSW(进程调度 出内核)
进内核 -必须经过中断异常机制
出内核-必须经过调度机制
一个进程因为系统调用,暂停执行,操作系统陷入内核态执行内核程序,系统调用执行完后仍然需要调度机制选择新程序或者是旧程序执行。
中断与异常
CPU 暂停正在执行的程序,保留现场后自动转去执行相应事件的处理程序 ,处理完成后返回断点, 继续执行被打断的程序
随机发生、自动处理、可恢复
中断的引入: 为了支持CPU和设备之间的并行操作
• 当CPU 启动设备进行输入/ 输出后,设备便可以独立工作,CPU 转去处理与此次输入/ 输出不相关的事情;当设备完成输入/ 输出后,通过向CPU 发中断报告此次输入/ 输出的结果,让CPU
异常的引入: 表示CPU 执行指令时本身出现的问题
• 如算术溢出、除零、取数时的奇偶错,访存地址时越界或执行了“陷入指令” 等,这时硬件改变了CPU 当前的执行流程,转到相应的错误处理程序或异常处理程序或执行系统调用



中断处理过程
1、判断中断来源——发出信号
2、CPU为处理中断做准备。"处理器" 切换到内核态 保存被中断程序上下文环境,PC/PSW
3、查中断向量表,找到中断处理程序入口,设置PC, CPU控制权转移到中断处理程序处。
4、中断处理程序保存现场内容,处理
5、CPU检测到中断返回指令,恢复上下文信息,以及PC和PSW
系统调用
系统调用的参数传递
系统调用的参数传递
• 系统调用使用寄存器传递参数,要传递的参数包括:
• 系统调用号
• 系统调用所需的参数
用于传递参数的寄存器有:
• eax 用于保存系统调用号和系统调用返回值
• 系统调用参数保存在ebx,ecx,edx,esi 和edi 中,参数个数不超过6 个
• 进入内核态后,system_call再将这些参数保存在内核堆栈里

Linux保存参数信息与压栈顺序

中断发生后OS低层工作步骤
- 硬件压栈 : 程序计数器等
- 硬件从中断向量装入新的程序计数器 等
- 汇编语言过程保存寄存器值
- 汇编语言过程设置新的堆栈
- C 语言 中断服务 程序 运行( 例: 读 并 缓冲输入)
- 进程 调度程序决定下一个将运行的进程
- C 语言 过程返回至汇编代码
- 汇编语言过程开始运行新的当前进程
网友评论