【发布时间】:2021-10-26 23:51:22
【问题描述】:
我有一个带时钟中断的简单工作(32 位保护模式)内核。我可以看到这个中断正在工作,因为它打印了很多时间。我还可以看到,这个中断将控制权交还给内核,因为它在几个时钟中断之后在屏幕上打印了“内核已停止”,就像它应该做的那样。中断与内核位于同一代码段。
我没有设置任何 TSS,但它正在工作。我可以在这篇文章 (https://web.archive.org/web/20160326062442/http://jamesmolloy.co.uk/tutorial_html/10.-User%20Mode.html) 上读到,当中断发生时,cpu 会查看选定的 TSS 段以更新寄存器。
-
如果我没有这个 TSS 怎么办?是不是因为中断发生时CPU还是会自动push EIP, CS, EFLAGS, EPS, SS并在iret上恢复?
-
如果我加载一个 TSS,这个中断如何知道它应该使用这个 TSS?使用 ltr 指令将在 GDT 中获取相应的 tss 段?
-
不是很相关,但是当使用硬件上下文切换和jmp到一个TSS时,它会在返回时自动跳转到上一个(没有下一个字段所以我有点迷茫)tss段吗?
这些问题我无法从我的学校课程中得到明确的答案,无论是 osdev 还是这个论坛。
【问题讨论】:
-
如果您在环 0 中运行所有内容,那么您不需要 TSS,因为不会发生环转换。但是,如果您的代码在 Ring 3(大多数人称之为用户模式)中运行,您将需要一个 TSS 以在中断时从 Ring 3 转换到 Ring 0。当发生中断时,所有内容都在 Ring 0 中时,内核(Ring 0)堆栈将用于推送中断数据。
标签: x86 operating-system kernel osdev context-switch