b2c信息网

您现在的位置是:首页 > 明日新闻 > 正文

明日新闻

kvm源码分析书籍(kvm源代码分析)

hacker2022-06-12 23:35:16明日新闻39
本文目录一览:1、kvm跨系统原理2、

本文目录一览:

kvm跨系统原理

KVM源代码分析1:基本工作原理 下了很大决心挖这个坑,虽然之前对kvm有些了解,但纸上得来终觉浅,只有深入到代码层面,才能摈弃皮毛,看到血肉,看到真相。作为挖坑的奠基石,准备写上几篇:kvm基本工作原理、CPU

调度原理、KVM内存管理、KVM存储管理、KVM设备管理。挖好之后进入正题。  所有的虚拟化都是两部分组成:虚拟机和宿主(HOST),虚拟机内运行正常的业务程序,HOST则正常运行虚拟机,此处的虚拟机则是KVM,负责在HOST里面虚拟化出独立的OS环境。 KVM属于完全虚拟化,功能组件上由两部分组成,KVM Driver(内核态)和Qemu(用户态)。KVM Driver负责模拟虚拟机的CPU运行,内存管理,设备管理等;Qemu则模拟虚拟机的IO设备接口以及用户态控制接口。    kvm-oenhan  如上图所示,Qemu在最上层,将虚拟机的整体呈现到host用户上,可以理解成客户模式;Qemu通过中间层libkvm或者ioctl等控制/dev/kvm设备接口,从而掌握内核态中kvm

驱动进行的资源分配,即用户态模式;kvm驱动接收用户态操作指令,控制虚拟机在内核态的资源分配,称之为内核模式。在HOST里面,客户模式的体现就是一个虚拟机内部环境,用户态则是虚拟机进程。

  oenhan_kvm  上图是一个执行过程图,首先启动一个虚拟化管理软件,开始启动一个虚拟机,通过ioctl等系统调用向内核中申请指定的资源,搭建好虚拟环境,启动虚拟机内的系统,虚拟机内的系统向内核反馈相关资源申请处理,如果是io请求,则提交给用户模式下的qemu处理,非io请求则将处理结果反馈给客户模式。  libkvm是qemu自己使用的用户态接口,可以把qemu源代码解开,里面有libkvm的函数库,不过并不对外呈现,虚拟机编程接口一般使用libvirt。 

KVM的思想是在Linux内个的基础上添加虚拟机管理模块,重用Linux内核中已经完善的进程调度,内存管理,IO管理等部分,因此KVM并不是一个完整的模拟器,而只是一个提供虚拟化功能的内核插件,具体的模拟器工作是借助QEMU来完成的.     在Xen的体系结构中,Xen Hypervisor运行于硬件之上,并且将系统资源进行了虚拟化,将虚拟化的资源分配给上层的虚拟机(VM),然后通过虚拟机VM来运行相应的客户机操作系统.    在KVM中,一个虚拟机就是一个传统的Linux中的线程,拥有自己的PID号,也可以被kill系统调用直接杀死(在这种情况下,虚拟机的行为表现为"突然断电").在一个Linux系统中,有多少个VM,就有多少个进程.如:    以上VM进程信息是通过qemu-kvm来进行的,相关的控制开关作为命名行参数输入,如虚拟映像对应的磁盘,虚拟网卡,VNC设置,显卡设置和IO设置等.   KVM的API是通过/dev/kvm设备进行访问的./dev/kvm是一个字符型设备. 1  root@ubuntu:~# ls -l /dev/kvm 2  crw-rw---- 1 root kvm 10, 232 Mar 14 14:20 /dev/kvm    kvm仅仅是Linux内核的一个模块,管理和创建完整的KVM虚拟机,需要更多的辅助工具.  1.qemu-Kvm:仅有KVM模块是远远不够的,因为用户无法直接控制内核模块去做事情,还必须有一个用户空间的工具。关于用户空间的工具,KVM 的开发者选择了已经成型的开源虚拟化软件 QEMU.QEMU 是一个强大的虚拟化软件,它可以虚拟不同的 CPU 构架.   运行在内核态的KVM模块通过/dev/kvm字符设备文件向外提供操作接口.KVM通过提供libkvm这个操作库,将/dev/kvm这一层面的ioctl类型的API转化成为通常意义上的函数API调用,提供给QEMU的相应适配层.    比如说在x86 的CPU上虚拟一个Power的CPU,并利用它编译出可运行在 Power上

想学习一下KVM,有没有相关书籍和小项目推荐?

如果不作KVM module开发,可以先从使用入手,部起来,运行玩一下。然后逐渐了解相关概念。这两个blog入门很不错,后面的也已经出了书。

如果是对要对KVM作二次开发,扩展它的功能,需要具备一定的Linux内核知识和掌握基本的操作系统原理。还要看扩展的具体功能,是CPU相关、内存相关,当然,必须要读一下KVM的源码,有必要的话,连同QEMU的源码配合来阅读,毕竟KVM知识提供底层支持,需要有QEMU等模拟器发起调用。

然后,最主要的就是,写写写。设计一些简单的小例子,比如从dump做起,在vm_launch时dump一些感兴趣的信息,或者在tdp_page_fault时dump出一些页表信息等。

个人不太建议买书,市面上KVM或者说虚拟化相关书籍良莠不齐,如果错选了,既浪费时间又浪费money,不推荐。

准备知识

       linux操作,如果有操作系统学习背景会更加容易理解,基本网络知识尤其tcp/ip

学习路径

      建议先从kvm架构开始学起,对整个kvm的虚拟化解决方案会有一个直观的认识。了解了整          个系统架构,学习起来高屋建瓴,事半功倍。网络上相关文章很多,比如KVM基本原理和构           架,这个系列的文章个人感觉写的比较不错。

在此基础上自己下载一个版本开始安装进行学习。到KVM的官方网站上看看安装文档搭建起环境应该不成问题。自己再试试跑几个虚拟机捣鼓捣鼓。

等你捣鼓了一段时间基本算是入门了,下一步就要看你的目标和目的了,不过到了这一步基本上你也知道以后的学习方向了。

qemu-kvm源码分析一个虚拟机进程里面有几个线程

线程大家都熟悉,new Thread().start()即会创建一个线程,这里我首先指出一点new Thread()其实并不会创建一个真正的线程,只有在调用了start方法之后才会创建一个线程,这个大家分析下Java代码就知道了

Thread的构造函数是纯Java代码,start方法会调到一个native方法start0里,而start0其实就是JVM_StartThread这个方法!

发表评论

评论列表

  • 笙沉嵶邸(2022-06-13 03:17:43)回复取消回复

    6 的CPU上虚拟一个Power的CPU,并利用它编译出可运行在 Power上想学习一下KVM,有没有相关书籍和小项目推荐?如果不作KVM module开发,可以先从使用入手,部起来,运行玩一下。然后逐渐了解相关概念。这两个blog入门很不错,后面的也已经出了书

  • 性许山柰(2022-06-13 11:21:02)回复取消回复

    Qemu则模拟虚拟机的IO设备接口以及用户态控制接口。    kvm-oenhan  如上图所示,Qemu在最上层,将虚拟机的整体呈现到host用户上,可以理解成客户模式;Qemu通过中间层libk