简化版

使用IOPL设置一个特权级的用户程序对所有端口的访问权限,使用I/O位图对一个特权级的用户程序设置个性化的端口访问权限(能访问部分端口、不能访问另外的端口)。

用户程序的CPL<IOPL,用户程序能访问所有端口。否则,从I/O位图中查找用户程序对端口的访问权限。

IOPL存储在eflags中,只能在0特权级的下通过popf、iretd修改。

I/O位图存储在TSS中。

I/O操作也可以看作一种特权资源,也有“访问门槛”。代码段和数据段的访问“门槛”是DPL,存储在段描述符中。

I/O操作的访问门槛存储在eflags的IOPL位。但是否具有I/O操作的权限,还受I/O位图影响。

敏感指令是指这些指令:in、ins、out、outs、pof、iretd。

IOPL

规则

数值上,CPL <= IOPL,权限上,当前代码段的特权级高于或等于IOPL中存储的特权等级,当前代码段才能执行I/O操作。

CPL = 0,用户程序才能执行敏感指令。

eflags

eflags是flags的32位扩展寄存器,保护许多标志位,例如cf、zf等。IOPL也存储在eflags中,占用2个bit,正好能表示四个特权级:00、01、10、11。

更新

没有能直接更新eflags的指令,只能间接修改eflags从而修改IOPL。方法是使用两个指令:popf和iretd。

只有特权级是0的用户程序才能成功修改eflags中的IOPL。特权不是0的用户程序也能执行popf和iretd来修改IOPL,只不过修改无效,也就是说,能执行、无效果、不报错。

popf

popf的示意代码如下:

pushf		; 把eflags中的值入栈
mov [esp], 要更新到eflags中的值
popf ; 把栈中的值存储到eflags

popf除了能修改IOPL,还能修改IF。这不难理解。因为popf是把栈中的整个符合eflags结构的数据更新到eflags中,只需把那个结构的IF位修改为目标值就能修改eflags中的IF位。

popf用来修改IF位的时候,和sti、cli一样是敏感指令,需要满足特权级检查规则:CPL <= IOPL。

popf用来修改IOPL位的时候,需要满足特权级检查规则:CPL = 0。

同一个指令,修改的内容不同,需满足的特权级检查规则不同,这种设计,不好。若我来设计,我会设计成两个指令,每个指令完成各自的功能。

iretd

中断发生时,eflags会入栈中断例程的堆栈。修改这个堆栈中的eflags的值,然后再使用iretd就能把栈中的新eflags值更新到eflags中。

IO位图

IOPL对一个特权级的所有用户程序的I/O权限做“一刀切”的限制,要么这个特权级的所有用户程序拥有所有端口的I/O权限,要么拥有0个端口的I/O权限。IO位图允许对每个用户程序在I/O端口限制上做个性化配置。

如果用户进程的CPL <= IOPL,那么,IO位图的值是多少不影响用户进程的I/O权限。如果用户进程的CPL > IOPL,那么,IO位图的值决定了用户进程能读写哪些I/O端口。

位图

位图,又叫bitmap。一个bit能表示两种值,0或1。1kb的空间拥有1024个bit,1Mb的空间拥有1024*1024个bit。

假如我们的硬件一共有65536个I/O端口,只需要8Kb的空间就能标识出这么多端口的权限状态。给8kb空间中的65536个bit依次编号,若第0号I/O端口在能被当前用户进程读写,将此bit设置为1,否则设置为0;剩余的第1到第65535个bit依次按对应的I/O端口依次设置值。

TSS的尺寸

如果用户程序存在I/O位图,它将出现在用户程序的TSS的顶端。正因为如此,TSS的尺寸是不固定的。如果不包含I/O位图,TSS的尺寸是104字节。如果包含I/O位图,TSS的尺寸是“I/O位图地址 + 8192字节 + 1字节”。

包含/IO位图,TSS的尺寸为什么不是“104字节 + 8192字节 + 1字节”?

因为I/O位图有可能不是紧挨着保存"I/O位图地址"的那个 字节,二者之间可能有空白空间。I/O位图地址是I/O位图在TSS中的偏移量,注意,I/O位图在TSS中,它与TSS中的其他元素都在TSS中。也就是说,从TSS的初始位置开始到I/O位图地址,也许包含部分没有存储数据的空间,都是TSS的一部分。TSS的空间被I/O位图地址分割为两个部分,前一部分的大小是I/O位图地址,后一部分是8192个字节(65536个端口需要65536个bit)+1字节(位图的结束标志必须是0xff)。

说得简单点,就是,I/O位图和TSS中的其他元素可能不是紧紧挨着。

0xff

位图为什么要用0xff作为结束标志?我没有弄明白。

代码

不知道TSS中的保留位是什么,更不知道怎么在代码中表示保留位。这里的代码只保证正确表示I/O位图。

怎么写代码?

  1. 表示I/O位图地址、I/O位图自身。
  2. I/O位图自身
    1. 全部bit的数量并不一定需要是65536个。
    2. 只需用0xff结尾就行。
[SECTION .tss3]
LABEL_TSS3:
;TSS中的其他元素
; 最纠结的语句。$ - LABEL_TSS3是当前行在TSS中的偏移量。
; 本语句占用2个字节,2个字节之后是I/O位图。
dw $ - LABEL_TSS3 + 2
times 12 db 0ffh ; 12个字节,96个bit,都设置为1,表示当前用户程序有端口0到端口95的读写权限。
; 端口96到102只有端口97对当前用户程序开放了读写权限。从右到左编号,所以第2个0表示97号端口。
db 1111101b
; I/O位图的结束标志
db 0xff TSS3_LEN equ $$ - LABEL_TSS3

操作系统---IO权限管理和敏感指令的更多相关文章

  1. Linux 实用指令(5)--组管理和权限管理

    目录 组管理和权限管理 1 Linux组基本介绍 2 文件/目录 所有者 2.1 查看文件的所有者 2.2 修改文件所有者 3 组的创建 3.1 基本指令 3.2 应用实例 4 文件/目录 所在组 4 ...

  2. Linux操作系统(2):组管理和权限管理

    组管理和权限管理 Outline 1.查看文件所有者:ls -ahl 2.更改文件或目录权限命令:chmod 3.更改文件或目录所有者命令:chown 4.更改文件或目录所属组命令:chgrp 1)组 ...

  3. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4

    首先先加个区域,名为Admin using System.Web.Mvc; namespace AuthorDesign.Web.Areas.Admin { public class AdminAre ...

  4. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十三节--RBAC模式及ABP权限管理(附送福利)

    ABP+AdminLTE+Bootstrap Table权限管理系统一期 Github:https://github.com/Jimmey-Jiang/ABP-ASP.NET-Boilerplate- ...

  5. 理解OpenShift(4):用户及权限管理

    理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...

  6. vue基于d2-admin的RBAC权限管理解决方案

    前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-a ...

  7. Linux命令--权限管理

    chmod命令 Linux/Unix 的文件调用权限分为三级 : 文件拥有者.群组.其他.利用 chmod 可以藉以控制文件如何被他人所调用. 使用权限 : 所有使用者 语法 chmod [-cfvR ...

  8. HADOOP docker(七):hive权限管理

    1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户 ...

  9. 杂项-权限管理:RBAC

    ylbtech-杂项-权限管理:RBAC 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC中, ...

随机推荐

  1. httpclient几种请求方式

    一.httpclient 模拟get请求,并获取cookie信息 public class MyCookiesForGet { private String url; //用来读取.propertie ...

  2. SSM框架整合(Spring + SpringMVC + MyBatis)

    搭建环境 使用Spring(业务层)整合其他的框架SpringMVC(表现层)和MyBatis(持久层) Spring框架 创建数据库表 CREATE DATABASE ssm; USE ssm; C ...

  3. java 提供了哪些IO方式

    今天听了杨晓峰老师的java 36讲,感觉IO这块是特别欠缺的,所以讲义摘录如下: 欢迎大家去订阅: 本文章转自:https://time.geekbang.org/column/article/83 ...

  4. python函数传参

    之前一直没有注意过该问题,在leetcode144中写递归发现该问题,不知道递归函数传参是指针还是引用. 参考:http://c.biancheng.net/view/2258.html 如果是不可变 ...

  5. 【非原创】codeforces 1029F Multicolored Markers 【贪心+构造】

    题目:戳这里 题意:给a个红色小方块和b个蓝色小方块,求其能组成的周长最小的矩形,要求红色或蓝色方块至少有一个也是矩形. 思路来源:戳这里 解题思路:遍历大矩形可能满足的所有周长,维护最小值即可.需要 ...

  6. Spring-cloud-netflix-hystrix

    服务注册中心eureka-server已经搭好,并且SPRING-CLOUD-NETFLIX-EUREKA-CLIENT-APPLICATION提供一个hello服务 畏怯还编写一个eureka-cl ...

  7. 转载:FreeRTOS 配置文件详细功能解释

    原文链接:http://blog.sina.com.cn/s/blog_98ee3a930102wf8c.html 本章节为大家讲解FreeRTOS的配置文件FreeRTOSConfig.h中每个选项 ...

  8. 图片转tfrecords

    import numpy as np import tensorflow as tf import time import os import cv2 from sklearn.utils impor ...

  9. NGINX configure auto generator

    NGINX configure auto generator The easiest way to configure a performant, secure, and stable NGINX s ...

  10. js console.log color all in one

    js console.log color all in one console.log color Chrome console.log 语法 / grammar %c, %s, css style ...