
TSS中保存的栈信息,是在特权级转移的时候被用到,具体就是在从低特权级转移到高特权级的时候会用。注意 从低到高
问题:为什么要保存 段寄存器值和通用寄存器的值?
既然是为了实现多任务,那么任务之间显然要进行切换,切换任务的时候需要保存当前任务上下文,那么什么是任务上下文? 具体就是任务执行时的关键寄存器的值,包括段寄存器和通用寄存器的值。把这些寄存器值保存之后,等任务切换回来的时候,直接把这些寄存器值恢复 任务的执行状态就恢复了。
TSS这个数据结构中很大一部分就是保存了寄存器的值的。
在X86处理器中,如果说特权级进行了转移,那么所使用的栈也会发生变化,每一个特权级使用自己一个独立的栈,不同特权级的栈是相互独立的。所以TSS中也保存了 任务所需要的不同特权级的栈信息,这些不同特权级的栈信息是怎么表示的呢? 其实就是保存 ss寄存器的值 和 esp寄存器的值。众所周知 栈需要两个寄存器来表示,第一个是ss寄存器 保存栈基地址,第二个是esp寄存器 保存栈顶地址。
这样保存之后的好处是什么?
很明显,假如我们现在要从 3特权级 跳转到 0特权级执行,发生特权级的转移了,要切换栈,此时所需要的 0特权级的栈信息 就可以直接到 TSS结构体中找就可以了。
注意 TSS结构体中 只保存了3个栈的信息 分别是特权级 0 1 2 的栈信息


调用门可以做 特权级的转移,从低特权级转移到高特权级,转移的时候栈的变化是这样的:
1 首先从 TSS中获取 高特权级栈的信息(包括栈基地址 ss寄存器值,栈顶指针位置 esp寄存器值)
2 获取之后,将 低特权级的栈信息(包括栈基地址 ss寄存器值,栈顶指针位置 esp寄存器值) 压入到 高特权级栈中,此操作的意义就是为了返回,函数调用完需要返回,返回的时候就从 高特权级转移到低特权级了,也就发生了特权级变化,那么栈就会发生变化。
回忆上一节知识,高特权级跳转到低特权级,我们在跳转的时候,手工的将低特权级栈的信息压入了栈中,并且将低特权级代码段入口压入栈中,然后使用 retf指令 。
如果是 调用门的话 在调用的瞬间,低特权级的栈信息以及低特权级的代码段信息 都会被压入栈中,这样 当遇到 retf指令的时候,就会将低特权级的栈信息 从高特权级的栈中取出来 恢复到 ss寄存器和 esp寄存器。

TSS中保存的栈信息,是在特权级转移的时候被用到,具体就是在从低特权级转移到高特权级的时候会用。注意 从低到高,而一共只有0 1 2 3,四个特权级,没有比3特权级更低的特权级,所以不可能有特权级从比3更低的特权级 转移到 3特权级。

注意:
1, 32位核心代码段和数据段 特权级为0 模拟内核态
2, 32位任务代码段和数据段 特权级为3 模拟用户态
3, 在系统启动后会首先执行内核态核心代码 之后就会跳转到 任务代码去执行,此时就是 高特权级 到 低特权级的转移(retf 远返回)。这里模拟的就是操作系统启动后去执行某个应用程序。模拟操作系统内核加载执行 应用程序
4, 在用户态的应用程序中 调用 内核高特权级代码,即系统函数。这个时候就涉及到了特权级转移,必然要陷入内核态,对应实验当中 就是使用调用门来做特权级的转移,完成某个任务,然后返回。

1 当系统开始执行了之后,显然是在实模式的,我们需要转换到保护模式执行,转换到保护模式之后,特权级为0,对应的就是核心代码段的执行。
2 核心代码段做好工作后,通过远返回执行指令 从高特权级0的内核态 跳转到 低特权级为3的用户态执行任务,模拟操作系统内核加载执行 应用程序
3 低特权级为3的用户态 执行任务中 需要调用一个系统函数,那么就要陷入内核态,这个过程的本质就是特权级转移了,通过调用门从3特权级的用户态转移到特权级为0的内核态,然后执行系统函数,执行完之后 又通过远返回执行 做特权级的转移,从特权级为0的内核态系统函数代码段 转移到 特权级为3的用户态任务代码段。

特权级转移时会发生栈变换,栈信息到TSS结构体中查找,TSS结构体存在于内存当中,既然TSS 要存在于内存当中,那么他就应该是保护模式下的一个段,所以必然要有相应的段描述符和选择子,但凡内存中的一个段 就会有相应的段描述符 和 选择子,TSS结构体也不例外。
在TSS结构体定义好之后,如何使用呢?
通过 ltr指令加载使用。
实验 :
实验说明:
3

本文探讨了TSS(任务状态段)在操作系统上下文切换中的作用,特别是它如何保存和恢复寄存器状态以支持多任务处理。文章详细解释了在不同特权级间切换时TSS是如何被利用的,以及调用门如何促进这一过程。
最低0.47元/天 解锁文章
1223

被折叠的 条评论
为什么被折叠?



