【问题标题】:To what extent are interrupts supported in Win32?Win32 在多大程度上支持中断?
【发布时间】:2013-02-04 18:35:27
【问题描述】:

Win32 对处理器定义之外的中断的支持程度如何?例如,x86 机器定义了至少 18 个中断,包括诸如断点陷阱 (INT 3) 之类的陷阱。其他 19-255 个中断由 Intel 作为软件定义的中断保持打开状态。 Windows/WinAPI 是否使用了这些中的任何一个,或者它们只是开放且免费供应用程序随意使用?如果 Windows 使用它们,我在哪里可以找到相关文档?我在 MSDN 上看了看,找不到任何东西。

(顺便说一句,我正在做编译器、调试器和其他系统级编程,所以请不要一开始就对使用中断的可取性发表意见。)

【问题讨论】:

  • 应用程序本身不能注册中断处理程序,特别是因为中断处理程序往往在环 0 中运行。这必须由驱动程序来完成。我会下载 WinDDK 来看看和弄乱。

标签: c windows winapi assembly operating-system


【解决方案1】:

在 Win32 应用程序中,可能只有一个常用的中断,int 2Eh。它用作系统调用入口点。它类似于 DOS 中的int 21h。应用程序不使用其余的中断。

但是,应用程序可以通过结构化异常处理 (SEH)/矢量异常处理 (VEH) 处理一些 CPU 异常(和调试中断)。如果可能,Windows 会捕获源自应用程序的 CPU 异常并将它们反射回应用程序(Windows 在模仿 CPU 异常模型方面并不完美)。

Windows 在内部使用设备中断,不会让应用程序干扰它们。 x86 CPU 在内核运行的最高特权模式下处理中断。

如今,许多设备中断与固定中断向量无关,并且是可配置的,您需要使用诸如 PCI 之类的各种东西来查询或更改设置。

如果您想直接使用设备和中断,您需要为 Windows 编写内核模式驱动程序。有设备驱动工具包 (DDK) 和像 Windows Internals 这样的书籍可以帮助您入门。

不过,如果您正在寻找设备 XYZ 及其中断编程的详细信息,您不会在 MSDN 或 DDK 中找到所有内容或很多内容,因为您需要特定于硬件的信息,这些信息不在微软的控制。内核提供了执行 I/O 和处理中断所需的功能,但最终取决于设备驱动程序以一种或另一种方式使用它们。

【讨论】:

  • 在此之后,我检查了 Russinovich 的“Windows Internals 5”和其他一些来源,它有点证实了这一点。软件中断显然由操作系统汇集,并由充当包装器的 Windows 中的 APC 工具使用。理论上,只要用户进程有权限,您就可以激活软件中断,但如果 APC 所依赖的其他参数配置不正确,我猜它只会使进程崩溃。正如海报所说,您必须查询 Windows 以找出哪些 APC 处于活动状态。
  • 应用程序中的int 指令会将CPU 切换到内核模式。您将需要一些内核端的代码来为这个异常赋予意义。同样,硬件中断会将 CPU 切换到内核模式,这也是必要的。
  • int 2E 现在用的不多,通常所有的系统调用都是使用 syscall/sysenter 指令完成的,这些指令要快得多。但是,由于遗留原因,int 2E 仍由内核处理。
猜你喜欢
  • 1970-01-01
  • 2015-10-21
  • 2014-05-06
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2015-05-16
  • 2019-04-09
相关资源
最近更新 更多