有关TSS
在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 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
1、“当前”--- 这个语意
2、TSS 的数量 1 ~ n
说实在的是懒得讲。
看置顶贴子
你懂就说,不懂就哪凉快哪去呆着,不要扯。
当版主得像当版主样。
这个版已经冷到一天没有一个帖了,你当版主还这德性?
能不能象个爷样?
这么大的怨气,整个怨妇样!
你来申请呀,有人支持你,我一定申请退位给你。咱个爷们,说到做到。
你以版主是啥?
谁要做你那样的版主?脑筋正常一点。
门口挂几片臭肉,嘴里只会说:懒得说,他就会扯。这样就算爷们了?
别像在家里和父母说话一样任性,在外面,没人吃你这一套。既然做版主,就得先学会好好说话。