特权级转移之 高,低特权级互相转移,模拟操作系统内核态与用户态切换以及应用程序调用系统资源

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

在这里插入图片描述

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值