问题标签 [assembly-trap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
exception-handling - 内核软件陷阱处理
我正在读一本关于 Windows Internals 的书,但有些东西我不明白:
“内核处理软件中断或者作为硬件中断处理的一部分,或者在线程调用与软件中断相关的内核函数时同步处理。”
那么这是否意味着软件中断或异常将仅在以下条件下处理:
****一个。当内核从所述线程执行与软件异常(陷阱)相关的函数时 b.当它已经在处理硬件陷阱时****
我对此的理解正确吗?
下一点:
“在大多数情况下,内核会安装前端陷阱处理函数,这些函数在将控制权转移到其他触发陷阱的函数之前和之后执行一般的陷阱处理任务。”
我不太明白“前端陷阱处理功能”和“现场陷阱”是什么意思?
谁能帮我?
c++ - 如何使用 gdb 调试 SIGTRAP?
我自己的程序使用 SIGTRAP 信号。我想使用 gdb 来调试我的程序。但是,当在我的程序中引发 SIGTRAP 时,gdb 无法进入我的陷阱处理程序。
如何单步进入我的陷阱处理程序?
operating-system - 为什么发出陷阱不是一项特权任务?
在对“操作系统概念”一书的问题的解决方案中,它表明发出陷阱不是特权任务。为什么呢?
exception - 硬件或软件中断或陷阱指令异常?
手册说_
陷阱指令
当程序发出陷阱指令时,处理器会产生软件陷阱异常。当程序需要操作系统提供服务时,程序通常会发出软件陷阱。操作系统的通用异常处理程序确定陷阱的原因并做出适当的响应。
但是,当我之前询问它时,答案说这是一个软件中断:
对于不同的架构,异常和中断之间的差异似乎也略有不同,因此可以有 4 种组合 (?) 的硬件、软件、异常和中断。
现在我正在为一个小型系统研究这个程序集,我认为我可以自己学习个别指令,但我正在寻求帮助以理解更大的图景,为什么事件完全是软件异常而不是硬件异常,硬件中断,软件中断。
operating-system - 指令如何知道它是在特权模式还是用户模式下运行?
教授在课堂上说“[汇编]指令知道它是在特权模式还是用户模式下运行,因为如果产生了陷阱,那么它就是用户模式”。
首先,我假设它不能是任何陷阱,而是一个特定的陷阱,表示该命令不能在用户模式下运行。
其次,这似乎非常低效:运行整个命令并检查是否存在陷阱。为什么没有设置标志或其他东西?这不是说如果它不起作用,那么我们就知道有问题吗?所以真的没有办法检查吗?
emulation - HYPERVISORS:不同的虚拟化技术缺乏功能
在使用 Intel 的 VMX 和 ARM 的 virt-extensions 时,我注意到缺少在实现管理程序时非常有用的功能。
在管理程序的工作中,通常需要捕获客户行为,但仅用于跟踪目的(即,客户可以正常执行指令,但我们需要先做一些事情 - 例如日志记录)。
更准确地说,举以下例子:在我前段时间实现的一个 Intel 虚拟机管理程序上(以Windows 7作为客户机),每当修改 Windows 内核结构时,我都需要记录。为此,我找到了内核结构的物理地址,并删除了 guest 对相应 EPT 页的写权限。因此,每当客户试图写入(修改)结构时,就会发生EPT 违规,从而导致管理程序陷阱。
对于每一次这样的 EPT 违规,我都会采取以下策略之一:
策略一:
- 激活监视器陷阱标志
- 临时授予guest权限写入区域(EPT修改)
- VMRESUME =>由于MTF被激活,客户将立即执行指令和VMEXIT
- 在下一个VMEXIT上,我将停用MTF并重新禁止来宾写入结构(=EPT 修改 + 失效)和VMRESUME再次
策略二:
- 模拟要编写结构的指令。这意味着要编写一个模拟器(>反汇编器)。
如您所见,即使没有多处理意识,这两种策略都有些复杂。关于策略 1,如果要在多个处理器上虚拟化 Windows,我们还必须在处理 EPT 违规时将 IPI 发送到其他内核以暂停它们。另外,这是一个具体的例子,它暗示了一个具体的策略。跟踪的另一个示例可能是例如在调用内核函数时记录和/或修改内核函数的参数。在这种情况下,我们可能需要不同的策略。
我想是时候进入正题了。我的困境如下。每当我们需要跟踪客户行为时,避免复杂编程策略的一种简单方法是让虚拟化技术提供动态选择指令陷阱是在执行之前还是之后发生的可能性。
甚至在编写我的第一个虚拟机管理程序(在 Intel 上)之前,我几乎确信 VMX 会为我提供这样的功能。我的想法告诉我,这将是任何平台上的任何虚拟化技术都提供的一个显而易见的特性,所以当我发现它实际上不是时我很惊讶(也有点沮丧):不是在英特尔上,不是在 ARM 上(正如我最近发现的那样out) 并且很可能不在其他平台上。因此,我的问题实际上是:为什么?为什么硬件虚拟化“设计者”不实现这样的功能?我确信之前已经考虑过,因此对我来说唯一可能的答案似乎是硬件方面的这种功能实现将非常困难甚至不可能,尽管我不明白为什么这是真的。
提前感谢您的回答:)
编辑
虽然我没有说清楚,但我还想指出这样一个事实,即在许多情况下,程序员想要以改变其效果的意图来捕获一些客人的行为(因此暗示的不仅仅是跟踪),但在这种功能仍然非常有用。
以下面的例子为例。让我们假设我希望我的虚拟机管理程序控制来宾与内存映射设备的通信(甚至完全模拟一个 - 当今虚拟机管理程序的一个非常普遍的要求)。大多数情况下,我们会告诉客人该设备在地址A上进行内存映射,并挂钩对该地址的写入/读取操作。当一条被捕获的指令试图读/写地址A的区域时,目前我们被迫反汇编并模拟它. 如果管理程序为我们提供了让指令以临时 r/w 权限执行并在其后立即捕获的可能性,那么模拟指令将变得不必要,因为我们可以让它执行并在之后“添加”所需的效果。
arm - ARM HYPERVISOR:执行单条指令和陷阱(相当于Intel的MTF)
我正在 ARM 上实现一个虚拟机管理程序,我需要知道是否有办法在单条指令执行后恢复 ( ERET ) 来宾和陷阱,而不依赖于调试架构 (v7.1) 。我可以通过将来宾的下一条指令修改为HVC(相当于 Intel 上的VMCALL)来使用软件方法,但我不知道如何处理导致分支的指令(JMP)。
在英特尔上,我可以使用陷阱标志(= RFLAGS中的TF位,每个操作系统线程上下文)或监视器陷阱标志(= MTF,VT-x功能)。
谢谢
编辑:澄清
- 我想避免反汇编/仿真(尽可能)
linux - Determine CPU trap that caused SIGSEGV under GDB?
I've got a program that's SIGSEGV
'ing in library code. Nothing is jumping out at me when looking at the statement that's causing the SIGSEGV
(see below). But the code uses Intel's AES-NI, and I'm not that familiar with it.
I issued handle all
in hopes of catching the trap that's causing the SIGSEGV
, but the program still just crashes rather than telling me the trap.
How can I get GDB to display the CPU trap that's causing the SIGSEGV
?
interrupt - 为什么页面错误被认为是陷阱
为什么页面错误被认为是陷阱而不是中断?当您尝试访问空指针直到出现分段错误时,究竟会发生什么阶段?以及在这种情况下发送的信号我 SIGILL,对吗?谢谢!
exception - 运行中断处理程序是创建一个新进程,还是现有进程的一部分?
从https://en.wikipedia.org/wiki/Interrupt开始,共有三种不同的中断:
硬件中断,
由处理器本身的异常情况引起的软件中断(通常称为陷阱或异常)
由执行指令集中的特殊指令引起的软件中断。(例如系统调用)
我的问题是,当 CPU 切换到运行中断处理程序时,
是否为运行中断处理程序创建了一个新进程?
或者是现有进程的中断处理程序部分的运行,例如
- 在第一种中断中,从硬件设备请求某些服务然后等待硬件中断指示设备操作完成的过程,
- 在第二种中断中导致异常的过程,
- 在第三种中断中进行系统调用的过程。