1. VCPU是线程不?

2. VCPU的线程是在用户态创建还是在KVM创建?
    用户态,qemu先创建用户态线程,然后调用KVM ioctl的KVM_CREATE_VCPU;
    最终会执行到kvm_main.c中kvm_vm_ioctl_create_vcpu,创建出VCPU;
    而用户态线程调用KVM ioctl的KVM_RUN时,发起调用的线程将会作为VCPU的线程执行Guest代码;

3. 进入Guest代码的点?
    在__kvm_vpu_run函数会将当前EL1寄存器状态保存,并打开EL2的trap,配置VTTBR、VPIDR等寄存器;
    配置VGIC并将Guest的EL1相关寄存器更改为Guest的context;
    真实进入Guest代码的点是__guest_enter(vcpu, host_ctxt),保存X19-X30寄存器并eret到EL1

4. 退出Guest代码的点?
    而Guest的退出必然是由exception(包括IRQ)触发的,最终又会走到__guest_exit(),保存Guest X2-X30;
    然后恢复Host X19-X30,将退出码放到X0并ret(X0再gcc中用于存函数返回值),回到__kvm_vpu_run函数。

5. VCPU的调度与用户线程的调度有何不同?
    VCPU的调度与线程是一样的;

6. 傻子也能看得出,VCPU的context比一个thread得多出一堆EL1的特殊寄存器吧,你告诉我VCPU的调度跟线程一样?
    是的,就是一样的,虽然KVM在task_struct中多注册了preempt_notifiers元素;
    我仔细分析了这个notifier:
        这个notifier中的preempt_ops有sched_in/sched_out两个方法:
        schedule调度入口在执行context_switch时,
            在prepare_task_switch中调用了fire_sched_out_preempt_notifier,
            在finish_task_switch中调用了fire_sched_in_preempt_notifier;
    struct kvm_vcpu->preempt_notifier中的sched_in/sched_out在上述两处被调用
    但这仅在CONFIG_PREEMPT_NOTIFIERS打开时,才可能有用(还受preempt_notifier_key变量控制);
    并且我自己查找并确认,#####sched_in/sched_out并没有保存/恢复EL1的各个特殊寄存器#####

7. 那么EL1的特殊寄存器集合是如何在每次context切换中保存/恢复的:
    我认为是在__kvm_vpu_run
    下面的分析没有Google到太权威的支撑,但是经过对kernel4.15代码的分析、搜索,我认为这是对的:
    首先要说,当VCPU在物理CPU中运行时,物理中断发生,是可以对其打断并进入异常向量处理的,
    根据__kvm_hyp_vector中的指示,大概就是陷入EL2 context,然后走el1_irq向量,然后执行__guest_exit,也就是4.中所说退出Guest的点
    在Guest退出点会恢复之前的线程上下文(依旧在EL2中),也就是回到__kvm_vcpu_run中,若事件可直接处理,在处理完毕后可直接再回到Guest上下文;
    若无法直接处理则保存Guest上下文并退出EL2。

在整个退出EL2之前,我认为没有机会触发Host schedule,Host调度Timer等需要Host处理的中断,自然会使VCPU保存Guest上下文并走到Host处理流程。

对比线程,一个VCPU是什么相关推荐

  1. 多线程下的生产者消费者(一个初始值为0的变量,两个线程一个加1一个减1,轮询5轮)

    在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了.配合Object的wait().notify()系列方法可以实现等待/通知模式.Condition接口 ...

  2. java编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z。打印顺序为12A34B56C….5152Z。即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替

    2.编写两个线程,一个线程打印1-52的整数,另一个线程打印字母A-Z.打印顺序为12A34B56C-.5152Z.即按照整数和字母的顺序从小到大打印,并且每打印两个整数后,打印一个字母,交替循环打印 ...

  3. python多线程和异步性能对比_python对比线程,进程,携程,异步,哪个快

    目录 概念介绍 测试环境 开始测试 测试[单进程单线程] 测试[多进程 并行] 测试[多线程 并发] 测试[协程 + 异步] 结果对比 绘图展示 概念介绍 首先简单介绍几个概念: 进程和线程 进程就是 ...

  4. 代码对比与文件对比的一个简单方法

    使用的工具为Beyond Compare,Beyond Compare这款软件是专门为常常要对文件及文件夹操作的朋友设计的.如平常我们要对文件进行对比,文件夹的同步等操作,用他就能很简单的实现这些需求 ...

  5. 一台服务器最多多少个线程,一个电脑最多能开启多少个线程?

    -- 一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个.一个解决办法是创建线程时减少 ...

  6. java 两个url对比_一个URL模式中的两个slu ..

    如何将两个slu in放在一个url模式中?我有一个与模型类别有多对一关系的模型链接 . url( regex=r'^(?P[\w-]+)/(?P\d+)(?:/(?P[\w\d-]+))?/$', ...

  7. 宝马 Esys plus NCD对比的一个辅助工具

    在对宝马汽车设码的时候,经常会用到 Esys plus NCD对比功能. 对比的结果需要保存,本人开始用Excel,想把结果分列,但结果太麻烦,还是自己写个软件,把结果筛选需要保存的部分,方便设码.免 ...

  8. C++作用域、局部变量、全局变量、传引用传值对比的一个例子

    参考博文:<Essential C++>笔记之传引用&(pass by reference)分析 参考博文:C++基础与深度解析第六章:函数 传引用

  9. python之进程和线程的对比

    python之进程和线程的对比 1. 进程和线程的对比的三个方向 关系对比 区别对比 优缺点对比 2. 关系对比 线程是依附在进程里面的,没有进程就没有线程. 一个进程默认提供一条线程,进程可以创建多 ...

  10. python提高——进程、线程、协程对比及代码实现

    目录 1多任务 1.1并发 1.2并行 2线程 2.1引入线程 2.2线程进行顺序 2.3线程封装 2.4多线程-共享全局变量 2.5资源竞争 2.6互斥锁 2.7死锁 3进程 3.1进程创建 3.2 ...

最新文章

  1. python操作微信小程序云端数据库_微信小程序云开发之数据库操作
  2. 业内首创普惠保险,看国泰产险如何借助数据进行智能化的升级和战略转型
  3. [USACO15FEB]Superbull (最小生成树)
  4. Android学习第三天--事件监听器
  5. Python 全国考级二级
  6. java 动态网页_JavaWeb01-动态网页
  7. 厦门大学c语言上机答案,厦门大学C语言程序设计2016模拟题讲评及课程复习.pptx...
  8. JavaAPI之Runtime类以及bat文件开启应用程序
  9. linux启动 mongo 不了问题
  10. ADI公司完成对凌力尔特公司的收购
  11. ATP-EMTP电缆LCC模型中相数与电缆数的设置
  12. IntelliJ IDEA插件的Jrebel激活踩坑【内网离线使用】
  13. 2017年网络小说人气排行榜
  14. 1寸、2寸、小2寸的照片尺寸是多少
  15. alanwang[GDOU] 直接插入排序法简单演示
  16. 关于网络性能的一些指标
  17. IDEA自动补全tab键向下选择s-tab向上选择
  18. 分数化成有限小数的方法_小数化成分数的方法
  19. Apache2.2.22 + PHP5.2.17 + MySQL5.5.22 快速搭建部署PHPWind开源论坛
  20. python pandas AttributeError: ‘DataFrame‘ object has no attribute ‘ix‘

热门文章

  1. 嵌入式开发笔记——调试组件SEGGER_HardFaultHandle
  2. 运用ssis组件实现邮件发送,内容来源于数据库表
  3. 不想更新计算机怎么办,联想笔记本电脑不想更新系统更新怎么办啊
  4. 1stopt(应用集锦)
  5. ps3手柄在linux ubuntu 下的使用
  6. 字号大小对应表(字号换算磅值)
  7. Ubuntu18.04安装PX4并与ROS联合实验
  8. linux系统svn安装教程,Linux下SVN安装配置
  9. 最全-最详细的进制转换
  10. 进制之间的转换(史上最全自己纯手工总结)