英特尔x86-中断服务程序责任

0x1C1B

我并没有真正意义上的问题,但是我将尽力澄清一个内容问题。假设我们有一个微内核(PC Intel x86; 32位保护模式),其中每个CPU异常都有有效的中断描述符表(IDT)中断服务例程(ISR)如果发生Division by Zero异常,则成功调用ISR

global ir0
extern isr_handler

isr0:

    cli
    push 0x00   ; Dummy error code
    push %1     ; Interrupt number

    jmp isr_exc_handler

isr_exc_handler:

; Save the current processor state

    pusha

    mov ax, ds
    push eax

    mov ax, 0x10 ; Load kernel data segment descriptor
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    ; Push current stack pointer

    mov eax, esp
    push eax

    call isr_handler ; Additional C/C++ handler function

    pop eax     ; Remove pushed stack pointer

    pop ebx     ; Restore original data segment descriptor
    mov ds, bx
    mov es, bx
    mov fs, bx
    mov gs, bx

    popa

    add esp, 0x08 ; Clean up pushed error code and ISR number
    sti

    iret

问题是该中断一次又一次地引发。结果,一次又一次地调用ISR。通过反复试验,我发现引起异常的那一行int x = 5 / 0是在循环中执行的,因此指令指针(EIP) 不会递增

当我增加手动推入堆栈的IP的值时,会发生预期的行为。然后,CPU在恶意代码行之后执行下一条指令。当然,ISR被召集一次之后。

对我的实际问题:ISR是否有必要增加IP?还是这是“ CPU /硬件”的责任?继续前进的正确行为是什么?

罗斯里奇

您有责任知道处理器将如何以及为何调用中断服务程序,并相应地为ISR编写代码。您正在尝试将零除错误生成的异常视为由硬件中断生成。但是,这不是Intel x86处理器处理此类异常的方式。

x86处理器如何处理中断和异常

有几种不同类型的事件将导致处理器调用中断向量表中给出的中断服务程序。这些统称为中断和异常,处理器可以通过三种不同方式来处理中断或异常,例如作为故障陷阱中止您的除法指令生成一个除法错误(#DE)异常,将其作为故障处理。硬件和软件中断被视为陷阱,而其他种类的异常则被视作这三种方式之一,具体取决于异常的来源。

缺点

如果异常的性质允许以某种方式对其进行纠正,则处理器会将异常作为错误处理。因此,压入堆栈的返回地址指向生成异常的指令,因此故障处理程序知道是什么确切的指令导致了故障,并有可能在解决问题后恢复执行故障指令。Page Fault(#PF)异常是一个很好的例子。通过使故障处理程序为故障指令尝试访问的地址提供有效的虚拟映射,可以将其用于实现虚拟内存。有了有效的页面映射,就可以继续执行该指令,而不会产生另一个页面错误。

陷阱

中断和某些类型的异常(全部都是软件异常)被视为陷阱。陷阱并不意味着指令执行中的错误。硬件中断发生在指令执行之间,软件中断和某些软件异常有效地模仿了这种行为。陷阱是通过推入将正常执行的下一条指令的地址来处理的。这允许陷阱处理程序恢复被中断代码的正常执行。

中止

严重且不可恢复的错误被视为中止。只有两种异常会产生异常,机器检查(#MC)异常和双重故障(#DF)。机器检查指令是由于检测到处理器本身发生硬件故障而导致的,无法解决,无法可靠地恢复正常执行。当在中断或异常的处理过程中发生异常时,会发生双重故障异常。这使CPU处于不一致状态,处于调用ISR的所有许多必要步骤的中间位置,而ISR无法恢复。推入堆栈的返回值与中止的原因无关。

通常如何处理除法错误异常

通常,大多数操作系统通过将除错异常传递给正在执行的进程中的处理程序来进行处理,或者通过终止进程而失败(表明该进程已崩溃),以处理除错异常。例如,大多数Unix系统向该进程发送SIGFPE信号,而Windows使用其结构化异常处理机制执行类似的操作。这样一来,流程的编程语言运行时可以设置其自己的处理程序,以实现所使用的编程语言所必需的任何行为。由于零除会导致C和C ++中出现不确定的行为,因此崩溃是可以接受的行为,因此这些语言通常不会安装零除处理程序。

请注意,虽然可以通过“递增EIP”来处理除法错误异常,但这比您想象的要难,并且不会产生非常有用的结果。您不能只向EIP添加一个或其他常量值,还需要跳过整个指令,该指令的长度可能在2到15个字节之间。AAM,DIV和IDIV是可能导致此异常的3条指令,可以用各种前缀和操作数字节对它们进行编码。您需要对指令进行解码,以找出它有多长。执行此递增的结果将好像从未执行过该指令。错误的指令将无法计算出有意义的值,并且您将无法指示程序为什么无法正常运行。

阅读文档

如果您要编写自己的操作系统,则需要提供《英特尔软件开发人员手册》,以便您经常查阅。特别是,您需要阅读和学习第3卷:系统编程指南中的几乎所有内容,但不包括“虚拟机扩展”章节以及之后的所有内容。您需要了解的有关中断和异常的所有信息都在此处详细介绍,此外您还需要了解许多其他信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用 NOP 填充的 x86 英特尔程序集中的字节?

来自分类常见问题

英特尔x86模拟器加速器(HAXM安装程序)修订版6.0.5与Windows不兼容

来自分类Dev

英特尔Android Atom(x86)模拟器HANG Mac OS X 10.9

来自分类Dev

英特尔x86组装-读取和复制进位标志

来自分类Dev

英特尔图形安装程序与股票驱动程序

来自分类Dev

英特尔图形安装程序与股票驱动程序

来自分类Dev

英特尔x86-64 XSAVE / XRSTOR

来自分类Dev

英特尔80x86 PE代码转换

来自分类Dev

英特尔XDK服务功能未返回

来自分类Dev

英特尔WebRTC 2.1.1服务器连接问题

来自分类Dev

带有至强x3220的英特尔服务器主板sh3200是否适合虚拟化?

来自分类Dev

英特尔x86段寄存器和GDT(LDT)寄存器的大小

来自分类Dev

如何读取x86英特尔处理器的PMC(性能监视计数器)

来自分类Dev

如何升级英特尔图形驱动程序?

来自分类Dev

英特尔Linux图形驱动程序

来自分类Dev

英特尔Linux图形驱动程序

来自分类Dev

如何升级英特尔图形驱动程序?

来自分类Dev

英特尔P状态驱动程序的作用

来自分类Dev

英特尔高清显卡驱动程序

来自分类Dev

安装英特尔图形驱动程序并运行genymotion

来自分类Dev

Ubuntu 16.04:安装英特尔驱动程序

来自分类Dev

ubuntu 20.04 的英特尔驱动程序?

来自分类Dev

英特尔x86原子系统映像与Google API(x86系统映像)之间有什么区别

来自分类Dev

英特尔html5整合的英特尔xdk应用程序开发启动画面

来自分类Dev

x86中断服务程序导致常规保护故障

来自分类Dev

x86程序集中断服务例程可以调用另一个中断吗?

来自分类Dev

X.org可以加载两个不同的驱动程序吗?(使用英特尔和NVidia卡进行三头设置)

来自分类Dev

X.org可以加载两个不同的驱动程序吗?(使用英特尔和NVidia卡进行三头设置)

来自分类Dev

未知的其他驱动程序:英特尔CPU的处理器微代码固件,用于英特尔微代码

Related 相关文章

  1. 1

    用 NOP 填充的 x86 英特尔程序集中的字节?

  2. 2

    英特尔x86模拟器加速器(HAXM安装程序)修订版6.0.5与Windows不兼容

  3. 3

    英特尔Android Atom(x86)模拟器HANG Mac OS X 10.9

  4. 4

    英特尔x86组装-读取和复制进位标志

  5. 5

    英特尔图形安装程序与股票驱动程序

  6. 6

    英特尔图形安装程序与股票驱动程序

  7. 7

    英特尔x86-64 XSAVE / XRSTOR

  8. 8

    英特尔80x86 PE代码转换

  9. 9

    英特尔XDK服务功能未返回

  10. 10

    英特尔WebRTC 2.1.1服务器连接问题

  11. 11

    带有至强x3220的英特尔服务器主板sh3200是否适合虚拟化?

  12. 12

    英特尔x86段寄存器和GDT(LDT)寄存器的大小

  13. 13

    如何读取x86英特尔处理器的PMC(性能监视计数器)

  14. 14

    如何升级英特尔图形驱动程序?

  15. 15

    英特尔Linux图形驱动程序

  16. 16

    英特尔Linux图形驱动程序

  17. 17

    如何升级英特尔图形驱动程序?

  18. 18

    英特尔P状态驱动程序的作用

  19. 19

    英特尔高清显卡驱动程序

  20. 20

    安装英特尔图形驱动程序并运行genymotion

  21. 21

    Ubuntu 16.04:安装英特尔驱动程序

  22. 22

    ubuntu 20.04 的英特尔驱动程序?

  23. 23

    英特尔x86原子系统映像与Google API(x86系统映像)之间有什么区别

  24. 24

    英特尔html5整合的英特尔xdk应用程序开发启动画面

  25. 25

    x86中断服务程序导致常规保护故障

  26. 26

    x86程序集中断服务例程可以调用另一个中断吗?

  27. 27

    X.org可以加载两个不同的驱动程序吗?(使用英特尔和NVidia卡进行三头设置)

  28. 28

    X.org可以加载两个不同的驱动程序吗?(使用英特尔和NVidia卡进行三头设置)

  29. 29

    未知的其他驱动程序:英特尔CPU的处理器微代码固件,用于英特尔微代码

热门标签

归档