1.TSS的结构:
TSS不是寄存器,它是一个内存;(包含所有寄存器的值)
2.TSS的作用:
如果切换一个线程那么一定需要切换寄存器;
3.CPU怎么找到TSS内存块呢? 通过TaskRegister段寄存器
TaskRegister段寄存器 的值是CPU启动的时候通过GDT表中 TSS Descrptor (段描述符)加载出来的;
4.TSS Descriptor (TSS段描述符)
如果Type 为 1001 (9)的时候说明这个段描述符没有加载到TR寄存器中
如果Type 为 1011 (B)的时候说明这个段描述符加载到TR寄存器中
5.TR寄存器的读写:
6.修改TR寄存器:
测试实验:
7.实验思路
- 编写测试入口函数
- 构造TSS
- 设计TSS段描述符并安装
构造TSS:
char st[10] = {0}; TSS tss = {// tss的地址根据执行代码自己组合 0x00000000,//link (DWORD)st,//esp0 0x00000010,//ss0 0x00000000,//esp1 0x00000000,//ss1 0x00000000,//esp2 0x00000000,//ss2 0x00000000,//cr3 0x0040fad0,//eip 必填项,不然执行完后cpu不知道回来从哪开始执行 0x00000000,//eflags 0x00000000,//eax 0x00000000,//ecx 0x00000000,//edx 0x00000000,//ebx (DWORD)st,//esp 0x00000000,//ebp 0x00000000,//esi 0x00000000,//edi 0x00000023,//es 0x00000008,//cs 0x00000010,//ss 0x00000023,//ds 0x00000030,//fs 0x00000000,//gs 0x00000000,//ldt 0x20ac0000 };