Windows 如何在同一系统上发送nmi
我需要在我正在工作的系统上发送nmi。我想测试一些我已经实现的东西。是否有任何windows驱动程序例程允许我们这样做?我想我可以用uu-outford向端口写入数据。还有别的办法吗 我还有一个问题。是否存在导致NMI的特定情况?(但是,我不希望系统出现BSOD或三重故障。) 感谢: 不可屏蔽中断(NMI)可通过以下两种方式之一生成:Windows 如何在同一系统上发送nmi,windows,windows-7,x86,x86-64,Windows,Windows 7,X86,X86 64,我需要在我正在工作的系统上发送nmi。我想测试一些我已经实现的东西。是否有任何windows驱动程序例程允许我们这样做?我想我可以用uu-outford向端口写入数据。还有别的办法吗 我还有一个问题。是否存在导致NMI的特定情况?(但是,我不希望系统出现BSOD或三重故障。) 感谢: 不可屏蔽中断(NMI)可通过以下两种方式之一生成: 外部硬件断言NMI引脚 处理器通过系统总线(奔腾4、Intel Core Duo、Intel Core 2、Intel Atom和Intel Xeon处理器)或
- 外部硬件断言NMI引脚
- 处理器通过系统总线(奔腾4、Intel Core Duo、Intel Core 2、Intel Atom和Intel Xeon处理器)或APIC串行总线(P6系列和奔腾处理器)接收消息,并采用NMI传递模式
int$2
(int 02h
,在英特尔语法中)。但是,如果需要确保它没有被屏蔽,则需要外部硬件来触发它,或者使用APIC
如果选择使用APIC发送NMI,最简单的方法是发送处理器间中断。要做到这一点,您需要访问本地APIC的寄存器,默认情况下,这些寄存器映射到地址0xFEE00000的物理内存中,尽管这是可以更改的。您需要找到包含APIC寄存器的物理页,并将其映射到虚拟内存中,以便访问它们 为了发送IPI,您需要写入中断配置寄存器。ICR的低32位位于APIC页面内的0x300,高32位位于0x310。要发送NMI,您需要:
#define APIC_ID_OFFSET 0x20
#define ICR_LOW_OFFSET 0x300
#define ICR_HIGH_OFFSET 0x310
// Convenience macro used to access APIC registers
#define APIC_REG(offset) (*(unsigned int*)(apicAddress + offset))
void *apicAddress; // This should contain the virtual address that the APIC registers are mapped to
// Get the current APIC ID. Leave it in the high 8 bits since that is where it needs to be written anyway
unsigned int apicID = APIC_REG(APIC_ID_OFFSET) & 0xFF000000;
unsigned int high = APIC_REG(ICR_HIGH_OFFSET) & 0x00FFFFFF;
high |= apicID;
unsigned int low = APIC_REG(ICR_LOW_OFFSET) & 0xFFF32000;
low |= 0x4400;
APIC_REG(ICR_HIGH_OFFSET) = high;
APIC_REG(ICR_LOW_OFFSET) = low;