注:本文档为《从0学x86操作系统》课程配套的学习文档,提供相应的辅助学习资料和答疑勘误。 有关该课程的信息,请点击这里访问:https://study.163.com/provider/1017884735/index.htm 在阅读本文档时,如有疑问和建议,欢迎在下方留言或者直接联系我。

本小节演示了怎样通过TSS实现简单的两个任务之间进行切换,从而让你对任务切换有个非常直观地体验,具体实现过程比较简单,主要根据Intel编程文档的内容提供好相应的TSS配置数据即可。

主要内容

在为任务配置好TSS之后,还需要将其加入到CPU的硬件数据配置中,添加方法是在GDT表中添加一个专门的TSS描述符指向该结构,如下图所示。然后,当前执行哪个任务,则由Task Register指向相应的描述符。
在系统初始化时,必须向Task Register写入一个有效的TSS描述符对应的选择子。在本课程中,写入的则是init_main()对应的描述选选择子,即其为最开始运行的任务。

image.png
intel编程文档卷3 第62页

image.png
intel编程文档卷3 第72页
TSS描述符的内容与代码段、数据段描述符等结构类似,主要区别在于Type字段。在任务初始化时,从GDT表中分配了相应的空闲描述符,然后按TSS描述符格式进行初始化。
image.png
intel编程文档卷3 第256页
配置完所有的描述符之后,就可以通过远跳转far_jump()跳转到另一个任务运行。在执行该指令时,CPU会自动将保存当前任务的状态到TSS,然后从另一任务的TSS中取出状态进行恢复。通过不断地反复跳转,实现了在不同任务之间轮流切换执行。
image.png

参考资料

  • TSS相关信息,见课程附带的intel编程文档卷3 第252页:Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B, 3C & 3D): System Programming Guide