searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

初识KVM API

2023-04-18 01:22:59
40
0

(特别提示:本人所有文章都是凭记忆书写,不保证准确、正确,请读者注意鉴别!)

提到KVM,大家的第一反应是QEMU或QEMU-KVM。搜索KVM,通常得到结果都是关于怎么使用QEMU,libvirt等等。有必要先介绍下它的历史了。

云计算非常依赖虚拟化技术,虚拟化必须得把电脑完整得虚拟化出来,这就包括:CPU虚拟化,内存虚拟化,存储虚拟化,网络虚拟化,设备虚拟化(除前述设备)等等。过去几十年,不同的虚拟化发展道路各不相同。存储虚拟化现在基本上Ceph一统天下,其他系统各显神通。网络虚拟化得益于TCP/IP栈的超前设计,几乎从一开始就支持“虚拟化”,现在和存储的SDS(软件定义存储)一样,走在了SDN(软件定义网络)的康庄大道。设备虚拟化的拳头产品是QEMU。

QEMU作为设备虚拟化大杀器,可以虚拟各种设备,从CPU到主板到鼠标。在CPU虚拟化上,QEMU一开始走的是“模拟器“的路线,即Guest操作系统和应用对应的机器码,被QEMU一条一条模拟执行。模拟器的好处是它可以跨CPU模拟,在Mac-m1机器上模拟一个80386的CPU跑DOS系统。模拟器的缺点也很致命,速度慢。

解决CPU虚拟化的速度问题,还是得从CPU入手。有两种思路,一是在操作系统上把CPU逻辑上分割,二是CPU本身从硬件上支持虚拟化。前一种思路包括了进程,cgroups/namespace/容器,模拟器等,当然这看各自理解了。后一种思路就必须得芯片厂商出手了。Intel,AMD当仁不让,相继推出了虚拟化方案。

有了CPU硬件虚拟化的支持,接下来就是在操作系统层面把相关的功能暴露给开发人员,这就是KVM的由来。KVM是可加载到操作系统内核的一个模块,它可以操作CPU的硬件虚拟化功能,来创建虚拟CPU。从软件层面讲,KVM和Linux内核的其他模块如内存管理操作CPU的特权指令激活页内存管理是一样的道理。KVM出现之后,QEMU马上就支持用KVM代替其原来的模拟器,这就是QEMU-KVM。因为KVM创建虚机是CPU硬件支持的,所以QEMU-KVM的速度会超级快,或者说不能更快了。但是呢,因为QEMU不但要虚拟CPU,还需要虚拟各种其他设备,整体来看QEMU-KVM的性能肯定是不够的。这间接给了所有人一种印象,即虚拟机总是比较慢。对此芯片厂商是不太乐意的,因为它们早就从硬件上支撑了虚拟化了,QEMU-KVM的慢是在其他地方。

接下来再看KVM是什么?一:基于CPU的虚拟化指令构建的内核模块;二:它对外提供的API。第一点涉及到KVM本身的研发,我基本没有探究,就此略过。

libc的API或Linux的内核API都是一个一个的函数,而KVM API不太一样,只有一个函数(ioctl),通过参数来实现不同的功能。详细列表在下面的页面有介绍:https://kernel.org/doc/Documentation/virtual/kvm/api.txt

以KVM_SET/GET_REGS为例,创建VCPU之后可以通过它们设置或获取CPU的寄存器,如下图所示。

说了这么多,看一个例子,如何使用KVM API创建一个VCPU,并执行一段代码。

更详细的介绍参考:https://lwn.net/Articles/658511/

 

0条评论
0 / 1000
汪****院
2文章数
0粉丝数
汪****院
2 文章 | 0 粉丝
汪****院
2文章数
0粉丝数
汪****院
2 文章 | 0 粉丝
原创

初识KVM API

2023-04-18 01:22:59
40
0

(特别提示:本人所有文章都是凭记忆书写,不保证准确、正确,请读者注意鉴别!)

提到KVM,大家的第一反应是QEMU或QEMU-KVM。搜索KVM,通常得到结果都是关于怎么使用QEMU,libvirt等等。有必要先介绍下它的历史了。

云计算非常依赖虚拟化技术,虚拟化必须得把电脑完整得虚拟化出来,这就包括:CPU虚拟化,内存虚拟化,存储虚拟化,网络虚拟化,设备虚拟化(除前述设备)等等。过去几十年,不同的虚拟化发展道路各不相同。存储虚拟化现在基本上Ceph一统天下,其他系统各显神通。网络虚拟化得益于TCP/IP栈的超前设计,几乎从一开始就支持“虚拟化”,现在和存储的SDS(软件定义存储)一样,走在了SDN(软件定义网络)的康庄大道。设备虚拟化的拳头产品是QEMU。

QEMU作为设备虚拟化大杀器,可以虚拟各种设备,从CPU到主板到鼠标。在CPU虚拟化上,QEMU一开始走的是“模拟器“的路线,即Guest操作系统和应用对应的机器码,被QEMU一条一条模拟执行。模拟器的好处是它可以跨CPU模拟,在Mac-m1机器上模拟一个80386的CPU跑DOS系统。模拟器的缺点也很致命,速度慢。

解决CPU虚拟化的速度问题,还是得从CPU入手。有两种思路,一是在操作系统上把CPU逻辑上分割,二是CPU本身从硬件上支持虚拟化。前一种思路包括了进程,cgroups/namespace/容器,模拟器等,当然这看各自理解了。后一种思路就必须得芯片厂商出手了。Intel,AMD当仁不让,相继推出了虚拟化方案。

有了CPU硬件虚拟化的支持,接下来就是在操作系统层面把相关的功能暴露给开发人员,这就是KVM的由来。KVM是可加载到操作系统内核的一个模块,它可以操作CPU的硬件虚拟化功能,来创建虚拟CPU。从软件层面讲,KVM和Linux内核的其他模块如内存管理操作CPU的特权指令激活页内存管理是一样的道理。KVM出现之后,QEMU马上就支持用KVM代替其原来的模拟器,这就是QEMU-KVM。因为KVM创建虚机是CPU硬件支持的,所以QEMU-KVM的速度会超级快,或者说不能更快了。但是呢,因为QEMU不但要虚拟CPU,还需要虚拟各种其他设备,整体来看QEMU-KVM的性能肯定是不够的。这间接给了所有人一种印象,即虚拟机总是比较慢。对此芯片厂商是不太乐意的,因为它们早就从硬件上支撑了虚拟化了,QEMU-KVM的慢是在其他地方。

接下来再看KVM是什么?一:基于CPU的虚拟化指令构建的内核模块;二:它对外提供的API。第一点涉及到KVM本身的研发,我基本没有探究,就此略过。

libc的API或Linux的内核API都是一个一个的函数,而KVM API不太一样,只有一个函数(ioctl),通过参数来实现不同的功能。详细列表在下面的页面有介绍:https://kernel.org/doc/Documentation/virtual/kvm/api.txt

以KVM_SET/GET_REGS为例,创建VCPU之后可以通过它们设置或获取CPU的寄存器,如下图所示。

说了这么多,看一个例子,如何使用KVM API创建一个VCPU,并执行一段代码。

更详细的介绍参考:https://lwn.net/Articles/658511/

 

文章来自个人专栏
KVM
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0