交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
4 特权等级
分享
未结
0
2579
李延
LV6
2022-10-30
悬赏:20积分
# 1 特权级作用 目前我们知道在保护模式下,通过将内存分成大小不等的段,并使用段寄存器使各自任务访问自己的段内存,就可以是程序各自运行,互不影响。 但是,一个失控的程序或者恶意的程序如何保证它自己老老实实只访问自己的段。比如某个程序知道系统中GDT的位置,它通过修改段寄存器访问其他数据。基于这个问题,我们需要了解特权级这个概念。 # 2 特权级概念 cpu的保护机制提供4个特权级别,分别为0-3。数值越大,特权越小,如下图:  对于特权0是最高特权登记,一般用于操作系统,外面的环给不是很重要的软件使用。一般用户用户程序。 **linux 系统**中只使用了特权0和特权3,分别对应内核态和用户态,我们常说的用户态与内核态的切换就是对应特权0和特权3的切换过程。 ## 2.1 特权0的权限 对于一些cpu的指令,只有在特权为0的情况下才可以执行,比如修改 `lgdt` 指令,这样就可以保证,只有我们操作系统的代码可以修改GDT 表格,确保其他普通程序只访问自己的数据。 ## 3 特权级校验过程 ## 3.1 特权级类型 cpu对于特权等级的校验是,通过识别下面3种类型的特权等级: - **前特权级(CPL)** 至cpu当前正在运行的特权等级,它存在 CS 段寄存 器和 SS 段寄存器的第 0 位和第 1 位中 - **描述符特权级(DPL)**DPL 是段或门的特权级。也就是当前要运行代码的特权等级 - **请求特权级(RPL)**RPL 是赋给段选择子的取代性特权级,存储在段选择子 的第 0 位和第 1 位。 ### 3.1.1 RPL的校验 处理器检验 RPL 的同时也检验 CPL 来决定对段的访问是否 被允许。即使请求访问的进程或任务有足够的特权(也就是说 CPL 权限够了— —译注)去访问一个段,但是,如果 RPL(即指向将要去访问的这个段的段描 述符的段选择子中的 RPL——译注)的特权级不够,访问会被拒绝。也就是说, 如果这个段选择子的 RPL 在数值上大于 CPL,RPL 就取代 CPL,反之亦然。RPL 可用来确保特权代码不代表应用程序去访问的一个段,除非这个应用程序本身 有这个段的访问特权。 ## 3.2 校验逻辑 ### 3.2.1 数据段的校验 对于数据段寄存器,(DS、ES、FS、GS、SS)。我们可以通过指令mov、POP、LES等将段选择子装入到寄存器中,这个时候,我们就需要通过CPL、DPL、RPL 进行校验。 ``` 如果 DPL 在数值上大于或者等于 CPL 和 RPL,则处理器将段选择子 装入段寄存器。否则,处理器会产生一个一般保护异常,不装载段寄存器。 ``` ### 3.2.2 代码段的校验 对于代码段,也就是关于CS寄存器的修改,只可以通过 远端跳转,及`ljmp`或 `lcall` 指令。而指令后的操作符可以为: - 目标操作数含有目标代码段的段选择子 - 目标操作数指向一个调用门的描述符,该描述符含有目标代码段的段选择子 - 目标操作数指向一个 TSS,该 TSS 保护目标代码段的段选择子 - 目标操作数指向一个任务门,这个任务门指向一个 TSS,这个 TSS 含有目标代 码段的段选择子
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号