潍坊seo关键词排名,seo推广分析关键词的第一个步骤,网站空间商那个好,重庆seo网站建设【0】写在前面
0.1#xff09;我们讲 CPU的保护机制#xff0c;它是可靠的多任务运行环境所必须的#xff1b;0.2#xff09; CPU保护机制#xff1a;分为段级保护 页级保护#xff1b; 0.2.1#xff09;段级保护分为#xff1a;段限长 limit 检查、段类型 type 检查…【0】写在前面
0.1我们讲 CPU的保护机制它是可靠的多任务运行环境所必须的0.2 CPU保护机制分为段级保护 页级保护 0.2.1段级保护分为段限长 limit 检查、段类型 type 检查、特权级检查、等等……0.3我们着重讲 段特权级检查bit 6~5 特权级检查又分为访问数据段时的特权级检查 代码段之间转移控制时的特权级检查这里我们着重讲 代码段间转移控制时的特权级检查0.4版权声明本文部分内容图片总结于李炯的“Linux内核完全剖析“ 【1】进入代码段间转移控制时的特权级检查引入门的概念 1.0使用jmp 或 call 指令可以实现以下4 种转移
1目标操作数包含目标代码段的段选择子2目标操作数指向一个包含目标代码段选择子的调用门描述符3目标操作数指向一个包含目标代码段选择子的TSS3目标操作数指向一个任务门 这个任务门指向一个包含目标代码段选择子的TSS
1.1直接调用或跳转到代码段 Attention JMP、CALl 和 RET指令的近转移只是在当前代码段中执行程序控制转移因此不会执行特权级检查JMP、CALL和 RET 指令的远转移 会把 控制转移到 另一个代码段中因此处理器会进行特权级检查
1.1.1当不通过调用门把程序控制权转移到另一个代码段时处理器会验证4种特权级和类型信息验证如何验证 拿 CPL和 选择子中的RPL 去和目的段描述符中的DPL 进行比较验证 1. 当前特权级 CPL2. 含有被调用过程的目的代码段描述符中的描述符特权级 DPL 3. 目的代码段的段选择子中的请求特权级 RPL4. 目的代码段描述符中的一致性标记 C 它确定了一个 代码段是非一致代码段C0还是 一致代码段C1
1.1.2如何验证-Validation
V1当访问非一致代码段C0CPL 必须等于 目标代码段的DPL 同时要求 RPL 小于 DPL 即RPL的特权级大于DPL才能使得转移成功 当非一致代码段的段选择子 被加载进 CS寄存器中 特权级字段不会改变即它仍然是 调用者的CPLV2当访问一致代码段时C1 调用者的CPL 在数值上大于或等于目的代码段的 DPL 即DPL 的特权级要比 CPL大 对于一致代码段的访问处理器忽略对 RPL 的检查 当程序控制被转移到一个 一致代码段中 CPL并不改变 即使目的代码段的DPL在数值上小于CPL由于 CPL 没有改变 因此堆栈也不会发生切换最后 大多数代码段都是非一致代码段 对于非一致代码段 程序的控制权只能转移到 具有 相同特权级的代码段中 除非转移时通过一个调用门进行的 最后这就是调用门存在的意义所在了即调用门可以实现不同特权级间的非一致代码段的跳转
1.2门描述符 1.2.1为了对具有不同特权级的代码段提供受控的访问处理器提供了称为门描述符的特殊描述符集有4种门描述符
1. 调用门call gate 类型TYPE12 用于在不同特权级间实现受控的程序控制转移访问调用门要求CPL和RPL必须小于或等于调用门的DPL干货2. 陷阱门trap gate类型TYPE15用于调用异常和中断的处理程序3. 中断门interrupt gate类型TYPE14用于调用异常和中断的处理程序4. 任务门task gate类型TYPE5用于任务切换
1.2.2调用门的功能
1. 指定要访问的代码段2. 在指定代码段中定义程序的一个入口点3. 指定访问过程的调用者需要具备的特权级4. 若会发生堆栈切换 它会指定在堆栈间需要复制的可选参数的个数5. 指明调用门描述符是否有效 ; 门的定义紧跟在描述符定义之后
; 门 目标选择子,偏移,DCount, 属性
LABEL_CALL_GATE_TEST: Gate SelectorCodeDest, 0, 0, DA_386CGateDA_DPL0 ;(8Ch 00h)1.3通过调用门访问代码段
1.3.1 当处理器访问调用门时 它会使用调用门中的段选择符来定位目的代码段的段描述符。然后, CPU 会把代码段描述符的基地址与调用门中的偏移地址进行组合形成代码段中指定程序入口点的线性地址这里生成了线性地址注意要和分页机制联系起来如果开启分页机制的话 SelectorCallGateTest equ LABEL_CALL_GATE_TEST - LABEL_GDTLABEL_CALL_GATE_TEST: GateSelectorCodeDest, 0, 0, DA_386CGateDA_DPL0 ;(8Ch 00h)SelectorCodeDest equ LABEL_DESC_CODE_DEST - LABEL_GDT1.3.2通过调用门进行程序控制转移时 CPU会对4种 不同特权级进行检查
1. 当前特权级 CPLCS 和 SS 中的 bit1~02. 调用门选择子中的请求特权级RPL选择子数据结构 bit1~03. 调用门描述符中的描述符特权级 DPL段描述符数据结构低4字节 bit6~54. 目标代码段描述符的 DPL同上5. 目的代码段描述符中的一致性标志C 也要检查段描述符数据结构 的 bit10 Attention访问调用门的条件干货 为了访问调用门 调用者程序的特权级CPL 必须小于或等于 调用门的 DPL 而且门段选择子RPL 也必须小于或者等于调用门的DPL 1.3.3如何验证-Validation通过call 或 jmp 访问调用门的特权级检查
V1第一步是检查调用者的特权级 与 调用门的特权级 是否符合特权级访问规则 V2如果第一步成功 则CPU 才会把 调用者的 CPL 与 调用门目的代码段的DPL特权级进行比较检查 CALL指令只有 CALL 指令 可以通过调用门把程序控制转移到特权级更高的非一致性代码段中JMP指令 JMP指令 只能通过调用门吧控制转移到 DPL CPL 的非一致性代码段中CALL指令 JMP指令 这两条指令都可以把控制转移到 更高特权级的一致性代码段中即转移到 DPL数值 小于或等于CPL的一致性代码段中
1.3.4转移之后CPU都干了什么
1目标代码段是更高特权级的非一致性代码段如果一个调用吧控制转移到更高特权级的非一致性代码段中 那么CPL 就会设置 成 目的代码段中的DPL值 堆栈也会发生切换2目标代码段是更高特权级的一致性代码段如果一个调用吧控制转移到更高特权级的一致性代码段中 那么CPL 不会发生改变 堆栈也不会发生切换
1.4调用门的作用
1.4.1 调用门可以让一个代码段中的过程 被不同特权级的程序访问 例如位于一个代码段中的os 代码可能含有os 自身和 应用软件都允许访问的代码故 可以为这些代码设置一个所有特权级代码都能访问的调用门1.4.2另外可以专门为仅用于os 的代码设置一些更高特权级的调用门 【2】堆栈切换 从被调用过程返回
如“转移之后CPU都干了什么”模块中提到 如果一个调用吧控制转移到更高特权级的非一致性代码段中 那么CPL 就会设置 成 目的代码段中的DPL值 堆栈也会发生切换
2.1堆栈切换的目的
1为了防止高特权级程序由于栈空间不足而引起崩溃2同时也为了防止低特权级程序通过共享的堆栈有意或无意地干扰高特权级的程序
2.2堆栈切换带来的问题
1出现的问题 call 指令 执行前后的堆栈已经不再是同一个堆栈 了那么我们在堆栈A中压入参数和返回地址 需要出栈ret or retf时堆栈却变成了堆栈B 这该怎么办呢2解决方法 Intel提供一种机制 将堆栈A的内容复制到 堆栈B中 如下图
2.3从被调用过程返回