TSS与LDT选择子的计算

TSS与LDT选择子的计算

Content #

#define FIRST_TSS_ENTRY 4
#define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY+1)
#define _TSS(n) ((((unsigned long) n)<<4)+(FIRST_TSS_ENTRY<<3))
#define _LDT(n) ((((unsigned long) n)<<4)+(FIRST_LDT_ENTRY<<3))
#define ltr(n) __asm__("ltr %%ax"::"a" (_TSS(n)))
#define lldt(n) __asm__("lldt %%ax"::"a" (_LDT(n)))

进程0中GDT、LDT、TSS关系示意图

ltr(n)可将任务号为n的进程的TSS选择符加载到TR寄存中。 _TSS宏用于计算n号任务的TSS选择子,计算公式为:

(n * 2 + 4) << 3

进程0的TSS在GDT中的序号是4,每个进程占用GDT中两个条目。

From #

Linux内核设计的艺术

段选择子(Segment Selectors)