Linux从头学10:理解了这三个概念,才能彻底理解【任务管理】和【任务切换】
时间:2021-10-15 16:22:50
手机看文章
扫描二维码
随时随地手机看文章
[导读]LDT:局部描述符表TSS:任务状态段TCB:任务控制块x86系统中的保护模式,给系统的安全性提供了很大的保障,但是在我们之前的文章中,一直都淡化了特权级别这个概念。例如:在保护模式下的段选择器,我们一直都只把它看做一个段描述符的"索引号",用来在GDT(全局描述描述符表)中查找...
-
LDT:局部描述符表
-
TSS: 任务状态段
-
TCB: 任务控制块
此时,继续把段寄存器中的内容称作段索引符就不合适了,一般称作:选择子。
- TI 标志位:表示到哪个表中(GDT or LDT)查找描述符;
TI = 0: 到 GDT 中查找描述符;
TI = 1: 到 LDT 中查找描述符;
- RPL(Request Privilege Level) 标志位:表示想给段寄存器赋值的请求者(也就是一段代码),它的特权级别;
LDT:局部描述符表
在上一篇文章中,操作系统把应用程序从硬盘读取到内存中之后,为应用程序创建了三个段描述符,这三个段描述符都放在了GDT表中,这是不合理的。
为什么是 “应用程序自己的内存空间”?在LDT中,存放着当前应用程序自己的段描述符信息,例如:代码段、数据段、栈段。因为每一个应用程序,都独享 4G 大小的虚拟内存空间。
在 Linux 应用层,我们会严格的区分进程、线程,但是在系统的底层,这样的区分界限已经比较模糊了,用任务 task 来称呼更通用些。根据刚才的假设,现在系统中有2个用户程序,那么处理器怎么知道:当前正在执行的是哪一个应用程序的LDT中的代码?
GDTR 中的内容不变,因为每个应用程序中的 GDT 都是从操作系统“继承”而来的,开始地址和长度都是一样的。
TSS: 任务状态段
顾名思义,任务状态段就是用来存储和恢复任务的状态信息。
- 首先,把处理器中的寄存器内容,存储到 TR 寄存器指向的 TSS 段中(即将被停止的任务);
- 然后,把新的任务的 TSS 段中的内容,复制到处理器的各寄存器中,并且把 TSS 地址赋值给 TR 寄存器;
TCB: 任务控制块
任务控制块,可以说是系统中用来管理任务的最重要的数据结构了,操作系统用来管理任务的所有信息都可以放在这里。
需要注意的是:上面的 LDT、TSS,是 x86 处理器中设计的运行机制,是处理器要求这样的。。。。
- 程序的加载地址;
- 任务的优先级;
- 任务的当前状态;
- 任务打开的一些资源:网络、文件设备等待;
------ End ------
x86处理器中的这三个概念,对于理解任务切换非常重要。