Skip to the content.

tcg pic

x86_allocate_cpu_irq 会创建出来一个 qemu_irq 出来,其 handler 为 pic_irq_request

在 pic_irq_request 中,会首先判断是否需要发送给 lapic,如果是,那么调用 apic_deliver_pic_intr 如果不是,那么使用 cpu_interrupt 直接发送给 cpu 了。

tcg ioapic

发送给 ioapic 的中断的入口是 ioapic_set_irq,而经过 ioapic 通过调用 ioapic_service 将中断转发到 ioapic 上。

- main 
  - qemu_main_loop 
    - main_loop_wait 
      - qemu_clock_run_all_timers 
        - timerlist_run_timers 
          - timerlist_run_timers 
            - update_irq 
              - qemu_irq_pulse 
                - gsi_handler 
                  - ioapic_set_irq 
                    - ioapic_service 
                      - stl_le_phys 
                        - address_space_stl_le 
                          - address_space_stl_internal 
                            - memory_region_dispatch_write 
                              - access_with_adjusted_size 
                                - memory_region_write_accessor 
                                  - apic_mem_write 
                                    - apic_send_msi 

整理一下这个东西

首先来回忆一下整个 vCPU 的执行流程

当需要插入中断的时候,最后调用到 cpu_interrupt 上,

    cpu->interrupt_request |= mask;

在 cpu_handle_interrupt 中检测到 interrupt_request 上之后,会调用和 arch 相关的实现函数来处理:

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。