异常的产生:
当处理器检测到有事件发生时,就会通过一个异常表 跳转到 内核程序(异常处理程序),来处理异常。
异常的处理:
系统为每个异常都分配了一个异常号。其中一些异常号是由处理器的设计者分配的,如:被0除,缺页,内存访问违例,断点,算术运算溢出等。其他的异常号是有操作系统内核设计者分配的,如:系统调用(syscall),外部I/O设备的引脚信号。
运行时,若处理器检测到事件发生,确定异常号,然后读取CPU中的异常基址寄存器,从而找到异常处理程序的地址。控制器将控制转到异常处理程序(内核模式)。
此过程由用户模式切换到内核模式。
异常类型:
中断(外部I/O产生的),系统调用(syscall n)(read ,write, fork, execve等),故障(被0除,缺页,内存访问限制等),中止(硬件错误)。
- 系统调用:当用户进程调用write ,read等方法时,该方法内会调用syscall n 命令,进入内核的异常处理程序,通过内核操作处理读写。
上下文切换:
为了执行多任务,内核中的调度器,进行进程调度。在不同的用户程序之间进行上下文切换。内核为每个用户进程维护了一个上下文。
内核态和用户态:
在内核模式下,内核进程可以执行任何指令,访问任意的内存地址空间。而用户模式下,进程不能直接引用地址空间中内核区内的代码和数据(即内存地址空间的顶部,保留给内核的部分,操作系统常驻内存的部分)。