- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我并没有真正意义上的问题,但是我将尽力澄清一个内容问题。假设我们有一个微内核(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
int x = 5 / 0
是循环执行的,因此指令指针(EIP)不递增。
最佳答案
您有责任知道处理器将如何以及为何调用中断服务例程,并相应地为ISR编写代码。您正在尝试将零除错误生成的异常视为由硬件中断生成。但是,这不是Intel x86处理器处理此类异常的方式。
x86处理器如何处理中断和异常
存在几种不同类型的事件,这些事件将导致处理器调用中断向量表中给出的中断服务程序。这些统称为中断和异常,处理器可以通过三种不同方式来处理中断或异常,作为故障,陷阱或中止。您的除法指令生成一个除法错误(#DE)异常,将其作为故障处理。硬件和软件中断被视为陷阱,而其他种类的异常则作为这三种方式之一来处理,具体取决于异常的来源。
缺点
如果异常的性质允许以某种方式对其进行纠正,则处理器会将异常作为错误处理。因此,压入堆栈的返回地址指向生成异常的指令,因此故障处理程序可以知道是什么确切的指令导致了故障,并有可能在解决问题后恢复执行该故障的指令。 Page Fault(#PF)异常是一个很好的例子。通过使故障处理程序为故障指令尝试访问的地址提供有效的虚拟映射,可以用来实现虚拟内存。有了有效的页面映射,就可以继续执行该指令,而不会产生另一个页面错误。
陷阱
中断和某些类型的异常(全部都是软件异常)被视为陷阱。陷阱并不意味着指令执行中的错误。硬件中断发生在指令执行之间,软件中断和某些软件异常有效地模仿了这种行为。陷阱是通过按入将正常执行的下一条指令的地址来处理的。这使陷阱处理程序可以恢复被中断代码的正常执行。
中止
严重且不可恢复的错误被视为中止。只有两个异常会产生异常,机器检查(#MC)异常和双重故障(#DF)。机器检查指令是检测到处理器本身发生硬件故障的结果,无法修复,不能可靠地恢复正常执行。当在中断或异常的处理过程中发生异常时,会发生双重故障异常。这使CPU处于不一致状态,处于调用ISR的所有许多必要步骤的中间,而这些步骤无法恢复。压入堆栈的返回值与中止的原因无关。
通常如何处理除法错误异常
通常,大多数操作系统通过将除错异常传递给正在执行的进程中的处理程序来进行处理,或者通过终止进程而失败(表明该进程已崩溃)来处理该错误。例如,大多数Unix系统将SIGFPE信号发送给进程,而Windows使用其结构化异常处理机制执行类似的操作。这样一来,流程的编程语言运行时就可以设置自己的处理程序,以实现所使用的编程语言所必需的任何行为。由于零除导致C和C ++中的行为不确定,因此崩溃是可以接受的行为,因此这些语言通常不会安装零除处理程序。
请注意,虽然可以通过“递增EIP”来处理除法错误异常,但这比您想象的要难,并且不会产生非常有用的结果。您不能只向EIP添加一个或其他常量值,还需要跳过整个指令,该指令的长度可能在2到15个字节之间。 AAM,DIV和IDIV是三种可能导致此异常的指令,它们可以使用各种前缀和操作数字节进行编码。您需要对指令进行解码,以找出它有多长。执行此递增的结果将好像从未执行过该指令。错误的指令将无法计算出有意义的值,并且您将无法指示程序为什么无法正常运行。
阅读文档
如果您要编写自己的操作系统,则需要提供《英特尔软件开发人员手册》,以便您经常查阅。特别是,您需要阅读和学习第3卷:系统编程指南中的几乎所有内容,但不包括“虚拟机扩展”章节以及之后的所有内容。有关中断和异常的详细信息,您需要了解的所有内容,以及您需要了解的许多其他信息。
关于assembly - 英特尔x86-中断服务程序责任,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59218028/
#include int main() { int i; for( i = 0; i< 10 ; i++ ) { printf("test1 &d", i);
我有一个连接到远程服务器以查询数据的 C# 程序。数据很大,所以查询大约需要 2 分钟才能完成。在这 2 分钟的时间内,互联网中断了。这导致作业无法完成,程序卡在获取数据例程中。 它建立了连接,但在选
语句 1: [2,4,6,7,8].each do |i| (i % 2 == 0) || (puts "Not even" && break) puts i end 声明 2: [2
我想知道 C++ 是否有任何处理中断的方法。我希望一个程序将信息存储在文本文件中,而另一个程序根据文本文件中的内容打印一条语句。由于我希望它尽可能准确,因此我需要在更新程序更新文件时中断打印程序。 最
我正在尝试终止一个线程,但它不会中断或停止。所有这些都是名为 Webots 的软件 Controller 的一部分。我用它来模拟多机器人系统。在每个机器人的 Controller 中,我启动了一个线程
中断10h可以使用的服务有很多, 我想问一下关于其中两个我很困惑的问题 首先是, AH = 06H SCROLL UP WINDOW AH = 07H SCROLL DOWN WINDOW 在 D
我有一个基本的 SQL 问题,如果有两个事件连接,"A"和 "B"到 SQL 服务器,假设两者之间发生死锁,那么为了避免死锁,SQL 服务器将回滚其中一个连接“A”或“B”的交易。假设 SQL Ser
我有一个 mapkit/ View ,它工作正常 - 但我滚动并在 2 - 10 次移动后我的应用程序崩溃了......而且这只是一个“中断”。 这是我的代码的一部分。我认为这是后台线程和数组释放/覆
有什么办法可以做到,比如 C/C# ? 例如(C#风格) for (int i = 0; i Seq.tryFind (fun i -> printfn "%d" i i=66) 在实践中,
我的问题是Haskell如何与系统交互。 例如,IO如何发生? 我对IO monad不感兴趣。或者如何使Haskell打印字符串或读取文件。 我对Haskell和底层操作系统之间的层(如果是这样的话)
你能确认下一个break是否取消了内部for循环吗? for (out in 1:n_old){ id_velho <- old_table_df$id[out] for
我有一个程序可以进行一些数据分析,并且有几百行长。 在程序的早期,我想做一些质量控制,如果没有足够的数据,我希望程序终止并返回到 R 控制台。否则,我希望执行其余代码。 我尝试过break、brows
我有一个 if 语句,用于检查我的对象(向导)是否命中了项目。如果他这样做了,巫师的大小将会改变,他应该能够在与障碍物的 1 次碰撞中幸存。 现在我陷入了“在 1 个障碍物碰撞中幸存”,因为在我的碰撞
我正在尝试使用迭代器来显示很多内容。我不断收到“break;”错误线。它说这是一个无法访问的声明。如有任何帮助,我们将不胜感激。 public Lot getLot(int number) {
我正在创建一个应用程序,我需要在其中处理可能非常庞大且可能需要一些时间的数据。 现在我阅读了很多关于 IntentService 的资料,实际上我已经将它实现为处理 REST 调用的通信类,但现在我试
我有一个自定义的 UITableViewCell。该单元具有三个标签。最左边的“金额”标签具有以下约束。 在单元格的右侧,我有另一个标签,“Label Dollar Amount”。它具有以下约束:
我有以下不和谐嵌入: message.reply({ content: '', embed: { color: 11416728, author
JavaScript 不是我最擅长的技能,但我会尽力解释,所以就这样吧。我有人在我的网站上创建了一个幻灯片菜单,我也使用 jplayer 音乐播放器。 现在一切正常,直到我在顶部添加此脚本。由于某种原
我已经在 Ubuntu 上安装了 android studio,有一个带有损坏图像的 API,我也尝试过重新安装。我应该怎么做才能克服这个问题。 删除它后,它没有在 sdk 管理器中显示 提前致谢。
假设我的站点上有大约 10 个 css 文件。我想把它们合二为一。但是当我组合它们时(只是“连接”文件,以便将它们包含到 html 中),我的样式/布局中断了。这不是路径问题或其他问题,只是选择器无法
我是一名优秀的程序员,十分优秀!