用户态和内核态切换
2017-11-14 13:24
603 查看
用户态切换到内核态的3种方式
a. 系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
b. 异常
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
c. 外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的
a. 系统调用
这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。
b. 异常
当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。
c. 外围设备的中断
当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的
相关文章推荐
- 用户态到内核态切换分析
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- 《重要》从用户模式切换到内核模式的完整过程分析
- 用户态与内核态之间的切换
- init进程如何从内核态切换到用户态
- 中断发生时用户堆栈和内核堆栈的切换
- 用户态和内核态的切换
- 中断发生时用户堆栈和内核堆栈的切换
- 任务内核态与用户态堆栈之间的切换
- 内核模式和用户模式的切换
- 用户态到内核态切换之奥秘解析
- 用户态到内核态切换之奥秘解析
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- 内存空间切换:在内核写数据到用户空间的方法
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
- 【操作系统】用户堆栈与内核堆栈的区别切换
- cpu与寄存器,内核态与用户态及如何切换
- 用户态向内核态切换