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)))
ltr(n)可将任务号为n的进程的TSS选择符加载到TR寄存中。 _TSS宏用于计算n号任务的TSS选择子,计算公式为:
(n * 2 + 4) << 3
进程0的TSS在GDT中的序号是4,每个进程占用GDT中两个条目。
From #
Linux内核设计的艺术