1 :#define FIRST_TSS_ENTRY 4
2: #define FIRST_LDT_ENTRY (FIRST_TSS_ENTRY + 1)
3: #define _TSS(n) ( ( (unsigned long n) << 4 ) + (FIRST_TSS_ENTRY << 3))
4: #define _LDT(n) ( ( (unsigned long n) << 4 ) + (FIRST_LDT_ENTRY << 3))
5: #define ltr(n) _ _asm_ _("ltr %%ax": :"a"(_TSS(n)))
6: #define lldt(n) __asm__("lldt %%ax"::"a"(_LDT(n)))
上面4的意思是说以0开始的每个代表8字节的第4位
FIRST_TSS_ENTRY << 3
第1个任务的TSS相对于第0个任务的偏移了2个8字节 所以就移动了16个字节
即 ((unsigned long n) << 4
第n个任务 TR LDTR加载就是他们的偏移的字节数
//---------------------------------------------------------------------------------------------------------------------------------------------
TSS在哪里呢? 在struct task_struct里面的分量struct tss_struct tss中
LDT在哪里呢? 也在struct task_struct里面分量struct desc_struct ldt[3]中
哪GDT如何管理TSS和LDT呢
struct tss_struct 和struct desc_struct都在内核中 所以通过32的偏移地址就可以找到他们
他们有什么属性呢?也就是权限问题
所以GDT中就必须设置好他们的位置和权限
代码如下:
#define _set_tssldt_desc(n, addr, type)\
__asm__("movw $104, %1\n\t"\
"movw %%ax, %2\n\t"\
"rorl $16, %%eax\n\t"\
"movb %%al, %3\n\t"\
"movb $" type ", %4\n\t"\
"movb $0x00, %5\n\t"\
"movb %%ah, %6\n\t"\
"rorl $16, %%eax"\
: :"a"(addr), "m"(* (n)), "m" (*(n + 2)), "m"(* (n + 4)),\
"m"(*(n + 5)), "m"(*(n + 6),"m"(*(n + 7)\
)
其他IDT也是同样的道理
我学Linux是因为我对Windows的无知~~~~
但学习的过程很多东西都搞的头好痛。