深入理解linux核心筆記一:_set_gate分析

來源:互聯網
上載者:User

 #define _set_gate(gate_addr,type,dpl,addr,seg) /
do { /
  int __d0, __d1; /
  __asm__ __volatile__ ("movw %%dx,%%ax/n/t" /
 "movw %4,%%dx/n/t" /
 "movl %%eax,%0/n/t" /
 "movl %%edx,%1" /
 :"=m" (*((long *) (gate_addr))), /
  "=m" (*(1+(long *) (gate_addr))), "=&a" (__d0), "=&d" (__d1) /
 :"i" ((short) (0x8000+(dpl<<13)+(type<<8))), /
  "3" ((char *) (addr)),"2" ((seg) << 16)); /
} while (0)

分析:
output:
  *(gate_addr) 0%
 *(1+gate_addr) 1%
 d0  2% (seg)<<16 存放在eax中(=&a)
 d1  3% ((char *)addr) 存放在edx中(=&d)
inout:
 (0x800+(dpl<<13)+(type<<8))

movw %%dx,%%ax 將edx的低16位移到eax低16中,也即將((char *)addr)低16為地址移到eax中
 這樣eax中的值就為(seg)<<16|addr(0-15)
movw %4,%%dx   將(0x800+(dpl<<13)+(type<<8))移到edx中
 這樣edx的值就為addr(16-31)|(0x800+(dpl<<13)+(type<<8))
movl %%eax,%0 將eax寫入*(gate_addr)   *(gate_addr)為中斷描述符的低32位
movl %%edx,%1   將edx寫入*(1+gate_addr) *(gate_addr+1)為中斷描述符的高32位

這樣中斷描述符的內容為:
 addr(31-16)|(0x800+(dpl<<13)+(type<<8))  (63-32)
 (seg)<<16|addr(0-15)    (31-0)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.