TSS内存块
这是我认为的TSS内存块,但我不知道这样认为对不对,所以希望有人一起讨论,或告诉我错在哪里?英特尔的思想是:
每个任务都有一个TSS内存块和一个TSS段描述符。
任务切换时,将原来任务的寄存器都保存在原来TSS段描述符对应的TSS内存块中,然后将目标任务的TSS段描述符加载到TR寄存器中。使用jmp或call就能够全部切换。
提权时,调用门中断门等门进行提权,其中提权后的cs和eip由门中代码段描述符和门中偏移给出。ss和esp则由此时TR指向的TSS内存段给出。
随着任务切换,TR永远指向当前任务的TSS内存段。
windows的思想是:
认为英特尔设计的线程切换不好,费时间。所以windows直接用栈来替换所有寄存器。
但在提权中,因为英特尔设计的CPU必须用到TSS才能提权。所以没办法windows只能用TSS内存段。但它和英特尔思想不同的是,TR永远指向同一块内存,也就是TR的值永远不会变。但是TR的值不变,我不同线程提权进0环怎么办呢。所以每次切换线程时,windows都将线程结构体中保存的esp0和ss0放到TR指向的TSS内存块中。这样,我就能保证不同线程提权时,都指向当前线程的esp0和ss0.
页:
[1]