-
-
[原创]cpu任务段任务门
-
发表于: 2022-4-20 14:54 15469
-
cpu设计之初是为操作系统任务切换提供了硬件支持(任务门和TSS任务段),以下几个概念
TR寄存器:是一个段寄存器,和CS,SS,FS,GS,DS段寄存器一样一共96位,包含可见的16位和80位的不可见部分,所以加载任务段(LTR指令),会查找gdtr寄存器中的全局描述符表,将对应的段描述符(TSS段描述符)加载到tr寄存器
TSS任务段:实际是一块内存,存放了所有寄存器的值,因为cpu设计的任务切换需要将所有的寄存器都替换掉(eip指向新的代码位置,esp指向新的栈位置),这样就是一个新的任务,可以使用windbg查看tss任务段的结构:
任务门 :任务门是一个系统段描述符,存放在全局中断描述符表中
P位表示当前描述符是否有效
DPL当前特权级别
S位为0表示系统段,位1表示位数据或者代码段
Type域为0101是任务门
TSS Segment Selector ,为任务段描述符
任务门和中断门一样,使用int指令调用
TSS段描述符:存在于gdt表中,和gdt表中其他段描述符一样,baseaddress为基地址,指向一块TSS任务段,结构如下:
以下是我当前环境的tr寄存器对应的任务门描述符:
81008b10`300020ab为当前tr寄存器对应的TSS段描述符
段基址为0x81103000
G位为0表示当前界限是以字节对其
D位L位为0
界限为0x20ab,刚好是windbg中_kTSS结构的大小
如何使用任务段和任务门:
任务段可以和调用门一样,直接使用jmp far指令或者call far指令进行调用,但是当前cpu权限(CPL)要大于等于任务段描述符中的DPL,所以不能提权,只能平级调用,也可以使用int指令,当cpu发现中断号下的中断描述符为任务门时,使用TSS段描述符查找gdt表,执行tss段中的eip地址实现任务切换
赞赏
- [原创]windows堆内存管理及调试技巧 15098
- [原创]cpu任务段任务门 15470
- [原创]关于X64程序中RUNTIME_FUNCTION,UNWIND_INFO,UNWIND_CODE结构理解 6737
- 调试器原理分析 3684