JMP指令
jmp 0x20:0x004183D7
调用时的步骤
- 拆分,将0x20拆分成b0010 000,RPL=0;TI=0;index=4
- 查找GDT,找到第五个段描述符;四种情况可以跳转:代码段、调用门、TSS任务段、任务门
- 权限检查,如果是非一致代码段,要求:CPL == DPL 并且 RPL <= DPL;如果是一致代码段,要求:CPL >= DPL(CPL由CS二进制位后两位决定)
- 加载段描述符通过上面的权限检查后,CPU会将段描述符加载到CS段寄存器中.
- 代码执行CPU将 CS.Base + Offset 的值写入EIP 然后执行CS:EIP处的代码,段间跳转结束.
如果想在跳转回来还需要用jmp指令再跳转
对于一致代码段:也就是共享的段
□ 特权级高的程序不允许访问特权级低的数据:核心态不允许访问用户态的数据
□ 特权级低的程序可以访问到特权级高的数据,但特权级不会改变:用户态还是用户态
对于普通代码段:也就是非一致代码段
□ 只允许同级访问
□ 绝对禁止不同级别的访问:核心态不是用户态,用户态也不是核心态.
JMP并不影响堆栈
1、为了对数据进行保护,普通代码段是禁止不同级别进行访问的。用户态的代码不能访问内核的数据,同样,内核态的代码也不能访问用户态的数据.
2、如果想提供一些通用的功能,而且这些功能并不会破坏内核数据,那么可以选择一致代码段,这样低级别的程序可以在不提升CPL权限等级的情况下即可以访问.
3、如果想访问普通代码段ÿ