c&p from linuxsir
_set_gate()宏在文件include/asm/system.h中:
#define _set_gate(gate_addr,type,dpl,addr) \
__asm__ ("movw %%dx,%%ax\n\t" \
"movw %0,%%dx\n\t" \
"movl %%eax,%1\n\t" \
"movl %%edx,%2" \
: \
: "i" ((short) (0x8000+(dpl<<13)+(type<<8))), \
"o" (*((char *) (gate_addr))), \
"o" (*(4+(char *) (gate_addr))), \
"d" ((char *) (addr)),"a" (0x00080000))
這里共輸入5個數據(這里沒有輸出部),%1與gate_addr結合,%2與
(gate_addr+4)結合,它們都是內存單元;先將%%dx的低16位移入%%ax的低16位
(注意%%dx與%%edx的區別)。這樣,在%eax中就形成了所需要的中斷門的第一個
長整數,其高16位為_KERNEL_CS,而低16位為addr的低16位。接著把第一個輸入
立即數(0x8000+(dpl<<13)+(type<<8)裝入%%edx的低16位。這樣,%%edx中高16
位為addr的高16位,而低16位的P位為1(因為是0x8000),DPL位段為DPL(因為
dpl<<3),而D位加上類型位段則為type(因為type<<8),其余各位皆為0。這就形
成了中斷門中的第2個長整數。然后,將%eax 寫入*gate_addr,而%%edx寫入
*(gate_addr+4)。呵呵,效率高,但難得讀懂。但對于像設置IDT表項一類并不
是平凡發生的操作,這樣做是否值得犧牲可讀性。。。(我想也沒有多少人愿意
讀這樣很底層的東東,更談不上維護了)
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/