Linux0.11内核--段数据定义

80386段相关的宏定义

set_seg_desc

Linux0.11内核--段数据定义_第1张图片

/*****************************************************************************/ /* 功能: 设置存储段描述符,把指定属性的段描述符放入gate_addr处 */ /* 参数: gate_addr 段描述符的目的地址 */ /* type 描述符中类型域,具体见80386基础一节中的表格 */ /* dpl 描述符中特权级 */ /* base 段基地址,这是线性地址 */ /* limit 段限长 */ /* 返回: (无) */ /*****************************************************************************/ #define _set_seg_desc(gate_addr,type,dpl,base,limit) {/ // 把段描述符的第4-7字节放入gate_addr处 *((gate_addr)+1) = ((base) & 0xff000000) | / // base的31..24位放入gate_addr的31..24位 (((base) & 0x00ff0000)>>16) | / //base的23..16位放入gate_addr的7..0位 ((limit) & 0xf0000) | / //limit的19..16位放入gate_addr的19..16位 ((dpl)<<13) | / // dpl放入gate_addr的14..13位 (0x00408000) | / // 把P位和D位设置位1,G置为 0 ((type)<<8); / // type放入gate_addr的11..8位 // 把段描述符的第0-3字节放入gate_addr+1处 *(gate_addr)= (((base) & 0x0000ffff)<<16) | / //base的15..0放入gate+1的31..15位 ((limit) & 0x0ffff); } //limit的15..0位放入gate+1的15..0位 

<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } -->

set_tssldt_desc

/*****************************************************************************/ /* 功能: 设置系统段描述符,把指定属性的段描述符放入GDT中 */ /* 表项n对应的地址处, */ /* 参数: n GDT中表项n对应的地址 */ /* addr 系统段的基地址,这是一个线性地址 */ /* type 描述符中类型域,具体见80386基础一节中的表格 */ /* 0x89表示386TSS段描述符,0x82表示LDT段 */ /* 这里8是为了设置P位为1 */ /* 返回: (无) */ /*****************************************************************************/ // %0 寄存器eax addr // %1-%6 物理地址 符号项n地址-n+7的地址 #define _set_tssldt_desc(n,addr,type) / __asm__ ("movw $104,%1/n/t" / // 把TSS的限长104字节放入n地址处, // 这样ldt的限长也定为104,这没有关系,因为linux0.11 // 中一个任务的ldt只有3个表项 "movw %%ax,%2/n/t" / // 把addr的15..0位(在ax中)放入n+2处 "rorl $16,%%eax/n/t" / // 把addr的高16位(eax中)放入ax中 "movb %%al,%3/n/t" / // addr的23..16位放入n+4中 "movb $" type ",%4/n/t" / // 把type字段放入n+5中 "movb $0x00,%5/n/t" / // 把G置为 0,说明粒度是字节。 // 因为限长定死为104,所以高位肯定是0 "movb %%ah,%6/n/t" / // 把addr的31..24位放入n+7中 "rorl $16,%%eax" / // eax清0 ::"a" (addr), "m" (*(n)), "m" (*(n+2)), "m" (*(n+4)), / "m" (*(n+5)), "m" (*(n+6)), "m" (*(n+7)) / ) #define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x89") #define set_ldt_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x82") 

#define set_tss_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x89") #define set_ldt_desc(n,addr) _set_tssldt_desc(((char *) (n)),addr,"0x82") 

<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } -->

naddr地址的说明

set_tss_desc() set_ldt_desc()在两个地方被调用:sched_init()copy_process ()中。在sched_init()中:

set_tss_desc(gdt+FIRST_TSS_ENTRY,&(init_task.task.tss));

set_ldt_desc(gdt+FIRST_LDT_ENTRY,&(init_task.task.ldt));

copy_process ()

set_tss_desc(gdt+(nr<<1)+FIRST_TSS_ENTRY,&(p->tss));

set_ldt_desc(gdt+(nr<<1)+FIRST_LDT_ENTRY,&(p->ldt))

这里传入的地址都是逻辑地址,但是因为3种地址重合,所以也没问题。

 

 

 

 

你可能感兴趣的:(linux,存储,任务)