1、程序以进程的形式来占用处理器和系统资源。进程可被调度在一个处理器上交替地执行,或在多个处理器上并行执行。进程是资源分配和管理的单位,线程则成为处理器调度的基本单位。
2、处理器:
任务是按照程序计数器的指向从主存读取指令,对指令进行译码,取出操作数,然后执行指令。
3、共享存储(紧密耦合)多处理器系统, 分布存储(松散耦合)多处理器系统。
4、寄存器:用于存放数据、变量和运算的中间结果。
通用寄存器共4个:EAX、EBX、ECX、EDX,通常保存32位数据。16位的为AX、BX、CX、DX。
5、指针及变址寄存器共4个:
ESP堆栈指针寄存器,保存栈顶元素的地址。
EBP栈帧指针寄存器,指向栈中当前帧的位置。
ESI源变址寄存器。
EDI目的变址寄存器。
6、段选择寄存器是6个16位的段寄存器:CS、DS、SS、ES、FS、GS。
7、指令指针寄存器和标志寄存器,控制寄存器等。(以上可以参考微机原理与接口技术一书)
8、数据寄存器或缓冲区:
存放当前要在设备和主机之间传送的I/O数据,程序可以访问数据寄存器或缓冲区。
1)状态寄存器:保存外部设备或接口的状态信息,以便完成CPU在必要时测试状态。
2)控制寄存器:CPU传送给外部设备或接口的控制命令通过控制寄存器发送。
9、CPU和控制寄存器、数据寄存器及缓冲区之间的通信方式有以下三种:
1)为每个控制寄存器分配一个I/O端口号(8位或16位),通过使用核心态I/O指令(IN/OUT),CPU可以读写端口。
2)把所有控制寄存器映射到主存空间,为每一个寄存器分配唯一的主存地址,且与用户的可用主存地址不重叠。
3)混合方式,既在主存空间开辟数据缓冲区,而控制寄存器又有其单独的I/O端口。
注意:上述工作过程为:
1)CPU读取数据时,把所需地址总线(主存地址或I/O端口号)放在地址总线上。
2)早控制总线上插入读信号,同时另一条信号线表明数据来自I/O空间还是主存空间。
3)由相应的对象(设备或主存)对请求做出响应。
10、指令分为5类:数据处理类、转移类、数据传送类、移位与字符串类、I/O类。
特权指令是指仅供内核程序使用的指令,如敏感性操作。应用程序只能使用非特权指令。
11、当处理器处于核心态时,CPU运行可信软件,硬件允许执行全部机器指令,可以访问所有主存单元和系统资源,并具有改变处理器状态的能力。用户态时,非可信软件,程序无法执行特权指令,且访问仅限于当前CPU上进程的地址空间,这样就能防止内核收到应用程序的侵害。
12、有两种情况会导致处理器从用户态向核心态转换。
一是程序请求操作系统服务,执行系统调用。二是在程序运行时产生中断或异常事件,运行程序被中断,转向中断处理程序或异常处理程序工作。
13、OS通过程序状态字(psw)区分不同的处理器状态。psw用来指示处理器状态,控制指令的执行顺序,并且保留和指示与运行程序有关的各种信息,主要作用是实现程序状态的保护和恢复。
标志3种:状态标志、控制标志、系统标志。
14、中断:
在程序执行过程中,遇到急需处理的事件时,暂时中止现行程序在CPU上的运行,转而执行相应的事件处理程序,待处理完成后再返回断点或调度其他应用程序。是随机发生的。
中断分类:
1)强迫性:机器故障中断、程序性中断、外部中断、输入输出中断。
2)自愿性:它表示运行程序对操作系统有某种需求,是由于执行“访管命令”而引起的。
3)硬中断:外中断、内中断。
4)软中断:信号和软件中断。
15、中断和异常的区别:
中断与cpu是异步的,cpu对中断的响应完全是被动的。中断的发送与cpu的模式无关,可以发生在用户态和核心态,通常在两条机器指令之间才能响应中断。
异常是由cpu控制单元产生的,源于现行程序执行指令过程中检测到例外。异常与cpu是同步的,允许指令在执行期间多次响应异常,大部分异常发生在用户态。
异常处理程序在当前进程的上下文中执行。分为4种:故障、陷阱、终止、编程异常。中断的嵌套发生是允许的,但异常多为一重,异常处理过程中可能会产生中断,反之则不会发生。
16、信号是一种软中断机制,信号的发送者相当于中断源,而信号的接收者必然是一个进程(相当于cpu)。一个典型的例子就是windows中由内核发出的Dispatch/DPC和APC等中断,用于启动线程调度,延迟过程调用和异步过程调用的执行。
17、cpu的响应过程:
在执行完当前指令后或中途,根据中断源所提供的“中断向量”,在主存中找到相应服务程序的入口地址并调用此服务程序。中断向量由硬件或操作系统内核预先分配和设置,系统调用所对应的向量则在访管指令中给出,各种异常的向量在cpu的硬件结构中预先规定。
18、中断/异常的响应需要做4件事:
发现中断源、保护现场、转向中断/异常事件的处理程序、恢复现场。
对于当前进程而言,中断是异步事件,中断处理程序工作在核心态的中断上下文中,不允许被阻塞。
注意:异常处理过程:
1)将硬件错误代码和异常向量号存入当前进程的PCB(进程控制块)中。
2)判断异常是核心还是用户态,前者将直接转向内核预定义服务程序进行处理,未被处理的核心态异常是OS的致命错误。对于后者终止当前进程的运行,调用force_sig()函数向当前进程发信号。
3)从ret_from_exception返回用户空间时,将检查进程是否有信号等待处理,若有则根据信号类型调用相应的函数进行处理。
//典型例子:页面故障处理。它是分页式虚存管理的硬件支撑,由系统来处理这种异常,异常处理程序最终转向do_page_fault()执行页面调度。
中断处理过程与异常相似,只是产生异常时硬件并不清除中断标志位,而中断时立即清除。
中断调度器将硬件级中断映射到由操作系统识别的中断请求级别。(IRQL)
19、程序性中断:语法错误、逻辑错误、程序运行过程中所产生的异常。
I/O中断:I/O操作正常结束、操作发生故障、操作发生异常。
访管中断:由访管指令引起,表示当前运行程序对操作系统功能的调用。有操作码和访管参数。
时钟中断:陷入死循环的进程最终会因为时间片耗尽而被迫让出处理器。
绝对时钟:update_clock()更新当前时间,get_time()返回当前时钟值,set_clock()把当前时间设置为新的时钟值。
间隔定时器:进程可以被延迟或阻塞,直至被间隔定时器的中断信号唤醒。实现如下:
delay(tdel)
{ set_timer(tdel); //硬件间隔定时器设置为tdel
p(delsem); //进程执行p操作而发生阻塞,等待中断
} //delsem为二元信号量,其初值为0
timeout()
{ V(delsem); }; //中断产生,执行V操作以释放进程
逻辑定时器:使用带有绝对唤醒定时器的优先队列、使用带有时间差值的有限队列。
20、cpu可以通过指令设置可编程中断控制器的屏蔽码,中断屏蔽位的作用是暂时禁止对某些中断做出响应。
21、对于多重中断,可能是同一优先级的不同中断,也可是不同优先级的中断。对于前者通常由同一个中断处理程序按自左向右的顺序逐个清理。后者视情况:
1)串行处理:在运行一个中断处理程序时,禁止再次发生中断,可通过屏蔽中断来实现。
2)嵌套处理:OS必须预先规定赋予每类中断以一定的优先级,运行高优先级中断打断低的。嵌套至多3层。
3)即时处理:表明此时中断处理程序有例外,应对其立即响应并处理。
22、任务队列:
由内核定义的,每个队列包含一个由等待调用的函数所组成的链表,不同队列中的函数在某个时刻会被触发并执行。由tq_struct单向链表结构组成,每个tq_struct数据结构是任务队列的结点,包含处理函数routine()的地址、避免重复入队标志sync、函数参数的指针data和下一任务结点的指针next。
分为:定时器队列、即时队列、进程调度队列、磁盘队列。
23、windows使用中断分派表(IDT)来查找处理特定中断的中断处理程序,以中断源的的IRQL作为表的索引,找到中断服务程序的入口地址,将控制权转交给它。
大多数的中断处理程序都在内核中,当一个线程运行结束或进入等待状态时,内核直接调用线程调度程序进行描述表的切换。内核所定义的异常有:主存访问越界、被0除、整数溢出、浮点异常、调试程序断点。
24、每个线程都有一个指向系统服务表的指针,windows有两个内置的系统服务表,一个默认表在NTOSKPNL.EXE核心执行系统服务,另一个表在Win32子系统Win32K.SYS的核心态实现Win32USER及GDI服务。
用于执行服务的系统服务调度命令存放于系统动态链接库NTDLL.DLL中。