Chinaunix首页 | 论坛 | 博客
  • 博客访问: 41875
  • 博文数量: 16
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 135
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-28 13:50
文章分类
文章存档

2009年(16)

我的朋友

分类: LINUX

2009-11-30 22:54:54

使用call 指令在不同的特权级代码间切换时,对应的堆栈也要进行切换。这是保护机制的一项内容。由于堆栈发生了变换,原来堆栈中用于恢复环境的压栈内容(ss/esp/cs/eip/参数等)就必须同时拷贝到目标堆栈中,否则从目标堆栈中返回时就会失去入口造成程序崩溃。(我个人认为只要将ss/esp压栈就可以了,其余内容可以在堆栈复原后从原来堆栈中找到。)这个内容很好理解。那么,不同的堆栈,肯定有一个数据结构保存着他们的信息列表。这个数据结构就是TSS,任务状态堆栈。

由于X86将特权级分成4类,因此TSS主要就是保存了0-2特权级的ss和esp以及CPU的主要寄存器信息。TSS具体结构请自己在网上查找,我找到合适的图片后再补充。只要记住他保存了各个堆栈的入口地址即可。注意TSS没有最外层ring3的堆栈信息,因为,程序在外层到内层的切换过程中寻找内层堆栈信息时才用到TSS,因此最外层的信息不用在此保留。
阅读(2032) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~