红联Linux门户
Linux帮助

Linux初次学习

发布时间:2007-03-06 01:23:25来源:红联作者:严寒
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的无知~~~~

但学习的过程很多东西都搞的头好痛。
文章评论

共有 0 条评论