用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,它们只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TSS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问。

内核态:Ring0在处理器的存储保护中,核心态,或者特权态(与之相对应的是用户态),是操作系统内核所运行的模式。运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问。

一、用户态和内核态

现在我们从特权级的调度来理解用户态和内核态就比较好理解了,当程序运行在3级特权级上时,就可以称之为运行在用户态,因为这是最低特权级,是普通的用户进程运行的特权级,大部分用户直接面对的程序都是运行在用户态;反之,当程序运行在级特权级上时,就可以称之为运行在内核态。

虽然用户态下和内核态下工作的程序有很多差别,但最重要的差别就在于特权级的不同,即权力的不同。运行在用户态下的程序不能直接访问操作系统内核数据结构和程序。

当我们在系统中执行一个程序时,大部分时间是运行在用户态下的,在其需要操作系统帮助完成某些它没有权力和能力完成的工作时就会切换到内核态。

二、什么情况下会发生从用户态向内核态切换。这里细分为3种情况。

1、发生系统调用时

这是处于用户态的进程主动请求切换到内核态的一种方式。用户态的进程通过系统调用申请使用操作系统提供的系统调用服务例程来处理任务。而系统调用的机制,其核心仍是使用了操作系统为用户特别开发的一个中断机制来实现的,即软中断。

2、产生异常时

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

3、外设产生中断时

当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条即将要执行的指令转而去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了由用户态到内核态的切换。比如硬盘读写操作的完成,系统会切换到硬盘读写的中断处理程序中执行后续操作等。    
       可以看到上述三种由用户态切换到内核态的情况中,只有系统调用是进程主动请求发生切换的,中断和异常都是被动的。

三、具体的切换操作

  从触发方式上看,可以认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说,涉及的关键步骤是完全一致的,没有任何区别,都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的,而异常和中断的处理机制基本上也是一致的,关于它们的具体区别这里不再赘述。关于中断处理机制的细节和步骤这里也不做过多分析,涉及到由用户态切换到内核态的步骤主要包括:

[1] 从当前进程的描述符中提取其内核栈的ss0及esp0信息。

[2] 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,这个过程也完成了由用户栈到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。

[3] 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,开始执行中断处理程序,这时就转到了内核态的程序执行了。

最新文章

  1. codevs2645 Spore
  2. jQuery轮播
  3. SNF开发平台WinForm之三-开发-单表选择控件创建-SNF快速开发平台3.3-Spring.Net.Framework
  4. WatiN框架学习
  5. 为什么 把单一元素的数组放在一个struct的尾端问题
  6. python 魔法方法(学习过程的笔记)
  7. Servlet--ServletConfig接口,GenericServlet类
  8. Kubernetes 笔记 012 Pod 的自动扩容与缩容
  9. JS禁用浏览器退格键、禁止右键、禁止全选、复制、粘贴
  10. Web 应用程序项目 Himall.Web 已配置为使用 IIS。 无法访问 IIS 元数据库
  11. HTTP Method小结
  12. Windows以及Linux系统文件、文件夹命名规则
  13. LeetCode题解之Rotated Digits
  14. MySQL防范SQL注入风险
  15. Python格式符说明
  16. 基于NodeJS的14款Web框架
  17. java.net.SocketException四大异常解决方案(转)
  18. hql join
  19. 运行在 Android 系统上的完整 Linux -- Termux
  20. Django 模型层--单表

热门文章

  1. SpringBoot学习笔记(1)----环境搭建与Hello World
  2. 优动漫PAINT-草地教程
  3. 前端压缩图片,前端压缩图片后转换为base64.
  4. 第三方库requests
  5. 路飞学城Python-Day17
  6. js判断浏览器的环境(pc端,移动端,还是微信浏览器)
  7. new 一个对象的时候发生了什么
  8. 列表的初识,列表的索引切片,列表的增删改查,列表的嵌套,元组的初识,range
  9. HDU 6051 If the starlight never fade(原根+推式子)
  10. 本地yum源安装docker