TSS任务状态段的问题

ASMsuperlover 2006-05-17 07:54:10
任务状态段TSS中有一个区域叫做“内层堆栈指针区域”,书上对其有如下2段解释:

“TSS的内层堆栈指针区域中有三个堆栈指针,它们都是48位的全指针(16位的选择子和32位的偏移),分别指向0级、1级和2级堆栈的栈顶,依次存放在TSS中偏移为4、12及20开始的位置。当发生向内层转移时,则把适当的堆栈指针装入到SS及ESP寄存器以变换到内层的堆栈,外层堆栈的指针保存在内层堆栈中。没有指向3级堆栈的指针,因为3级是在最外层的,所以任何一个向内层的转移都不可能转移到3级。
但是,当特权级由内层向外层变换时,并不把内层堆栈的指针保存到TSS的内层堆栈指针区域。这表明向内层转移时,总是把内层堆栈认为是一个空栈。因此,不允许发生同级内层转移的递归,一旦发生向某级内层转移,那么返回到外层的正常途径是相匹配的向外层返回。”

可能是本人水平有限,这两段话我实在是没有理解:
1.在第一段中,“当发生向内层转移时,......,外层堆栈的指针保存在内层堆栈中”,最后半句“外层堆栈的指针保存在内层堆栈中”是什么意思呢?是不是作者的笔误,应该为“保存到‘内层堆栈指针区域’中”?如果不是笔误,那为什么要“保存在内层堆栈中”呢?
2.在第二段中,“当特权级由内层向外层变换时,并不把内层堆栈的指针保存到TSS的内层堆栈指针区域。这表明向内层转移时,总是把内层堆栈认为是一个空栈”,为什么“当特权级由内层向外层变换时,并不把内层堆栈的指针保存到TSS的内层堆栈指针区域”就能够表明“向内层转移时,总是把内层堆栈认为是一个空栈”呢?有因果关系么?
3.还是第二段,最后一句话“因此,不允许发生同级内层转移的递归,一旦发生向某级内层转移,那么返回到外层的正常途径是相匹配的向外层返回”,这句完全不理解,首先认为前半句话“不允许发生同级内层转移的递归”和后半句话“一旦发生向某级内层转移,那么返回到外层的正常途径是相匹配的向外层返回”没有逻辑关系,其次就是前半句话和后半句话的含义都没理解——为什么“不允许发生同级内层转移的递归”(这里,“同级内层转移的递归”的含义不懂),又为什么“一旦发生向某级内层转移,那么返回到外层的正常途径是相匹配的向外层返回”(这里,“相匹配的向外层返回”的含义也没弄清楚)。

大家看了我的问题之后,相信应该知道,我对这个“内层堆栈指针区域”根本就没理解阿,希望高手能够给我指点一下,先谢谢了。
...全文
470 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Areslee 2006-05-22
  • 打赏
  • 举报
回复
抱歉,回家后才发现书在公司,然后又忘了上来解释下
我看了你说的两段了,是P393的吧
第一段是这样理解:
  当从外层转移到内层时系统会把返回地址和外层堆栈的指针保留到内层堆栈中,比如:从R3调用R0的服务,CPU会把R3的堆栈、返回地址都压入R0的堆栈中,以备返回时使用。

第二段:
  所谓“一旦发生向某级内层转移,那么返回到外层的正常途径是相匹配的向外层返回”。意思是说,从外层到内层,可以通过CALL/JMP来直接转移,但从内层到外层,不能直接通过CALL/JMP,只能通过远程RET,这样做的原因是为了确保内层的堆栈不被外层代码得知,而不是“这表明向内层转移时,总是把内层堆栈认为是一个空栈”。
至于递归调用那个说法,我也不是很明白
关于这方面的内容,你可以参考INTEL的CPU手册
Chapter 6.3.6. CALL and RET Operation Between Privilege Levels ,in the Intel Base Architecture, Volume 1,
Chapter 4, Protection, in the Intel Architecture Software Developer’s Manual, Volume 3,
ASMsuperlover 2006-05-20
  • 打赏
  • 举报
回复
to Areslee(懒虫易水):

不是说昨天晚上给我回复吗?可是没有回复啊?
ASMsuperlover 2006-05-19
  • 打赏
  • 举报
回复
Areslee(懒虫易水):

我有这本书的电子版,方便的话留个邮箱,给你发过去
ASMsuperlover 2006-05-19
  • 打赏
  • 举报
回复
杨季文的<<80X86汇编语言程序设计教程>>
Areslee 2006-05-19
  • 打赏
  • 举报
回复
写错了,是忙
Areslee 2006-05-19
  • 打赏
  • 举报
回复
椭园遇到问题,后来又慢,一直没解决
ASMsuperlover 2006-05-19
  • 打赏
  • 举报
回复
To Areslee(懒虫易水):

等你的回复...
大熊猫侯佩 2006-05-19
  • 打赏
  • 举报
回复
To Areslee(懒虫易水)

好久没见你出来活动了,图形库做的怎么样了?
Areslee 2006-05-19
  • 打赏
  • 举报
回复
杨季文的书啊,我倒是有,查查去,晚上给你回复
WYlslrt 2006-05-19
  • 打赏
  • 举报
回复
内层堆栈,我个人理解,只是为了程序陷入到操作系统内核的时候,对各个进程的分割保护,因为系统调用或中断在每个进程的空间下所使用的堆栈空间是不同的,这样就可以一定程度上解决了“重入”问题,将外层堆栈指针放入到内核堆栈中是为了向外层返回时,保证外层堆栈的正确。
至于为何向外层返回时,不保存到TSS里,这个我认为无所谓,如果你想保存,你可以人为的存入,这个内层堆栈也只是个临时的,堆栈指针不保存反而会加快处理速度,增加代码执行效率。既然不保存堆栈指针设定好了以后,那么就不会变,所以每一次向内层切换就好像一个没有一个用过的堆栈转移,就像是空堆栈。
不允许向同级内层切换,实际上是根据上面所决定的,既然你在这一极了,你的堆栈指针肯定是从tss中读取,并建立堆栈的,但是又向tss读取该级的spn,这样就将你先前的堆栈内容给覆盖掉了。
ASMsuperlover 2006-05-18
  • 打赏
  • 举报
回复
to Areslee(懒虫易水):

不太明白,能不能解释的详细一点儿呢?或者推荐一些资料?
Areslee 2006-05-18
  • 打赏
  • 举报
回复
这什么书啊?解释得够拗口的

TSS为0-2级准备了专门的存放SS:ESP的位置
对于3级就直接存放到SS:ESP的域
Areslee 2006-05-18
  • 打赏
  • 举报
回复
什么书?
ASMsuperlover 2006-05-18
  • 打赏
  • 举报
回复
to Areslee(懒虫易水):

但是,书中的第二段,即“当特权级由内层向外层变换时,并不把内层堆栈的指针保存到TSS的内层堆栈指针区域。这表明向内层转移时,总是把内层堆栈认为是一个空栈。因此,不允许发生同级内层转移的递归,一旦发生向某级内层转移,那么返回到外层的正常途径是相匹配的向外层返回”,它说的到底是什么意思啊?
Areslee 2006-05-18
  • 打赏
  • 举报
回复
TSS中分为几个域
其中一个域是保存所有的寄存器值
另一个是用来保存0-2级堆栈指针
3级堆栈的指针就是保存在寄存器域里面的
0-2级则专门存放在堆栈域里
ASMsuperlover 2006-05-18
  • 打赏
  • 举报
回复
to Areslee(懒虫易水):

看来只能看英文了,但是我还是想请你给我解释一下你的说法,“对于3级就直接存放到SS:ESP的域”,这是什么意思啊?什么叫存放在“SS:ESP的域”?是指“TSS中”还是指“由SS:ESP确定的内存堆栈中”?麻烦给解释一下吧(暂时还看不到其他的资料,只能麻烦给详细解释一下了)
Areslee 2006-05-18
  • 打赏
  • 举报
回复
第一个我只有纸版,好象没有电子版
第二个就是看英文,INTEL的绝对是最正确最权威的解释
ASMsuperlover 2006-05-18
  • 打赏
  • 举报
回复
to ASMsuperlover():

还有,“80386/80486系统编程实践 吕晓庆”这本书找不到,“IA32 CPU手册  INTEL”只能到intel网站上下载英文版的,也找不到中文版的。

如果您有这两本书的电子版,拜托发到我的邮箱里:wangqawm@gmail.com,或者提供一个能够下载的链接,谢谢了。
ASMsuperlover 2006-05-18
  • 打赏
  • 举报
回复
to Areslee(懒虫易水):
我看得就是杨季文的“80X86汇编语言程序设计教程”,我问题中的那两段话就出自这本书啊
Areslee 2006-05-18
  • 打赏
  • 举报
回复
80386/80486系统编程实践 吕晓庆
80X86汇编语言编程(?) 杨季文
IA32 CPU手册  INTEL

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧