【操作系统】用户态与内核态的区别转换

来源:互联网 发布:销售新人被辞退 知乎 编辑:程序博客网 时间:2024/06/05 19:42


用户态跟内核态是建立在实时运行的程序(进程)基础上的。

       当一个任务(进程)执行系统调用而执行内核代码时,称进程处内核态,此时处理器处于特权级最高的(0级)内核代码中执行,当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈。当进程执行用户代码时,称其处于用户态,此时处理器在特权级最低的(3级)用户代码中运行。当正在执行的进程突然被中断程序中断时,此时进程可以象征性地称为内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。

       一般情况下,系统调用运行在内核态上,不包含系统调用的函数运行在用户态。一些函数在内部使用了系统调用(如fopen),这样的函数在调用系统调用是进入内核态,其他时候运行在用户态。当用户程序调用系统的API时,就产生中断,进入内核态,执行相应的API,处理完成后,用中断再退出,返回用户态的调用函数。


2. 用户态和内核态的转换

1)用户态切换到内核态的3种方式

a. 系统调用

   这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现。

b. 异常

    当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。

c. 外围设备的中断

当外围设备(如I/O)完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。

 


本人由Cout_Sev 搜集整理,

部分资料参考网络及课本,转载注明出处。

谢谢!



 

0 0
原创粉丝点击