设为首页 收藏本站
查看: 970|回复: 0

[经验分享] struct file_operations kvm_vm_fops

[复制链接]

尚未签到

发表于 2015-10-10 12:41:53 | 显示全部楼层 |阅读模式
  KVM在和用户态程序进行交互的过程中,主要通过/dev/kvm设备文件进行通信。从后文的KVM的初始化过程中可以得知,/dev/kvm是一个字符型设备,通过符合Linux标准的一系列结构体进行支撑,主要是kvm_chardev_ops、kvm_vm_fops、kvm_vcpu_fops,分别对应字符型设备、VM文件描述符和VCPU文件描述符的三种操作。
  kvm_chardev_ops的定义在virt/kvm/kvm_main.c中,代码如下:

代码5-4  kvm_chardev_ops

(1913) static struct file_operations kvm_chardev_ops = {
(1914)  .unlocked_ioctl = kvm_dev_ioctl,
(1915)  .compat_ioctl   = kvm_dev_ioctl,
(1916)  .llseek  = noop_llseek,
(1917) };

  kvm_chardev_ops为一个标准的file_operations结构体,但是只包含了ioctl函数,read、open、write等常见的系统调用均采用默认实现。因此,就只能在用户态通过ioctl函数进行操作。
  如前文所述,通过KVM_CREATE_VM之后可以获得一个fd文件描述符,代表该VM,该fd文件描述符在KVM子模块内部操作实际上对应着kvm_vm_ fops结构体,其主要内容如下。
  代码5-5  kvm_vm_fops结构体

(1815) static struct file_operations kvm_vm_fops = {
(1816)  .release        = kvm_vm_release,
(1817)  .unlocked_ioctl = kvm_vm_ioctl,
(1818) #ifdef CONFIG_COMPAT
(1819)  .compat_ioctl   = kvm_vm_compat_ioctl,
(1820) #endif
(1821)  .mmap           = kvm_vm_mmap,
(1822)  .llseek  = noop_llseek,
(1823) };

  针对VM的文件操作中,提供了ioctl和mmap两个操作函数,其中mmap对应着GUEST OS的物理地址,可以直接对GUEST OS的地址空间进行读/写,ioctl则用于发送KVM的控制字。
  针对KVM的fd,通过KVM_CREATE_VCPU指令字可以创建KVM的VCPU,并且获得该vcpu_fd,在KVM子模块中的操作对应着该结构体。vcpu_fd的操作主要包含在kvm_vcpu_fops中,其主要定义如下。
  代码5-6  kvm_vcpu_fops结构体

(1348) static struct file_operations kvm_vcpu_fops = {
(1349)  .release        = kvm_vcpu_release,
(1350)  .unlocked_ioctl = kvm_vcpu_ioctl,
(1351)  .compat_ioctl   = kvm_vcpu_ioctl,
(1352)  .mmap           = kvm_vcpu_mmap,
(1353)  .llseek  = noop_llseek,
(1354) };

  在ioctl中,通过发送ioctl,即可对VCPU进行控制。通过mmap,则可以访问kvm_run结构体,在这个结构体中保存了VCPU运行和控制的信息,并且可以对其运行参数进行设置。
         版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-125095-1-1.html 上篇帖子: centos7下安装KVM虚拟机 下篇帖子: KVM虚拟化管理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表