首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

Xen Guest 中斷架構分析:硬件中斷與軟中斷在 VMX 非虛擬化路徑的處理

     編輯:關於.NET

中斷分類

  • 硬件中斷:真實設備中斷,經 VM-exit 陷入 Hypervisor 分發
  • 軟中斷:Hypervisor 內部模擬(定時器、UART 等),調用 do_IRQ 處理

核心處理路徑

1. VM-exit 處理入口

文件:arch/x86/vmx/vmx.c → vmx_vmexit_handler()

switch (exit_reason) {
    case EXIT_REASON_EXCEPTION_NMI: {
        unsigned int intr_info = __vmread(VM_EXIT_INTR_INFO);
        BUG_ON(!(intr_info & INTR_INFO_VALID_MASK));
        unsigned int vector = intr_info & INTR_INFO_VECTOR_MASK;
        
        // 【Hook 點】中斷向量攔截
        if (hook_idt) {
            joan_dprintk("Int:%d\n", vector);
        }
        // 處理 NMI 陰影、IRET 故障等...
    }
}

2. 軟中斷處理入口

文件:arch/x86/irq.c → do_IRQ()

spin_lock(&desc->lock);
desc->handler->ack(vector);

if (likely(desc->status & IRQ_GUEST)) {
    // 【Hook 點】Guest 中斷攔截
    if (hook_idt) {
        joan_dprintk("Int:%d\n", vector);
    }
    irq_enter();
    __do_IRQ_guest(vector);
    irq_exit();
    spin_unlock(&desc->lock);
    return;
}

// Host 中斷處理邏輯...
while (desc->status & IRQ_PENDING) {
    // 【Hook 點】併發處理循環攔截
    if (hook_idt) {
        joan_dprintk("Int:%d\n", vector);
    }
    // ...
}

Hook 設計關鍵點

  • 位置選擇:置於 irq_enter() 之前,縮短高 IRQL 執行時間
  • 上下文:硬件中斷在 VM-exit 上下文,軟中斷在中斷上下文
  • 同步:spin_lock 保護 irq_desc,Hook 內不得睡眠
  • 向量範圍:0-255,需區分 Exception/NMI/外部中斷

實驗驗證建議

  1. 啟用 hook_idt 內核參數
  2. 在 Guest 內觸發定時器、網卡、鍵盤中斷
  3. 觀察 Hypervisor 日誌輸出的向量號分布
  4. 對比 /proc/interrupts 驗證分發正確性

總結

Xen Guest 中斷處理呈現「硬件經 VM-exit、軟件經 do_IRQ」雙軌制。關鍵 Hook 點位於 vmx_vmexit_handler 異常分支與 do_IRQ Guest 分支。掌握此架構對虛擬化安全監控、性能分析、設備直通開發至關重要。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved