TSS为intel为了方便操作系统管理进程而加入的一种结构,用法也很简单。TSS是一个段,即一块内存,这里保存要切换的进程的cpu信息,包括各种寄存器的值、局部描述表ldt的段选择子等,切换时cpu会将这段内容存进各自对应的寄存器,然后就完成了切换。(任务切换或者说CPU状态更新实质上就是改变各个寄存器的值)
//32位TSS段结构
struct TSS32
{
int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
int es, cs, ss, ds, fs, gs;
int ldtr, iomap;
};
使用的话首先要在GDT表中设置一个TSS段,就是保存TSS段的位置,然后将TSS段对应的是段选择子存入TR寄存器,告诉cpu这个TSS段在哪里。按照intel最初的设计,每个任务或者进程都应该设置一个TSS段,任务切换时直接将对应的TSS段的内存加载到CPU就行了。但是后来发现这种设计会带来过多的系统开销,每次切换都要将所有的寄存器更新,需要数百个指令周期,因此主流的操作系统均不使用这种方法。linux采取的方法是绕开TSS段进行任务切换,每个CPU仅设置一个TSS段,仅使用esp0和iomap,采用软件方法切换寄存器,节省了开销。