操作系统---IO权限管理和敏感指令
简化版
使用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位图。
怎么写代码?
- 表示I/O位图地址、I/O位图自身。
- I/O位图自身
- 全部bit的数量并不一定需要是65536个。
- 只需用
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权限管理和敏感指令的更多相关文章
- Linux 实用指令(5)--组管理和权限管理
目录 组管理和权限管理 1 Linux组基本介绍 2 文件/目录 所有者 2.1 查看文件的所有者 2.2 修改文件所有者 3 组的创建 3.1 基本指令 3.2 应用实例 4 文件/目录 所在组 4 ...
- Linux操作系统(2):组管理和权限管理
组管理和权限管理 Outline 1.查看文件所有者:ls -ahl 2.更改文件或目录权限命令:chmod 3.更改文件或目录所有者命令:chown 4.更改文件或目录所属组命令:chgrp 1)组 ...
- Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理4
首先先加个区域,名为Admin using System.Web.Mvc; namespace AuthorDesign.Web.Areas.Admin { public class AdminAre ...
- ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十三节--RBAC模式及ABP权限管理(附送福利)
ABP+AdminLTE+Bootstrap Table权限管理系统一期 Github:https://github.com/Jimmey-Jiang/ABP-ASP.NET-Boilerplate- ...
- 理解OpenShift(4):用户及权限管理
理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...
- vue基于d2-admin的RBAC权限管理解决方案
前两篇关于vue权限路由文章的填坑,说了一堆理论,是时候操作一波了. vue权限路由实现方式总结 vue权限路由实现方式总结二 选择d2-admin是因为element-ui的相关开源项目里,d2-a ...
- Linux命令--权限管理
chmod命令 Linux/Unix 的文件调用权限分为三级 : 文件拥有者.群组.其他.利用 chmod 可以藉以控制文件如何被他人所调用. 使用权限 : 所有使用者 语法 chmod [-cfvR ...
- HADOOP docker(七):hive权限管理
1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户 ...
- 杂项-权限管理:RBAC
ylbtech-杂项-权限管理:RBAC 基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注.在RBAC中, ...
随机推荐
- hdu 4521 小明系列问题——小明序列 线段树
题意: 给你一个长度为n的序列v,你需要输出最长上升子序列,且要保证你选的两个相邻元素之间在原数组中的位置之差大于d 题解: 这个就是原来求最长上升子序列的加强版,这个思路和最长上升子序列的差不多 ...
- Codeforces Round #343 (Div. 2) E. Famil Door and Roads (树形dp,lca)
Famil Door's City map looks like a tree (undirected connected acyclic graph) so other people call it ...
- 牛客练习赛70 D.数树 (模拟,STL)
题意:每次有\(3\)中操作,对两个点连条边,删去某条边,或者问当前大小不为\(1\)的树的数量.连重边或者删去一条不存在的边,这样的白痴操作可以无视qwq. 题解:水题,用map存一下pair然后分 ...
- 已处理证书链,但是在不受信任提供程序信任的根证书中终止 - Windows 7安装.Net Framework 4.6.2时出现此问题
https://blog.csdn.net/inchat/article/details/104294302
- 01.原生态jdbc程序中问题总结
1.数据库启动包配置到工程目录中(mysql5.1) mysql-connector-java-5.1.7-bin.jar 2.jdbc原生态操作数据库(程序) 操作mysql数据库 1 packag ...
- 【ybt高效进阶2-4-3】【luogu P4551】最长异或路径
最长异或路径 题目链接:ybt高效进阶2-4-3 / luogu P4551 题目大意 给定一棵 n 个点的带权树,结点下标从 1 开始到 N.寻找树中找两个结点,求最长的异或路径. 异或路径指的是指 ...
- ELK Stack 介绍 & Logstash 日志收集
ELK Stack 组成 Software Description Function E:Elasticsearch Java 程序 存储,查询日志 L:Logstash Java 程序 收集.过滤日 ...
- Github markdown页面内跳转
基本操作: 请看这里 最典型的就是[alt_content](#jump) 但有时, jump是不太好直接看出来的, 比如下面这个标题, 格式复杂, 那如何获取相应的jump呢? 在Github中, ...
- 设计模式六大原则 All In one
设计模式六大原则 All In one 开闭原则: 对扩展开放,对修改关闭; 设计模式的六大原则: 0.总原则-开闭原则 对扩展开放, 对修改封闭; 在程序需要进行拓展的时候, 不能去修改原有的代码, ...
- MathJax TeX & LaTeX
MathJax TeX & LaTeX mathcal https://leetcode-cn.com/problems/binary-search/solution/er-fen-cha-z ...