日期:2014-05-16 浏览次数:20691 次
setup_gdt: lgdt gdt_descr # 加载全局描述符表寄存器(内容已设置好,见232-238 行)。 ret gdt_descr: # 下面两行是lgdt 指令的6 字节操作数:长度,基址。 .word 256*8-1 # so does gdt (not that that's any .long _gdt # magic number, but it works for me :^) # 全局表。前4 项分别是空项(不用)、代码段描述符、数据段描述符、系统段描述符,其中 # 系统段描述符linux 没有派用处。后面还预留了252 项的空间,用于放置所创建任务的 # 局部描述符(LDT)和对应的任务状态段TSS 的描述符。 # (0-nul, 1-cs, 2-ds, 3-sys, 4-TSS0, 5-LDT0, 6-TSS1, 7-LDT1, 8-TSS2 etc...) _gdt: .quad 0x0000000000000000 /* NULL descriptor */ .quad 0x00c09a0000000fff /* 16Mb */ # 代码段最大长度16M。 .quad 0x00c0920000000fff /* 16Mb */ # 数据段最大长度16M。 .quad 0x0000000000000000 /* TEMPORARY - don't use */ .fill 252,8,0 /* space for LDT's and TSS's etc */
lea _idt,%edi # _idt 是中断描述符表的地址。 mov $256,%ecx rp_sidt: movl %eax,(%edi) # 将哑中断门描述符存入表中。 movl %edx,4(%edi) addl $8,%edi # edi 指向表中下一项。 dec %ecx jne rp_sidt lidt idt_descr # 加载中断描述符表寄存器值。 ret