虚拟化读书摘要

armhf是什么

在Ubuntu 12.04和Debian里,除了arm, armel,还出现了一个名为armhf的版本。这个东西是什么?

众所周知,armel是目前主要的ARM ABI。armhf则是armel的一个变种,主要区别在浮点计算上。

在armel中,关于浮点数计算的约定有三种。以gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。soft是指所有浮点运算全部在软件层实现,效率当然不高,适合于早期没有浮点计算单元的ARM处理器;softfp是目前armel的默认设置,它将浮点计算交给FPU处理,但函数参数的传递使用通用的整型寄存器而不是FPU寄存器;hard则使用FPU浮点寄存器将函数参数传递给FPU处理。

需要注意的是,在兼容性上,soft与后两者是兼容的,但softfp和hard两种模式不兼容。默认情况下,armel使用softfp,因此将hard模式的armel单独作为一个abi,称之为armhf。


价值

使用softfp模式,会存在不必要的浮点到整数、整数到浮点的转换。而使用hard模式,在每次浮点相关函数调用时,平均能节省20个CPU周期[1]。对ARM这样每个周期都很重要的体系结构来说,这样的提升无疑是巨大的。

在完全不改变源码和配置的情况下,在一些应用程序上,使用armhf能得到20——25%的性能提升[2]。对一些严重依赖于浮点运算的程序,更是可以达到300%的性能提升[3]。


使用


armhf的开启需要硬件的支持,在Debian的wiki上要求ARMv7 CPU、Thumb-2指令集以及VFP3D16浮点处理器[4]。

在gcc的编译参数上,使用-mfloat-abi=hard -mfpu=vfp即可。

在工具上,CodeSourcery最早支持hard模式。也可已自己编译工具链。

如何识别


运行  readelf -A /proc/self/exe | grep Tag_ABI_VFP_args 如果找到Tag_ABI_VFP_args标签,那么你是在一个armhf系统上运行。如果没有返回,那么它是armel。


VFIO VS virtio

With VFIO passthrough, network performance is also 9.4 Gbps; i.e., we cannot observe overhead in virtualization environment with VFIO passthrough method, in context of typical SW network user application.
With virtio approach, if proper configured (details see below), network performance can also achieve 9.4 Gbps; otherwise, poor performance will be 3.6 Gbps.

qemu-kvm -m 16G -smp 8 -net none -device vfio-pci,host=81:10.0 -drive file=/var/lib/libvirt/images/rhel7.1.img,if=virtio -nographic
qemu-kvm -m 16G -smp 8 -device virtio-net-pci,netdev=net0 -netdev tap,id=net0,script=/etc/qemu-ifup -drive file=/var/lib/libvirt/images/rhel7.1.img,if=virtio –nographic

VirtIO paravirtual 是 Linux 虚拟机平台上统一的虚拟 IO 接口驱动。通常主机为了让客户机像在真实环境中一样运行,需要为客户机创建各式各样的虚拟设备,如磁盘,网卡,显卡,时钟,USB 等。这些虚拟设备大大降低了客户机的性能。如果客户机不关注这些硬件设备,就可以用统一的虚拟设备代替他们,这样可以大大提高虚拟机的性能。这个统一的标准化接口在 Linux 上就是 VirtIO 。需要注意的是 VirtIO 运行在 kernel 2.6.24 以上的版本中才能发挥它的性能优势。另外 KVM 项目组也发布了 Windows 平台上的 VirtIO 驱动,这样 windows 客户机的网络性能也可以大大提高了。


中断

中断源模拟:

中断源模拟我也不是很清楚,方法很多,可以直接响应Linux的驱动,也可以别的,比如时钟中断可以设置一个定时器,定时器到了就触发中断,但是键盘,鼠标,硬盘呢?这个等待高手回?欢迎大家来讨论。

虚拟机响应虚拟中断:

KVM中断虚拟化主要依赖于VT-x技术,VT-x主要提供了两种中断事件机制,分别是中断退出和中断注入。

中断退出

是指虚拟机发生中断时,主动使得客户机发生VM-exit,这样能够在主机中实现对客户机中断的注入。

中断注入

它是指将中断写入VMCS对应的中断信息位,来实现中断的注入,当中断完成后通过读取中断的返回信息来分析中断是否正确。这个也是这里要详细将的地方。

首先中断注入有个一个标志性的函数 kvm_set_irq,这个是中断注入的最开始。kvm 和qemu 各有一个这种函数 qemu函数实际上调用的是kvm的

中断方式也有8259(hw/i8259.c), IOAPIC(hw/ipf.c x86下没用这个,pic和apic相同处理,将pic扩展到24个), MSI(hw/msix.c)...


OpenGL QEMU模拟

https://wiki.yoctoproject.org/wiki/File:QEMU_GL_in_Yocto.pdf

概述

 The OpenGL pass-through in QEMU is used to 'redirect' the OpenGL calls running on the emulated target to the host's native OpenGL library. This brings an important speed up on the execution speed of the target applications that use OpenGL. It is currently available only for x86 targets. It consists on a number of a set of QEMU patches.


设备模拟之VFIO VIRTIO


VFIO

VFIO是一套用户态驱动框架,它提供两种基本服务:

向用户态提供访问硬件设备的接口
向用户态提供配置IOMMU的接口
VFIO由平台无关的接口层与平台相关的实现层组成。接口层将服务抽象为IOCTL命令,规化操作流程,定义通用数据结构,与用户态交互。实现层完成承诺的服务。据此,可在用户态实现支持DMA操作的高性能驱动。在虚拟化场景中,亦可借此完全在用户态实现device passthrough。

VFIO实现层又分为设备实现层与IOMMU实现层。当前VFIO仅支持PCI设备。IOMMU实现层则有x86与PowerPC两种。VFIO设计灵活,可以很方便地加入对其它种类硬件及IOMMU的支持。


VIRTIO

完全虚拟化:来宾操作系统运行在位于物理机器上的hypervisor之上.来宾操作系统并不知道它已被虚拟化,并且不需要任何更改就可以工作.
半虚拟化:来宾操作系统不仅知道它运行在hypervisor之上,还包括让来宾操作系统更高效地过度到hypervisor的代码


qemu之VIRTIO
使用QEMU模拟I/O的情况下,当客户机中的设备驱动程序(device driver)发起I/O操作请求之时,KVM模块中的I/O操作捕获代码会拦截这次I/O请求,然后经过处理后将本次I/O请求的信息存放到I/O共享页,并通知用户控件的QEMU程序。QEMU模拟程序获得I/O操作的具体信息之后,交由硬件模拟代码来模拟出本次的I/O操作,完成之后,将结果放回到I/O共享页,并通知KVM模块中的I/O操作捕获代码。最后,由KVM模块中的捕获代码读取I/O共享页中的操作结果,并把结果返回到客户机中。


Dispaly

1、应用程序模式: XserverSDL ,GTK,Xorg通过全屏独占方式显示虚拟机
2、远程模式:vnc通过远程控制的方式显示虚拟机


双系统

chroot


安卓启动流程

http://www.docin.com/p-191202348.html


刷机
一是recovery方法,就是我们平时将update.zip入到SD卡,然后alt-s的方法,这种方法是调用了recovery的方法将各种img或文件进行复制等操作。想了解recovery的工作原理吗?我也没找到好的资料,就在这看了看recovery的一些源码

二是fastboot方法,这个方法其实是比较酷的方法,说白点,fastboot就是将已有的各分区映象文件(img文件,意义上类似我们对光盘做的映象文件)直接覆盖写到指定分区中,有点暴力,也有点类似我们平时操作系统的Ghost还原。


烧录

Android编译生成的三个镜像文件
Android源码编译后,在out/target/product/generic下生成的三个镜像文件:ramdisk.img,system.img,userdata.img以及它们对应的目录树root,system,data。ramdisk.img是根文件系统,system.img包括了主要的包、库等文件,userdata.img包括了一些用户数据,android加载这3个映像文件后,会把 system和 userdata分别加载到 ramdisk文件系统中的system和 data目录下。
三个镜像文件及其三个目录树之间的生成关系是我们进行ROM制作的基础,下面将做详细介绍。
Ramdisk.img
Ramdisk镜像是采用cpio打包,gzip压缩的。用file验证:
# file ramdisk.img
输出:
# ramdisk.img: gzip compressed data, from Unix
为了便于说明问题,我们将ramdisk.img拷贝到其它一个目录,然后按以下步骤将ramdisk.img还原为目录树:
# mv ramdisk.img ramdisk.img.gz
# gunzip ramdisk.img.gz
# mkdir ramdisk
#cd ramdisk
# cpio –i –F ../ramdisk.img
这样,就得到一个完整的ramdisk目录,与out/target/product/generic/root对比后,我们发现它们是一样的内容。
通过执行以下的操作,我们可由目录树再生成ramdisk镜像
# cd ramdisk
# find . | cpio -o -H newc | gzip > ../ramdisk-new.img


设备模拟(原理)

  在虚拟化领域中,向虚拟机提供虚拟化设备的技术从系统层次上,可以分为三种:硬件层虚拟化、驱动层虚拟化、系统层虚拟机。这三种技术也是按照这种先后排序依次出现的,后一种技术是为弥补前一种技术的不足而被发明出来。不过有时为了达到新的要求,需要在原本的优点之间进行取舍。

        硬件层虚拟化,即完全虚拟一个物理设备,提供一个完整设备指令集。对于这类虚拟化技术,使用自带的设备驱动程序,操作系统可以不经任何修改直接运行在虚拟环境中。如:虚拟IDE设备、虚拟E1000网卡等。虚拟机对该种虚拟化设备的操作需要经过多次转换,才能最终完成:首先调用虚拟系统服务接口,其次由虚拟设备驱动处理,最后转换成虚拟设备指令执行。执行虚拟设备指令时触发异常,由Hypervisor捕获,并将虚拟设备操作信息交给宿主机系统监控程序,监控程序调用宿主机系统服务接口完成真正的设备操作。这里需要进行多次转换,而且需要多个VM_IN\VM_OUT操作,性能损耗较大。优点在于可以模拟出多种物理设备,运行未经修改的操作系统。

        驱动层虚拟化,这类虚拟化不提供对设备指令集的模拟,而是在硬件驱动层进行虚拟化。使用这类虚拟化技术,需要虚拟机操作系统提供这类虚拟化驱动。使用该虚拟化技术的有:KVM上基于VirtIO架构的net、disk和XEN上基于split-driver架构的虚拟设备等。该虚拟化技术无需对虚拟设备指令集进行解析和转换,并且减少了VM_IN\VM_OUT操作,性能上有较大提升。缺点在于虚拟机操作系统需要有相应的驱动支持。

        系统层虚拟化,这类虚拟化直接将宿主机的系统服务接口交给虚拟机系统使用,减少了虚拟化过程中的多次转换和VM_IN\VM_OUT操作,性能上有进一步的提升。而且由于虚拟机直接使用宿主机系统服务,这使得Hypervisor能够更加精准的监控和分析虚拟机内部操作和负载情况。同样,这类虚拟化技术要求虚拟机系统具有相应的内核支持模块,并且这类技术出现时间不长,现在操作系统对其支持还不够成熟。

        由于虚拟机使用的块虚拟设备是基于硬件层虚拟化技术和驱动层虚拟化技术,从理论上分析,其性能还可以提升,并且块虚拟设备无法满足虚拟机与宿主机之间共享文件的需求。而一般网络文件系统,如NFS、CIFS,用于实现在虚拟机与宿主机之间共享文件时,性能上有较大损耗。加上网络文件系统并非专为虚拟化设计,所以其支持的功能也不够完善。

        VirtFS,系统层虚拟化技术的一种实现,就是为解决共享文件系统在虚拟化环境中所遇到的一些问题:提供完备的功能支持和良好的性能。



VNC


一、屏幕控制原理
1、VNC是把被控制端的屏幕做成图像,经过压缩后传送到控制端,控制端的控制信息(如鼠标信息)传送到被控制端后进入消息队列。


       客户端                                         X服务器                                            应用程序
vnc viewer<----------------------->Xvnc(vnc server)<------------------------>applications
                       (vnc protocal)                                             (X protocal)                    


其控制是基于tcp/ip的,其中vnc server扮演了双重角色,vnc protocal是基于RFB protocal的。




二、截屏方式
1、VNC使用的截屏方式比较独特,它有两种方式:第一种是使用钩子自动报告需要截屏的区域;第二种是轮询某一个区域(如前景窗口)。截屏后使用某种压缩算法压缩后发送。


三、传输方式


1.RFB协议传输:
在控之端不能直接改变显示大小,只能进行缩放,如缩放为原大小的几倍。原理是在远程机器上运行一个额外的X服务器,X服务器和客户机器都在远程跑。然后通过RFB协议用自己的客户端显示到本地。
2.X协议:
X 视窗系统提供了一个公开协议,由其客户程序可以查询和更新 X 服务器上的信息。X 视窗系统(X 协议)允许网络中不同计算机上的进程在其它网络显示器上显示内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值