- 论坛徽章:
- 0
|
在intel手册-卷3里面看到,TSS只能在GDT中定义,不能在LDT和IDT中定义,并且对于 tss.esp0, tss.ss0, tss.ss1, tss.esp1, tss.ss2, tss.esp2 在初始化设置了之后就不能(由CPU)动态更改。那就意味着所有的任务都共用一个TSS。那我就有个疑问:
假设:
A1(ring0),A2(ring0)
B1(ring1),B2(ring1)
C1(ring2),C2(ring2)
D1(ring3),D2(ring3)
TSS的栈指针:
tss.esp0/ss0: stack0
tss.esp1/ss1: stack1
tss.esp2/ss2: stack2
-----------------------------------
那么:
以下的栈切换:
B1 -> A2 : B1自己的堆栈切换至stack0,最后在切换至A2自己的堆栈
C1-> A2 : C1自己的堆栈切换至stack0,最后在切换至A2自己的堆栈
C1 -> B2 : C1自己的堆栈切换至stack1,最后在切换至B2自己的堆栈
D1 -> B2 : D1自己的堆栈切换至stack1,最后在切换至B2自己的堆栈
D1 -> C2 : D1自己的堆栈切换至stack2,最后在切换至C2自己的堆栈
如果按照intel手册上说的,那上面的栈切换都能成功,也就是说,所有的任务转移(涉及到特权级变化,由低到高),在利用TSS切换时都是对应相同的栈(例如转移到0级,都用stack0,不管是那个任务)。
是应该这样理解吗?(我以前一直认为每个任务对应一个TSS,也怕是自己看intel手册的是否翻译错了......)
[ 本帖最后由 ts0612 于 2009-7-14 22:53 编辑 ] |
|