QEMU中VCPU线程间的IPI发送核间中断(基于QEMU2.0.0)
来源:互联网 发布:迅龙数据恢复软件安卓 编辑:程序博客网 时间:2024/06/05 07:53
我们都知道对于多核CPU需要IPI机制进行通知或者唤醒,当CPU接收到的中断不是本地中断的时候,需要通过IPI唤醒对端CPU,然后进行中断的传递
那么QEMU中如何实现不同VCPU通知的呢
* 注册CPU见通信接口
*/
/*
* 启动指定的VCPU,
*/
void qemu_cpu_kick(CPUState *cpu)
{
/*
* 唤醒所有等待在cpu->halt_cond上的VCPU线程,关于QEMUCond,请参考《QEMU VCPU线程同步机制之QemuCond(基于QEMU2.0.0)》
*/
qemu_cond_broadcast(cpu->halt_cond);
/*
* 对于不是TCG的且还没有被kick的VCPU线程进行唤醒
*/
if (!tcg_enabled() && !cpu->thread_kicked) {
qemu_cpu_kick_thread(cpu);
cpu->thread_kicked = true; //标明指定的VCPU线程已被唤醒
}
}
/*
* 唤醒指定的VCPU线程
*/
static void qemu_cpu_kick_thread(CPUState *cpu)
{
#ifndef _WIN32
int err;
/*
* 通过pthread_kill将SIG_IPI信号发送到指定的VCPU线程,将其唤醒
*/
err = pthread_kill(cpu->thread->thread, SIG_IPI);
if (err) {
fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
exit(1);
}
#else /* _WIN32 */
#endif
}
首先在初始化KVM虚拟机的时候,注册了核间通信处理函数,这个函数完成了IPI的功能
int kvm_init(QEMUMachine *machine){
/** 注册CPU见通信接口
*/
cpu_interrupt_handler = kvm_handle_interrupt;
}
/*
* CPU的IPI通信接口
*/
static void kvm_handle_interrupt(CPUState *cpu, int mask)
{
/*记录中断请求号*/
cpu->interrupt_request |= mask;
/*如果不是本地CPU,启动相应的VCPU接收中断*/
if (!qemu_cpu_is_self(cpu)) {
qemu_cpu_kick(cpu);
}
}
* CPU的IPI通信接口
*/
static void kvm_handle_interrupt(CPUState *cpu, int mask)
{
/*记录中断请求号*/
cpu->interrupt_request |= mask;
/*如果不是本地CPU,启动相应的VCPU接收中断*/
if (!qemu_cpu_is_self(cpu)) {
qemu_cpu_kick(cpu);
}
}
/*
* 启动指定的VCPU,
*/
void qemu_cpu_kick(CPUState *cpu)
{
/*
* 唤醒所有等待在cpu->halt_cond上的VCPU线程,关于QEMUCond,请参考《QEMU VCPU线程同步机制之QemuCond(基于QEMU2.0.0)》
*/
qemu_cond_broadcast(cpu->halt_cond);
/*
* 对于不是TCG的且还没有被kick的VCPU线程进行唤醒
*/
if (!tcg_enabled() && !cpu->thread_kicked) {
qemu_cpu_kick_thread(cpu);
cpu->thread_kicked = true; //标明指定的VCPU线程已被唤醒
}
}
/*
* 唤醒指定的VCPU线程
*/
static void qemu_cpu_kick_thread(CPUState *cpu)
{
#ifndef _WIN32
int err;
/*
* 通过pthread_kill将SIG_IPI信号发送到指定的VCPU线程,将其唤醒
*/
err = pthread_kill(cpu->thread->thread, SIG_IPI);
if (err) {
fprintf(stderr, "qemu:%s: %s", __func__, strerror(err));
exit(1);
}
#else /* _WIN32 */
#endif
}
我们下面来看一下IPI的使用示例,
pic_irq_request是通过pc_init->pc_allocate_cpu_irq,注册的irq的handler
pic_irq_request
-> cpu_interrupt
-> cpu_interrupt_handler //这里调用kvm_handle_interrupt
-> kvm_handle_interrupt //唤醒指定VCPU的线程,发送中断
0 0
- QEMU中VCPU线程间的IPI发送核间中断(基于QEMU2.0.0)
- QEMU VCPU线程同步机制之QemuCond(基于QEMU2.0.0)
- QEMU的128位算法集合(基于QEMU2.0.0)
- 核间中断IPI的机制
- Qemu Network Device全虚拟:前端网络流的建立(基于QEMU2.0.0)
- 全面解析Linux 内核 3.10.x - IPI核间中断的应用
- qemu中VCPU的创建按流程
- QEMU内存管理之生成FlatView内存拓扑模型过程分析(基于QEMU2.0.0)
- QEMU通过virtio接收报文处理流程(QEMU2.0.0)
- QEMU内存管理之FlatView模型(QEMU2.0.0)
- [名词解释]IPI: Inter-Processor Interrupt(处理器之间的中断)
- qemu-kvm virtio 虚拟化-----Linux客户机 virtio设备初始化 (基于Qemu2.0.0 & kernel 3.10.0)
- qemu-kvm (QEMU2.0.0)代码分析
- vring的创建(基于kernel 3.10, qemu2.0.0)
- 关于qemu的二三事(6)————qemu源码分析之vcpu
- QEMU的AddrRange地址空间对象模型算法总结(QEMU2.0.0)
- KVM虚拟机发送IPI的流程
- IPI中断机制
- QEMU VCPU线程同步机制之QemuCond(基于QEMU2.0.0)
- ARM SERVER 虚拟机挂载多块磁盘问题的解决方法
- Samba服务器的配置
- 通过KVM_SET_USER_MEMORY_REGION操作虚拟机内存(Kernel 3.10.0 & qemu 2.0.0)
- eclipse 如何将maven target目录排除在搜索结果之外?
- QEMU中VCPU线程间的IPI发送核间中断(基于QEMU2.0.0)
- QEMU的128位算法集合(基于QEMU2.0.0)
- VI VIM 在行首行尾添加文字字符串
- vmware workstation11安装redhat5
- QEMU的AddrRange地址空间对象模型算法总结(QEMU2.0.0)
- Android sendevent/getevent 用法
- CoreAnimation --> CADisplayLink
- QEMU内存管理之FlatView模型(QEMU2.0.0)
- MemoryRegion模型原理,以及同FlatView模型的关系(QEMU2.0.0)
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
大白及
大白腚
大白美乳
刷大白
机器人大白
大白嗓
大白猪养殖
大白脚
挂大白
大白喷涂机
大白菇
大白狗腿
大白乳胶漆
大白娃娃
大白鱼
大白虾
大白免
大白伞盖
大白肾
大白浆
街拍大白腿
大白馒头
大白狗
大白胸
性感大白腿
悦大白
老师的大白乳
大白鹅模拟器
大白鹅简笔画
街拍大白腿热裤图片
大白牙牙牙作品
锦绣之路大白牙牙牙
街拍重庆大白腿
大白是什么意思
大白的英文名
超能陆战队大白图片
超能陆战队大白
大白种猪价格
大白鹅多少钱一斤
大白鹅苗价格
大白鹅的价格