当前位置: 技术问答>linux和unix
关于进程的用户态和内核态
来源: 互联网 发布时间:2017-03-08
本文导语: 在操作系统中,一个进程从用户模式切换至内核模式,需要系统调用产生中断,但是我不明白的是既然切换到内核模式应该执行的是系统进程,因为用户的进程已被中断。那进程的这两个状态应该怎么理解呢? 刚...
在操作系统中,一个进程从用户模式切换至内核模式,需要系统调用产生中断,但是我不明白的是既然切换到内核模式应该执行的是系统进程,因为用户的进程已被中断。那进程的这两个状态应该怎么理解呢? 刚学操作系统,求大神赐教。
|
进程就是程序的执行过程,所谓内核态和用户态是指你现在执行的代码是在内核空间还是在用户空间,并不是所谓的进程切换。比如在用户进程A中调用了内核系统调用来获取当前的时钟滴答数,在执行用户进程A中的系统调用指令时,会保存当前用户进程的IP,CS等当前寄存器状态,然后再跳转到内核空间(即内核代码区域)去执行像应的系统调用函数,获取当前的时钟滴答数。执行完后再通过IRET指令返回到进程A中(就是将进入时保存的信息再复位到相应的寄存器中),再接着从CS:EIP地址开始执行A进程的指令。CPU只是执行指令,至于哪条置零就是相应寄存器的事了,如果选择性的执行某些地址的指令就是出现了多进程切换。呵呵,以上纯属个人见解,如有不当,请谅解。
|
进程本身就包含用户态和内核态
进入内核态中还是在本进程上下文 除非时间片完了 或者自己放弃CPU 进行了进程切换
没有“进程进入内核态就切换到内核线程执行”的说法
进入内核态中还是在本进程上下文 除非时间片完了 或者自己放弃CPU 进行了进程切换
没有“进程进入内核态就切换到内核线程执行”的说法
|
通常操作系统把虚拟地址空间划分为用户空间和内核空间,例如x86平台的Linux系统虚拟地址空间是0x00000000~0xffffffff,前3GB(0x00000000~0xbfffffff)是用户空间,后1GB(0xc0000000~0xffffffff)是内核空间。用户程序加载到用户空间,在用户模式下执行,不能访问内核中的数据,也不能跳转到内核代码中执行。这样可以保护内核,如果一个进程访问了非法地址,顶多这一个进程崩溃,而不会影响到内核和整个系统的稳定性。CPU在产生中断或异常时不仅会跳转到中断或异常服务程序,还会自动切换模式,从用户模式切换到特权模式,因此从中断或异常服务程序可以跳转到内核代码中执行。事实上,整个内核就是由各种中断和异常处理程序组成的。总结一下:在正常情况下处理器在用户模式执行用户程序,在中断或异常情况下处理器切换到特权模式执行内核程序,处理完中断或异常之后再返回用户模式继续执行用户程序。