CPU的两种工作状态:内核态(管态)和用户态(目态)。
内核态:
1.系统中既有操作系统的程序,也有普通用户程序。为了安全性和稳定性,操作系统的程序不能随便访问,这就是内核态。即需要执行操作系统的程序就必须转换到内核态才能执行!!!
2. 内核态可以使用计算机所有的硬件资源!!!
用户态:不能直接使用系统资源,也不能改变CPU的工作状态,并且只能访问这个用户程序自己的存储空间!!!!
三种从“用户态”转换到“内核态”的最主要(触发)方式:
a.系统调用(用户进程主动发起的):这是用户态进程“主动”要求切换到内核态的一种方式,用户态进程通过“系统调用”身子那个使用操作系统提供的服务城区完成工作!!
b.异常:当CPU执行运行在用户态下的程序时,发生了某些不可知的异常,这是会触发当前运行进程切换到处理此异常的内核程序中,也就转到了内核态,比如缺页异常!!
c.外围设备的中断:当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令时用户态下的程序,那么这个转换过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。
以上三种触发方式,本质上的切换操作是一致的,没有任何区别,都是相当于执行了一个中断相应的过程!!因为系统调用实际上最终也是“中断机制”实现的,而异常和中断的处理机制基本上也是一致的!!。
涉及到“用户态切换到内核态”的步骤主要包括:
1.从当前进程的描述符中提取内核栈的ss0及esp0信息。
2.使用ss0和esp0指向的内核栈将当前进程的cs、eip、eflags、ss、esp信息保存起来,这个过程也完成了有用户态到内存栈的切换过程,同时保存了被暂停执行的程序的下一条指令。
3.将先前有中断向量检索得到的中断程序的cs、eip信息装入相应的寄存器,开始执行中断处理程序,这是就转到了内核态的程序执行了。
总结:
1.计算机系统中有“操作系统程序”和“普通用户程序”。
2.操作系统程序执行就是在“内核态”下执行的。
3.普通用户程序就是在“用户态”下执行的。
4.内核态可以使用所有的硬件资源,用户态不能直接使用系统资源,也不能改变CPU的工作状态,只能访问用户程序自己的存储空间!!
5.为了安全和稳定性,操作系统程序是不能随便访问的!!!
6.引起“用户态切换到内核态”的本质就是“CPU实行了一次中断相应”!!
原文地址:https://www.cnblogs.com/chairlin/p/10759681.html