代码跨段 详细步骤

本质就是修改CS段寄存器

JMP 0x20:0x004183D7 CPU如何执行这行代码?

(1) 段选择子拆分

0x20 对应二进制形式 0000 0000 0010 0000

RPL = 00   
TI = 0
Index = 4
(2) 查表得到段描述符

TI = 0 所以查GDT表

Index = 4 找到对应的段描述符

四种情况可以跳转:代码段、调用门、TSS任务段、任务门
(3) 权限检查

如果是非一致代码段,要求:CPL == DPL 并且 RPL <= DPL

如果是一致代码段,要求:CPL >= DPL
(4) 加载段描述符

通过上面的权限检查后,CPU会将段描述符加载到CS段寄存器中.

(5) 代码执行

CPU将 CS.Base + Offset 的值写入EIP 然后执行CS:EIP处的代码,段间跳转结束.

对于一致代码段:也就是共享的段
□ 特权级高的程序不允许访问特权级低的数据:核心态不允许访问用户态的数据
□ 特权级低的程序可以访问到特权级高的数据,但特权级不会改变:用户态还是用户态

对于普通代码段:也就是非一致代码段
□ 只允许同级访问
□ 绝对禁止不同级别的访问:核心态不是用户态,用户态也不是核心态.


       直接对代码段进行JMP 或者 CALL的操作,无论目标是一致代码段还是非一致代码段,CPL都不会发生改变.如果要提升CPL的权限,只能通过调用门.

原文链接: 代码跨段 详细步骤 版权所有,转载时请注明出处,违者必究。
注明出处格式:流沙团 ( https://gyarmy.com/post-412.html )

发表评论

0则评论给“代码跨段 详细步骤”