Linux内核中获取虚拟机KVM信息以及vCPU个数

  • 1 问题
  • 2 解决方案
    • 2.1 过程实现
    • 2.2 代码实现
    • 2.3 原理分析

1 问题

目的: 想要在内核中获取一个虚拟机进程配置的vCPU个数。
已知的信息: 虚拟机进程的进程结构体(即task_struct结构体)。

2 解决方案

2.1 过程实现

  1. 首先在进程的task_struct结构体中找到struct files_struct,里面记录了所有打开的文件。
  2. 遍历files_struct中所有文件,找到一个路径为“anon_inode:kvm-vm”的struct file,该struct file的private_data就是我们要的struct kvm。
  3. stuct kvm中的online_vcpus字段就存放着为当前虚拟机进程配置的vCPU个数。

2.2 代码实现


static int get_vm_vcpus(struct task_struct *task)
{struct files_struct *files;struct file *file;char buffer[32];char *fname;int fd, max_fds;struct kvm *kvm = NULL;files = task->files;max_fds = files_fdtable(files)->max_fds;for (fd = 0; fd < max_fds; fd++){if (!(file = fcheck_files(files, fd)))continue;fname = d_path(&(file->f_path), buffer, sizeof(buffer));if (fname < buffer || fname >= buffer + sizeof(buffer))continue;if (strcmp(fname, "anon_inode:kvm-vm") == 0){kvm = file->private_data;// assert(kvm);// kvm_get_kvm(kvm);// return kvm;return atomic_read(&kvm->online_vcpus);// printk("task=%s, vcpus num=%lu\n", task->comm, kvm->online_vcpus);}}return -1;
}

2.3 原理分析

请参考 根据QEMU的pid找到kvm结构体和EPT根地址

Linux内核中获取虚拟机KVM结构体信息以及vCPU个数相关推荐

  1. Linux内核中获取纳秒时间戳的方法

    Linux内核中获取纳秒时间戳的方法 1 方法1:使用getnstimeofday64方法 2 方法2:使用ktime_get_real_ns方法 1 方法1:使用getnstimeofday64方法 ...

  2. 【Linux 内核】进程管理 task_struct 结构体 ④ ( comm 字段 | 进程优先级字段 | cpus_ptr 字段 | mm、active_mm 字段 | fs 字段 )

    文章目录 一.task_struct 结构体字段分析 1.comm 字段 2.进程优先级字段 3.cpus_ptr 字段 4.mm.active_mm 字段 5. fs 字段 在 Linux 内核 中 ...

  3. 【Linux 内核】进程管理 task_struct 结构体 ⑤ ( files 字段 | nsproxy 字段 | 信号处理相关字段 | 信号量和共享内存相关字段 )

    文章目录 一.task_struct 结构体字段分析 1.files 字段 2.nsproxy 字段 3.信号处理相关字段 4.信号量和共享内存相关字段 在 Linux 内核 中 , " 进 ...

  4. 【Linux 内核】进程管理 task_struct 结构体 ③ ( real_parent 字段 | parent 字段 | group_leader 字段 | real_cred、cred字段 )

    文章目录 一.task_struct 结构体字段分析 1.real_parent 字段 2.parent 字段 3.group_leader 字段 4.real_cred 字段 5.cred 字段 在 ...

  5. 【Linux 内核】进程管理 task_struct 结构体 ② ( state 字段 | stack 字段 | pid 字段 | tgid 字段 | pid_links 字段 )

    文章目录 一.task_struct 结构体字段分析 1.state 字段 2.stack 字段 3.pid字段 4.tgid 字段 5.pid_links 字段 在 Linux 内核 中 , &qu ...

  6. 【Linux 内核】进程管理 task_struct 结构体 ① ( task_struct 结构体引入 | task_struct 代码示例 )

    文章目录 一.task_struct 结构体 二.task_struct 结构体代码示例 一.task_struct 结构体 在 Linux 操作系统 中 , 进程 作为 调度的实体 , 需要将其抽象 ...

  7. 从Linux内核中获取真随机数【转】

    转自:http://www.cnblogs.com/bigship/archive/2010/04/04/1704228.html 内核随机数产生器 Linux内核实现了一个随机数产生器,从理论上说这 ...

  8. linux内核中获取虚拟地址api,Linux内核-系统调用

    Linux内核-系统调用 1.与内核通信 #系统调用在用户空间进程和硬件设备之间添加了一个中间层 作用:1.为用户空间提供了一种硬件的抽象接口 2.系统调用保证了系统的稳定和安全 3.出于每一个进程都 ...

  9. linux内核中测量时间的方法,Linux内核中获取时间函数do_gettimeofday

    内核代码能一直获取一个当前时间的表示, 通过查看 jifies 的值. 常常地, 这个值只代表从最后一次启动以来的时间, 这个事实对驱动来说无关, 因为它的生命周期受限于系统的 uptime. 如所示 ...

  10. Linux内核中无名管道pipe和有名管道fifo的分析

    1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...

最新文章

  1. 微软面试题:鸡蛋从第N层及以上的楼层落下会摔破
  2. Docker Swarm集群config集中管理配置文件
  3. 易语言单窗口单ip软件源码_游戏工作室如何防封?游戏账号和IP被封的解决方法...
  4. 蒸汽机器人q和锤石q_英雄联盟:圣杯锤石的启发,辅助的作用是否应该更倾向多元化?...
  5. SPSS基础操作(二):用迭代法处理序列相关,并建立回归方程
  6. Ionic 框架宣布 2019 年将正式支持 Vue 和 React
  7. java界面字体大小设置_怎样更改电脑界面的字体大小?
  8. mybatis 同名方法_判断同名股票是否存在的MyBatis查询函数写法
  9. 用C语言统计给定文本文件中汉字的个数
  10. ADO.NET入门教程(六) 谈谈Command对象与数据检索
  11. python各种库下载地址:
  12. java易宝支付接口文档_易宝支付的最新接口文档
  13. 4个设计师必备的设计网站,马住了
  14. 【Linux网络编程(九)】ping命令 arp工作流程
  15. 深度学习--------图片的位深度含义
  16. 使用u盘安装Red Hat Enterprise 6.0
  17. 8款惊艳的HTML5粒子动画特效,超级惊艳 8款HTML5动画特效推荐源码
  18. tl494c封装区别_TL494芯片详细资料
  19. 三菱伺服电机故障代码维修
  20. MT4_应用于外汇交易的量化模型

热门文章

  1. python-微信公众个性二维码生成-生成自己名片二维码-链接二维码【超酷】
  2. 机器学习7-逻辑斯蒂回归实现西瓜数据集2.0的二分类
  3. pythonqq机器人酷q_基于python和酷Q的QQ机器人开发实践(1)
  4. 第六章 算法algorithms
  5. 使用liteide开发go遇到的问题
  6. Nifi从入门到精通(一)之 数据存储
  7. 最近火爆的美团饿了么外卖cps分销裂变小程序搭建及推广秘籍(附搭建源码)
  8. matlab simulink教程pdf,Simulink基础入门教程“完整版”.pdf
  9. 华为OSN7500结构特点及产品定位相关知识
  10. 【mybatis plus源码解析】(三)自定义SQL注入器,教你如何自定义扩展BaseMapper接口方法,实现更多查询