4.4 系统异常

程序4-4 代码功能

 lidt IDT_POINTER(%rip)
 ...

setup_IDT:    // ignore_int(%rip) = 0x1111 2222 3333 4444
 #首先ignore_int中断服务程序的偏移地址(OFFSET)就可以使用lea指令取出ignore_int标号的基地址

 #这个基地址要被拆分成第0-15位和第48-63位,分别放在EAX和EDX寄存器中
 #然後在將EAX的值加載到中斷描述符的低位,將EDX的值加載到中斷描述符的高位。
 leaq ignore_int(%rip), %rdx     ;假如 ignore_int 函数 的地址为 %rdx = 0x2222 3333 4444 5555
 movq $(0x08 << 16), %rax       ; 段选择子  %rax = 0x0000 0000 0008 0000 = 0b 0000 0000 0000 1000   位数: 0-1 RPL 请求特权级  1-2   TI 指示目标段描述符所在描述符表类型   3-15 用于索引目标段描述符  2   #段选择符,我们要选用代码段的段选择符,所以我们使用0008h号GDT段选择符。
 movw %dx, %ax                 ;   段内偏移 15:00  %ax =  ignore_int 函数的低16位 %ax = 0x5555 %rax = 0x0000 0000 0008 5555
 movq $(0x8E00 << 32), %rcx    ;  %rcx = 0x0000 8E00 0000 0000 = 0b0000 0000 0000 0000 1000 1110 0000 0000  32-34 IST ( Interrupt Stack Table,中断枝表)是IA-32e模式为任务状态段引人的新型战指针,其功能与 RSP相同,只不过IST切换中断棋指针时不会考虑特权级切换。 35-39:0 40-43:Type 第40-43位为段描述符类型标志(TYPE),我们设置的是1110.即将此段描述符标记为“386中断门”。  44-44:0 45-46:DPL 描述符特权级  47-48:P 指定调用门描述符是否有效
 addq %rcx, %rax              ;   %rax = 0x0000 8E00 0008 5555  %rcx = 0x0000 8E00 0000 0000        
 movl %edx, %ecx              ;   %ecx = ignore_int 函数的低32位 0x4444 5555    %rcx = 0x0000 8E00 4444 5555
 shrl $16, %ecx               ;   %ecx =  0x0000 4444 %rcx = 0x0000 8E00 0000 4444 
 shlq $48, %rcx               ;   %rcx =  4444 0000 0000 0000
 addq %rcx, %rax              ;   %rax =  0x4444 8E00 0008 5555        
 shrq $32, %rdx              ;    %rdx = 0x0000 0000 2222 3333 
 leaq IDT_Table(%rip), %rdi ;
  mov $256, %rcx
 rp_sidt:
  movq %rax, (%rdi)
  movq %rdx, 8(%rdi)
  addq $0x10, %rdi
  dec %rcx
  jne rp_sidt

·模块setup_IDT负责往IDT(中断描述符表)填入中断描述符(单个表项占用16Byte),中断描述符的格式参考下图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值