免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ts0612
打印 上一主题 下一主题

关于TSS的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-06-10 16:02 |只看该作者

回复 #10 lgj1107 的帖子

.............

[ 本帖最后由 sherf 于 2009-6-10 22:23 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2009-06-10 16:46 |只看该作者

回复 #11 sherf 的帖子

能发上来看看吗?

论坛徽章:
0
13 [报告]
发表于 2009-06-10 23:15 |只看该作者

回复 #12 lgj1107 的帖子

代码比较多,贴不了。

其实跟书里的例子差不多的,只是改动了ring2对应的描述符的特权级和注释了TSS的加载语句.

论坛徽章:
0
14 [报告]
发表于 2009-06-10 23:16 |只看该作者
ring0 -> ring1 是不用 TSS 进行 stack 切换的。

是因为,从 ring0 返回到 ring1 时,ring1 的 stack pointer(SS & esp)保存在 ring0 的 stack 中。



首先,要搞清楚一个概念:x86 不支持从高权限转到低权限上。也就是不能从 ring0 代码里 call/jmp 到 ring 1、2、3 代码。
   只能从低权限转到高权限上,也就是从 ring3->0、1、2; ring2 -> 0、1;  ring1->ring0; ring0 - > ring0
  
所以:
   只能从高权限代码返回到低权限上。

因此:
  ring0 -> ring1 这种情况产生于: ring1 代码 call  ring0 代码后,由 ring0 代码 ret 到 ring1 代码上。



再者:
  当 ring1 -> ring0 时,processor 会使用 TSS 中的 ss0 & esp0 切换到 0 级的 stack 上,而 ring1 的 ss 和 esp 会保存在 ring0 的 stack 上。
  当 ring0 返回到 ring1 时,processor 会 pop 出原来 ring1 的 ss 和 esp,从而实现切换到原来的 stack




  

论坛徽章:
0
15 [报告]
发表于 2009-06-10 23:42 |只看该作者

回复 #14 mik 的帖子

ring0 -> ring1 是不用 TSS 进行 stack 切换的。

特权及变换了不需要TSS?

论坛徽章:
0
16 [报告]
发表于 2009-06-10 23:56 |只看该作者
原帖由 lgj1107 于 2009-6-10 23:42 发表
ring0 -> ring1 是不用 TSS 进行 stack 切换的。

特权及变换了不需要TSS?


汗~~
我上面说了一大通,你是没看,还是不明白

论坛徽章:
0
17 [报告]
发表于 2009-06-11 02:33 |只看该作者
原帖由 mik 于 2009-6-10 23:16 发表
ring0 -> ring1 是不用 TSS 进行 stack 切换的。

是因为,从 ring0 返回到 ring1 时,ring1 的 stack pointer(SS & esp)保存在 ring0 的 stack 中。



首先,要搞清楚一个概念:x86 不支持从高权限转 ...



mik,

我大体上能明白你所说的,但有一点,“从 ring0 返回到 ring1 时,ring1 的 stack pointer(SS & esp)保存在 ring0 的 stack 中”这一步是谁做的?是系统自动完成的吗(类似于从 ring1->ring0 系统自动从TSS中取ss0:esp0)?如果是系统自动完成,那系统如何知道ss1:esp1到底放在ring0:stack里面的哪个单元?是不是说,在返回之前我要额外调整esp0,使它指向ring0:stack中的ss1:esp1?

[ 本帖最后由 ts0612 于 2009-6-11 02:37 编辑 ]

论坛徽章:
0
18 [报告]
发表于 2009-06-11 10:39 |只看该作者

回复 #17 ts0612 的帖子

mik,

在吗?

论坛徽章:
0
19 [报告]
发表于 2009-06-11 11:14 |只看该作者

回复 #16 mik 的帖子

你写的那些解释不了他那个 ,在不加载TSS的情况下 从RING0切换到RING1去了 。我想来想去就是不明白他是怎么成功的
切换指令就这些:
LJMP TSS_SEL:0X0
LCALL TSS_SEL:0X0
RETF
IRETD

没有TSS怎么从RING0切换到RING1呢?

论坛徽章:
0
20 [报告]
发表于 2009-06-11 11:54 |只看该作者
原帖由 mik 于 2009-6-10 23:16 发表
ring0 -> ring1 是不用 TSS 进行 stack 切换的。

是因为,从 ring0 返回到 ring1 时,ring1 的 stack pointer(SS & esp)保存在 ring0 的 stack 中。



首先,要搞清楚一个概念:x86 不支持从高权限转 ...


讲解的非常清楚,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP