4.4 系统异常

本文主要介绍了如何设置中断描述符表(IDT),并通过ignore_int处理程序处理所有异常。此外,讨论了32位和64位模式下的TSS(任务状态段)结构,以及IST(中断堆栈表)在异常响应中的作用。最后,提到了执行除以零操作时为何触发中断0。
摘要由CSDN通过智能技术生成

程序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, (%
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值