在保护模式下,处理器中的“阶级”不仅体现在数据和代码的访问,还体现在指令中。

一方面将指令分级的原因是,有些指令的执行对计算机有着严重的影响,它们只有在0特权级下被执行,因此被称为特权指令(Privilege Instruction)。比如hlt指令,它可以让计算机停机,处理器只信任操作系统,所以它不得不放在0特权级下。同类的指令还有lgdt,lidt,ltr,popf等,这些对计算机的正常运行起着非同小可的影响,操作系统只有亲自执行它们才放心。

另一方面体现在I/O读写控制上。IO读写特权是由标志寄存器eflags中的IOPL位和TSS中的IO位图决定的,它们用来指定执行IO操作的最小特权级。IO相关的指令只有在当前特权级大于等于IOPL时才能执行,所以它们称为IO敏感指令(I/O Sensitive Instruction),如果当前特权级小于IOPL时执行这些指令会引发处理器异常。这类指令有in、out、cli、sti。所以你懂的,不止是操作系统可以进行IO端口访问,用户进程也是可以的,只是操作系统不允许用户进程这么做。

平时我们被灌输的思想是用户进程无法直接访问硬件,必须要向操作系统求助,只有高高在上的操作系统才有能力访问外设。操作系统的职责就是管理计算机中的资源,资源包括软件和硬件,不允许用户进程直接操作外设,这只是操作系统的一种管理策略,因为这是出于对计算机的保护,谁能保证用户程序个个都那么善良可靠呢,万一用户程序非法使用硬件,这种破坏可是难以估量呢,保护计算机安全是操作系统的责任,不应该让不受信任的程序有破坏计算机的可能。

我们在很久以前就介绍过eflags寄存器啦,现在来查看下eflags寄存器的IOPL位,如图

在eflags寄存器中第12~13位便是IOPL(I/O Privilege Level),即IO特权级,它除了限制当前任务进行IO敏感指令的最低特权级外,还用来决定任务是否允许操作所有的IO端口,对,没错,是全部IO端口,IOPL位是打开所有IO端口的开关(用来单独设置端口访问的方式是IO位图,一会介绍)。每个任务(内核进程或用户进程)都有自己的eflags寄存器,所以每个任务都有自己的IOPL,它表示当前任务的要想执行全部IO指令的最低特权级,也就是处理器最低的CPL,只有任务的当前特权级大于等于IOPL才允许执行全部IO指令,即数值上CPL <= IOPL。

CPL为0时处理器是法力无边的,所以0特权级下处理器是不受IO限制的。IOPL如何设置呢?下节再说。

一步步编写操作系统 59 cpu的IO特权级1相关推荐

  1. 一步步编写操作系统 60 cpu的IO特权级2 什么是驱动程序

    用户程序可以在由操作系统加载时通过指定整个eflags设置,操作系统如何设置自己的IOPL呢,即使内核IOPL为0也得写进去eflags寄存器中才生效.可惜的是,没有直接读写eflags寄存器的指令, ...

  2. 一步步编写操作系统 25 cpu的保护模式

    在保护模式下,我们将见到很多在实模式下没有的新概念,很多都是cpu硬件原生提供,并且要求的东西,也就是说按照cpu的设计,必须有这些东西cpu才能运行.咱们只要了解它们是什么并且怎么用就行了,不用深入 ...

  3. 一步步编写操作系统 15 CPU与外设通信——IO接口,下

    既然都说到IO接口了,不知道各位有没有疑问,cpu是怎样访问到IO接口呢?肯定得有个链路吧?什么?有隐约听到有同学开玩笑说:cpu用无线访问其它设备.哈哈,不知道各位听说过没有,无线的终端是有线.无论 ...

  4. 一步步编写操作系统 14 CPU与外设通信——IO接口 上

    介绍显卡之前,必须得和大家交待清楚,那么多的外部设备,cpu是如何与他们交流. 大家都学过微机接口技术吧?没学过也没关系,反正我也只是笼统地说说^_^,保证大家一定能看得懂. 按理说,如果硬件种类较少 ...

  5. 一步步编写操作系统 30 cpu的分支预测简介

    人在道路的分岔口时要预测哪条路能够到达目的地,面对众多选择时,计算机也一样要抉择,毕竟计算机的运行方式是以人的思路来设计的,计算机中的抉择其实就是人在抉择. cpu中的指令是在流水线上执行.分支预测, ...

  6. 一步步编写操作系统 29 cpu缓存简介

    缓存是20世纪最大的发明,其原理用一些存取速度较快的存储设备做为数据缓冲区,避免频繁访问速度较慢的低速存储设备,归根结底的原因是,低速存储设备是整个系统的瓶颈,缓存用来缓解"瓶颈设备&quo ...

  7. 一步步编写操作系统 31 cpu的分支预测 下

    让我们说说预测的算法吧. 对于无条件跳转,没啥可犹豫的,直接跳过去就是了.所谓的预测是针对有条件跳转来说的,因为不知道条件成不成立.最简单的统计是根据上一次跳转的结果来预测本次,如果上一次跳转啦,这一 ...

  8. 一步步编写操作系统 28 cpu乱序执行

    乱序执行(乱序执行译作异步执行更贴切),是指在cpu中运行的指令并不按照代码中的顺序执行,而是按照一定的策略打乱顺序执行,也许后面的指令先执行,当然,得保证指令之间不具备相关性. 举个简单的例子,比如 ...

  9. 一步步编写操作系统 10 cpu的实模式

    cpu的实模式 由于mbr在实模式下工作--什么?什么是实模式?这时候有同学打断了我.我心想,这下好办了--哈哈,没有啦,开个玩笑而已.我们这里所说的实模式其实就是8086 cpu的工作环境.工作方式 ...

最新文章

  1. 【解决方案】调用multiprocessing中创建的文件无法打开的问题FileNotFoundError: [WinError 2]
  2. 算法解读 ---- 递归(一)
  3. django不修改数据库创外键_python小项目使用django的数据库模型
  4. 2019\Province_C_C++_B\试题C-数列求值
  5. Web服务-Nginx网页服务
  6. 20170822 前端开发日报
  7. maple 假设_Maple常用计算命令..
  8. Eclipse之ANT使用
  9. bzoj 3751: [NOIP2014]解方程(同余系)
  10. 内核和用户空间异步通信
  11. MyBatis 是一款优秀的持久层框架
  12. unity NOPI 创建word文档
  13. 2018二月安恒月赛WRITE UP
  14. MIPI.DSI.LCD點屏筆記_AT070TN92(800x480)_THC63LVDF84B_深圳富元智FX6
  15. linux 压缩 解压缩命令详解
  16. GB50016计算机房设计规定,为什么GB50016-2014《建筑设计防火规范》不包含防排烟系统实施规定?...
  17. codeforces1155F Delivery Oligopoly
  18. 理解ARC在Objective-C中的应用
  19. python数据可视化读取excell文件绘制图像详细教程
  20. JAVA实验二:设计一个教师类Teacher(属于cn.net.sdkd包)实现接口进行排序等

热门文章

  1. mysql六:数据备份、pymysql模块
  2. 推荐一款非常强大的扒站工具
  3. [Zhuan]Lua about
  4. Oracle高级SQL培训与讲解
  5. SQL 取n到m条记录
  6. linux 网络设备 安装,Linux_Linux系统配置网络详解,一.安装和配置网络设备- phpStudy...
  7. B. The Cake Is a Lie
  8. csv格式清洗与转换python_实例详解Python中 CSV格式清洗与转换
  9. js密码强度正则表达式_知道这20个前端正则表达式,能让你做项目时少写1000行甚至一万行
  10. 使用junit+mockito进行mock测试实例