精华内容
下载资源
问答
  • 虚拟机是一种高度隔离的软件容器,它可以运行自己的操作系统和应用程序,就好像它是一台物理计算机一样。虚拟机的行为完全类似于一台物理计算机,它包含自己的虚拟(即基于软件实现的)CPU、RAM 硬盘和网络接口卡 ...
  • 等待时间进入虚拟机目录/usr/local/,mkdir arm/ 创建目录,修改该文件夹的属性为rwx,输入命令:chmod 777 arm。下载完毕后将压缩包放入目录中 tar -zxvf a(tab键补齐)解压。 到这里基本安装好了,为了避免每次使用...
  •  所谓虚拟计算机(简称虚拟机),实际上就是一种应用软件,例如VMware实际上也只是一种应用软件,其特别之处在于,由它创建的虚拟机与真实的计算机几乎一模一样,不但虚拟有自己的CPU、内存、硬盘、光驱,甚至还有...
  • 配置ARM虚拟机

    千次阅读 2020-11-30 23:04:17
    编者按: 参考文章&课程: leao :用qemu建立mini2440的模拟仿真环境... 平震宇:嵌入式Linux应用于开发实践 _项目5 构建嵌入式Linux开发环境_5.6 配置交叉编译环境;5.9/10配置

    编者按:

    参考文章&课程:

    1. 准备

    1.1 认识压缩包们

    1. QEMU

    中文名:虚拟操作系统模拟器
    用途:模拟操作系统

    百度百科中说道:QEMU是一套由法布里斯·贝拉(Fabrice Bellard)所编写的以GPL许可证分发源码的模拟处理器,在GNU/Linux平台上使用广泛。

    说白了,QEMU就是是一套可以在操作系统(GNU/Linux)中仿真出另一套操作系统的仿真软件。 因为它可以在系统中仿真出一颗虚拟的CPU,然后将要仿真的操作系统交给这颗虚拟CPU去处理,所以能够达到同一平台却能同时执行两种操作系统的目的。

    更多详解请移步百度百科:https://baike.baidu.com/item/QEMU/1311178?fr=aladdin

    1. U-Boot

    全称:Universal Boot Loader

    还是百度百科说的:Das U-Boot 是一个主要用于嵌入式系统的引导加载程序,可以支持多种不同的计算机系统结构,包括PPC、ARM、AVR32、MIPS、x86、68k、Nios与MicroBlaze。

    更加详细一点来说,u-boot是一种普遍用于嵌入式系统中的Bootloader,Bootloader是在操作系统运行之前执行的一小段程序,通过它,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的软硬件环境,为最终调用操作系统内核做好准备。 Boot Loader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,即开始启动操作系统。系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的Boot Loader程序。

    更多详解请移步百度百科:https://baike.baidu.com/item/U-Boot/10377075?fr=aladdin#5

    1. kernel

    中文名:内核
    类别:软件

    万能的百度百科说:内核是操作系统最基本的部分,是一个操作系统的核心。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。

    通俗点,我们将操作系统的代码分成2部分。内核所在的地址空间称作内核空间。而在内核以外的统称为外部管理程序,它们大部分是对外围设备的管理和界面操作。外部管理程序与用户进程所占据的地址空间称为外部空间。通常,一个程序会跨越两个空间。当执行到内核空间的一段代码时,我们称程序处于内核态,而当程序执行到外部空间代码时,我们称程序处于用户态。

    更多详解请移步:
    百度百科:https://baike.baidu.com/item/%E5%86%85%E6%A0%B8/108410
    AlbenXie:什么是内核https://blog.csdn.net/AlbenXie/article/details/80436095

    1.2 压缩包下载

    几句吐槽:深刻怀疑这是个垃圾网站,从打开到下载都慢到了一种境界。要有耐心……也可以换个浏览器多试几次。

    qemu for mini2440下载
    https://repo.or.cz/w/qemu/mini2440.git
    在这里插入图片描述
    点击图片中红色方框里面的tar.gz,就开始下载

    U-boot for mini2440下载
    https://repo.or.cz/w/u-boot-openmoko/mini2440.git

    kernel for mini2440下载
    https://repo.or.cz/w/linux-2.6/mini2440.git
    在这里插入图片描述
    注意,这里下载的是likely

    下载完成之后的压缩包如下
    在这里插入图片描述
    把压缩包放到虚拟机中,再解压出来,就可以进行安装编译了。

    #解压QEMU
    tar -xzvf mini2440-18b91f2.tar.gz
    #解压U-boot
    tar -xzvf mini2440-0805cf2.tar.gz
    #解压kernel
    tar -xzvf mini2440-1ebb861.tar.gz 
    

    在这里插入图片描述
    注:这里我是将压缩包放在/opt/develop中,解压需要用到超级用户权限。即在命令前面加上sudo。

    1.3 目标文件系统Rootfs-Qtopia-Qt4下载

    下载地址:
    http://www.arm9.net/download.asp
    在这里插入图片描述
    单击即可下载。同上,把压缩包放到虚拟机中解压出来。
    在这里插入图片描述

    2. 配置编译

    单看教程安装编译真是简单至极,但事实上,在整个过程中我遇到了数不清的问题。

    在开始之前,建议先登陆超级用户权限,不让会有很多操作无法进行。

    #进入超级用户
    sudo su
    

    在这里插入图片描述

    1. 编译安装QEMU
    #进入QEMU文件夹
    cd mini2440-18b91f2
    #配置
    ./configure --target-list=arm-softmmu 
    

    在配置这一步出错:

    The error log from compiling the libSDL test is: 
    /tmp/qemu-conf--3170-.c:1:17: fatal error: SDL.h: 没有那个文件或目录
    compilation terminated.
    ERROR: QEMU requires SDL or Cocoa for graphical output
    

    是缺少链接库的缘故,安装上即可解决。

    #安装sdl库
    apt-get install libsdl1.2-dev
    #重新配置
    ./configure --target-list=arm-softmmu 
    

    这里有个小插曲,由于我虚拟机本身配置的问题,apt-get无法下载。这里需要给apt更换一个下载源,详细操作请看:
    命令行方式解决:xnlay :buntu apt-get由于源导致下载失败
    https://blog.csdn.net/xnlay/article/details/79949484
    图形界面解决:百度经验:Linux中apt-get命令下载或安装失败怎么办
    https://jingyan.baidu.com/article/546ae185d754911149f28ca8.html
    两种方案任选一种均可解决问题。

    配置成功结果如下:
    编译过程部分截图
    接着编译

    #make
    make -j4
    

    成功结果如下:
    在这里插入图片描述
    2. 配置编译U-boot

    #进入U-boot文件夹
    cd /opt/develop/mini2440-0805cf2
    #配置
    make mini2440_config
    

    配置成功结果如下:
    在这里插入图片描述

    #编译
    make -j4
    

    这里编译花费的时间会比较长,成功结果如下:
    在这里插入图片描述
    完成之后可以看到该文件夹中的U-boot.bin是原始二进制文件(raw image),执行CPU底层初始化。
    详情参考:LouisGou:uboot移植(六)u-boot.bin 内存布局分析https://blog.csdn.net/JerryGou/article/details/80370000
    在这里插入图片描述
    3. kernel配置编译
    在编译内核之前,必须先确认虚拟机是有交叉编译环境的,否则内核无法编译。

    #查看虚拟机交叉编译环境
    arm-linux-gcc -v
    

    如果有,则屏幕上会显示交叉编译环境的版本:
    在这里插入图片描述
    若没有,请移步:

    下面开始内核编译

    #进入kernel文件夹
    cd mini2440-1ebb861/
    #配置
    make mini2440_defconfig ARCH=arm
    

    成功:
    在这里插入图片描述

    #进入内核配置文件
    make ARCH=arm menuconfig
    

    如果需要对内核进行修改,则在此进行修改,没有的话直接退出。
    在这里插入图片描述

    #编译
    make ARCH=arm CROSS_COMPLE=arm-linux- uImage
    #ARCH =arm CROSS_COMPILE=arm-linux- 表明:编译出来的目标是针对ARM体系结构的。
    #因为是针对ARM体系结构,所以需要使用交叉编译器。使用CROSS_COMPILE=xxx来指定交叉编译器。
    

    在这一步出现错误:

    opt/FriendlyARM/toolschain/4.4.3/bin//arm-linux-gcc: 15: exec: 
    /opt/FriendlyARM/toolschain/4.4.3/bin/.arm-none-linux-gnueabi-gcc: not found
    

    原因是这个交叉编译工具是32位的,而操作系统是64位的,需要安装32位的库。

    #针对ubuntu 18.04 
    apt-get install lib32ncurses5 lib32z1
    

    编译成功:
    在这里插入图片描述
    按照上图的路径,可以找到uImage文件,如下图。这里小小说一下,uImage中文翻译为内核程序,也就是操作系统打开之后,由U-boot启动代码引导操作系统,U-boot在完成一部分硬件初始化之后就把控制权交给uImage,这个uImage就是内核,内核是操作系统最核心的部分。
    在这里插入图片描述
    到这里来,就完成了QEMU,U-boot和内核的配置编译,接下来就是激动人心的内核加载了。

    3. 内核启动

    唠唠叨叨说一下我的理解,QEMU模拟出来一个CPU,启动的时候U-boot做启动引导,对虚拟硬件进行初始化,完成之后把控制权交给内核,也就是上面说的uImage,内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。直到这里,我们虚拟出来的这个ARM虚拟机是独立的,并且上面有了一些规则。但是我们知道,一个完备的操作系统,除了上述内容,还缺少了一个文件系统,就相当于我们打开电脑之后,没有C盘和E盘之类的。想让ARM虚拟机拥有文件系统,这里就需要用到挂载。下面是详细步骤。

    1. 下载目标文件系统

    题外话:这里特意写出来,是因为看的很多帖子的教程都没有这一个步骤,可能大家都是大佬,觉得这一步是理所当然的,而我这个小菜鸡却在这里卡住了很久。

    这里的文件系统使用的是友善之臂的Rootfs-Qtopia-Qt4,具体步骤见上面的准备阶段1.3。

    1. 安装nfs服务器

    来自百度百科:网络文件系统,英文Network File System(NFS),是由SUN公司研制的UNIX表示层协议(presentation layer protocol),能使使用者访问网络上别处的文件就像在使用自己的计算机一样

    我们要做的,就是让mini2440访问Linux上面的Rootfs-Qtopia-Qt4。

    #安装nfs服务
     apt-get install nfs-kernel-server
     #修改配置文件
     vim /etc/exports
    

    在文档最后添加

    /opt/rootfs_qtopia_qt4  *(rw,sync,no_subtree_check)
    #注意:/opt/rootfs_qtopia_qt4 是所要共享的目标文件系统。
    

    如下,修改后保存退出。
    在这里插入图片描述
    重启nfs服务,让修改生效

    /etc/init.d/nfs-kernel-server restart
    
    1. 修改启动文件
    • 修改mini2440_start.sh
    #进入QEMU下mini2440文件夹
    cd /opt/develop/mini2440-18b91f2/mini2440
    vim mini2440_start.sh
    

    修改为如下:

    base=$(dirname $0)
    echo Starting in $base
    name_nand="$base/mini2440_nand128.bin"
    #虚拟出一个128M的nondflash文件
    if [ ! -f "$name_nand" ]; then
            echo $0 : creating NAND empty image : "$name_nand"
    #       dd if=/dev/zero of="$name_nand" bs=528 count=131072
            dd if=/dev/zero of="$name_nand" bs=2112 count=65536
            echo "** NAND file created - make sure to 'nand scrub' in u-boot"
    fi
    #加载内核,配置虚拟网卡等工作
    cmd="$base/../arm-softmmu/qemu-system-arm \
            -M mini2440 $* \
            -serial stdio \
            -mtdblock "$name_nand" \
            -show-cursor \
            -usb -usbdevice keyboard -usbdevice mouse \
            -kernel uImage \
            -net nic,vlan=0 -net tap,vlan=0,ifname=tap0, script=$base/qemu-ifup,downscript=$base/qemu-ifdown \
            -monitor telnet::5555,server,nowait"
    echo $cmd
    $cmd
    
    • 建立脚本qemu-ifup加载虚拟网卡

    注意,此处代码中#并非注释的意思,//才是。

    #!/bin/sh
    //创建虚拟网卡tap0
    tunctl -u root -t $1
    //给虚拟网卡配置虚拟地址
    ifconfig $1 10.0.0.1 promisc up
    #sudo brctl addif br0 $1
    
    • 建立脚本qemu-ifdowm卸载虚拟网卡
    #!/bin/sh
    ifconfig $1 10.0.0.1 down
    
    • 将u-boot.bin和uImage复制到mini2440文件夹下
    cd /opt/develop/mini2440-1ebb861/arch/arm/boot/
    cp uImage /opt/develop/mini2440-18b91f2/mini2440/
    cd /opt/develop/mini2440-0805cf2/
    cp u-boot.bin /opt/develop/mini2440-18b91f2/mini2440/
    

    mini2440中的文件如下:
    在这里插入图片描述

    展开全文
  • arm64 虚拟机安装

    2021-07-21 11:26:53
    安装 qemu 安装virt-maneger 编译并安装好Qemu后,还需要安装aarch64的UEFI固件。 这里可以使用OVMF (Open Virtual Machine Firmware),其中aarch64架构的又叫做AAVMF。 安装非常简单,其实就是下载一个叫QEMU_EFI....

    安装 qemu   安装virt-maneger

    编译并安装好Qemu后,还需要安装aarch64的UEFI固件。
    这里可以使用OVMF (Open Virtual Machine Firmware),其中aarch64架构的又叫做AAVMF。
    安装非常简单,其实就是下载一个叫QEMU_EFI.fd的文件。
    如果有apt,直接sudo apt-get install qemu-efi,固件就会下载到/usr/share/qemu-efi/中。
    如果用的是yum,便是yum install edk2.git-aarch64,只不过目录在/usr/share/edk2.git/aarch64/中。

    还有 apt-get install ovmf

    展开全文
  • VMware Workstation Pro15下载02. VMware Workstation Pro15安装03. VMware Workstation Pro 15序列号04. 附录04. 附录 01. VMware Workstation Pro15下载 VMware Workstation Pro15下载 02. VMware Workstat....

    00. 目录

    01. VMware Workstation Pro15下载

    下载:VMware Workstation Pro15下载
    在这里插入图片描述

    02. VMware Workstation Pro15安装

    第一步: 运行安装程序,点下一步

    在这里插入图片描述

    第二步: 接收许可协议,点击下一步

    在这里插入图片描述

    第三步:选择安装目录和是否安装增强型键盘驱动(增强型虚拟键盘功能只能在Windows主机系统中使用,他可更好地处理国际键盘和带有额外按键的键盘,能优先处理原始键盘输入,所以能够绕过Windows 按键处理和任何尚未出现在较低层的恶意软件,从而提高安全性,但是有时也会出现键盘失灵等BUG现象)

    在这里插入图片描述

    第四步:用户体验设置
    在这里插入图片描述

    第五步:选择快捷方式

    在这里插入图片描述

    **第六步:**点击开始安装

    在这里插入图片描述

    第七步: 安装完毕,输入许可证

    在这里插入图片描述

    第八步: 输入许可证密钥

    在这里插入图片描述

    **第九步:**点击完成即可
    在这里插入图片描述

    03. VMware Workstation Pro 15序列号

    VMware Workstation Pro 15 序列号:

    CZ7WU-2MF01-488FZ-L6Z5T-PYAU4

    CY1TH-0XZ5M-M85NY-MNXGG-ZZHU8

    ZZ3EK-62W1P-H803P-4WN7T-Q7HT2

    CY75U-ATW0P-H8EYZ-WDZE9-N68D6

    GY7EH-DLY86-081EP-4GP59-WFRX0

    UG5J2-0ME12-M89WY-NPWXX-WQH88

    GA590-86Y05-4806Y-X4PEE-ZV8E0

    YA18K-0WY8P-H85DY-L4NZG-X7RAD

    UA5DR-2ZD4H-089FY-6YQ5T-YPRX6

    ZF582-0NW5N-H8D2P-0XZEE-Z22VA

    R-2ZD4H-089FY-6YQ5T-YPRX6

    ZF582-0NW5N-H8D2P-0XZEE-Z22VA

    04. 附录

    参考:【Linux】一步一步学Linux系列教程汇总
    参考: 官方参考手册

    展开全文
  • 以视频的方式详细的介绍了在vmware虚拟机上Redhat操作系统安装arm-linux-gcc交叉编译环境,特别用于初学者实际操作指导用
  • VMware-view-client的安卓版本,并不是版本越高越好用,在手机上用起来太费劲,平板还好
  • 关于虚拟机VMware的安装,VMtool的安装,minicom的设置及arm9交叉编译环境的设置
  • ARM 虚拟化技术简介

    千次阅读 2020-05-02 15:06:04
    以前,x86 和 ARM 都不符合 经典虚拟化(classically virtualized) 时,VMWare 采用 binary rewriting 在x86架构上实现虚拟化,经过优化后的性能开销小于10%,但是这项技术十分复杂。 由于实现起来的复杂,就会增加...

    一. 虚拟化技术
    二. 虚拟化技术的比较
            2.1 全虚拟化和二进制重写(Pure virtualization and binary rewriting)
            
    2.2 半虚拟化( Para-virtualization)
            2.3 虚拟化环境中的虚拟内存(Virtual memory in virtualization environment)
    三. ARM介绍
            3.1 ARM总体介绍
            3.2 ARM协处理器介绍
            3.3 处理器模式和TrustZone
            3.4 中断控制器
            3.5 ARM架构的虚拟化问题(Virtualization Issues with the ARM Architecture)
            3.6 ARM对虚拟化的硬件支持
            3.7 中断控制


    一. 虚拟化技术

        虚拟化是一个概念,单从这个概念的角度来看,只要是用某一种物品去模拟另一种物品都可以称为虚拟化,甚至于有些饭店用豆腐做出肉的味道,我认为这也可以称为一种虚拟化。
        但是这里我们主要讨论的是计算机领域的虚拟化,我们这样定义虚拟化“虚拟化是将单一物理设备模拟为相互隔离的多个虚拟设备,同时保证这些虚拟设备的高效性”。
          这个概念的定义里还包含了对虚拟化的要求,也就是这里的隔离性(isolated)有效性(efficient)。我们常说的hypervisor,有些书也把它称为 VMM(virtual machine monitor)则是一个直接运行在物理硬件上的软件,它的功能就是管理物理硬件,以便在不同的虚拟机之间共享这些物理资源(cpu,内存,外设等等),既然 hypervisor 直接给物理外设打交道,那它当然需要运行在特权模式了,在过去没有 virtualization extesion 的情况下,guest os 和 guest application只能都运行在de-privileged 模式,如下图所示。

        Popek 和 Goldberg 有一篇虚拟化的经典论文,把需要在特权模式下执行的指令分成了两类:

    • sensitive instructions(敏感指令):操作特权资源的指令,包括修改虚拟机的运行模式或者下面物理机的状态;读写时钟、中断等寄存器;访问存储保护系统、地址重定位系统及所有的I/O指令。
    • privileged instructions(特权指令):系统中有一些操作和管理关键系统资源的指令,这些指令只有在最高特权级上能够正确运行。如果在非最高特权级上运行,特权指令会引发一个异常,处理器会陷入到最高特权级,交由系统软件处理了。

        Popek和Goldberg提出构建hypervisor的要求:敏感指令是特权指令的子集。这种标准现在被称为classically virtualized(经典可虚拟化模型),虽然在不满足这个要求的情况下也可以做虚拟化(二进制翻译技术,后面会介绍),但是如果满足这个要求,实现起来会容易很多。下面介绍现有的虚拟化技术:
          虚拟化场景下,要求将 GuestOS 内核的特权解除,从原来的 0 降低到1或者3。这部分特权指令在Guest OS中发生的时候,就会产生 Trap,被VMM捕获,从而由VMM完成。这就是虚拟的本质方法,特权解除和陷入模拟(Privilege deprivileging/Trap-and-Emulation)
          虚拟化场景中敏感指令必须被VMM捕获并完成。对于一般 RISC 处理器,如 MIPS,PowerPC 以及SPARC,敏感指令肯定是特权指令,但是x86 例外,x86绝大多数的敏感指令是特权指令,但是由于部分敏感指令不是特权指令,执行这些指令的时候不会自动trap被VMM捕获。

     

    • Pure virtualization(完全虚拟化)
               完全虚拟化要求硬件架构是可虚拟化的(符合经典可虚拟化模型),当 捕获(trap) 进入 hypervisor 后,由 hypervisor 去模拟敏感指令的执行,这项技术也被称为陷入模式(trap-and-emulate 。当一个 guest os 想要去访问特权资源(物理外设),就会产生一个 trap 唤醒 hypervisor,hypervisor 去模拟这个访问,然后返回到 guest os 的下一条指令去继续执行。
              其主要采用优先级压缩技术(Ring Compression)和 二进制代码翻译技术(Binary Translation)。优先级压缩技术让 VMM 和Guest运行在不同的特权级下。
              对x86架构而言,即VMM运行在最高特权级别Ring 0下,Guest OS运行在Ring 1下,用户应用运行在Ring 3下。因此,Guest OS的核心指令无法直接下达到计算机系统硬件执行,而是需要经过VMM的捕获模拟执行(部分难以虚拟化的指令需要通过二进制翻译【Binary Translation】技术进行转换)。如下图所示。

    • Binary rewriting(二进制重写)
      二进制重写就是当硬件架构不可虚拟化(不符合经典可虚拟化模型)采用的方法。
      它可以分为静态的和动态的,
      1. 静态的二进制重写是通过扫描ELF文件,把所有的敏感指令替换成一个 trap 指令(系统调用指令),或者用一些非敏感指令去仿真执行这条敏感指令;
      2. 动态的二进制重写对敏感指令的处理和静态的类似,只不过它是在运行时去逐条分析指令,其实这种方法更不好,因为不管是不是敏感指令,都需要逐条分析才能确定,非常耗时。
              静态方法在运行时的性能要好过动态方法,但是经常出现一些莫名其妙的错误,因为运行时状态非常复杂,静态修改很难预料到所有情况。上述过程如下图所示。
      ​​​​​​​wKioL1afFsDjjbbTAAAl_Q4fU1I877.png

    • para-virtualization(类虚拟化)
              这种虚拟化方法,很多书都把它译为半虚拟化,其实这种译法是不准确的,半虚拟化(partial-virtualization)是一个早已存在的技术,它只虚拟化部分外设来满足某些专门的软件的执行环境,但是不能运行所有可能运行在物理机上的软件。
              如果读者对此有疑问,请参阅《系统虚拟化:原理与实现》,intel开源技术中心和复旦大学并行处理研究所著,书中1.3节对此有讨论。其实想解释清楚这部分内容是很难的,还要理解各种各样的虚拟化漏洞。
             简单来说,类虚拟化通过修改 guest os 的源码(API级),使得 guest os 避免这些难以虚拟化的指令(虚拟化漏洞)。         操作系统通常会使用到处理器提供的全部功能,例如特权级别、地址空间和控制寄存器等。类虚拟化首先要解决的问题就是如何陷入VMM。典型的做法是修改 guest os 的相关代码,让 os主动让出特权级别,而运行在次一级特权上。
             这样,当 guest os 试图去执行特权指令时,保护异常被触发,从而提供截获点供 VMM 来模拟(也可以采用 hypercall的方式,下面介绍)。既然内核代码已经需要修改,类虚拟化还可以进一步优化 I/O。也就是说,类虚拟化不是去模拟真实世界中的设备,因为太多的寄存器模拟会降低性能。相反,类虚拟化可以自定义出高度优化的 I/O协议,这种I/O协议完全基于事物,可以达到近乎物理机的速度。
              其实OKL4用的类虚拟化就是修改hypervisor提供给guest os的API(不同于底层硬件),同时修改guest os的源码,把那些敏感指令换成hypercall(calls into hypervisor)。下图展示的是,对于pure virtualization,硬件和hypervisor的API是相同的,但是对于para-virtualization是不同的。

    二. 虚拟化技术的比较

    2.1 全虚拟化和二进制重写(Pure virtualization and binary rewriting)

            全虚拟化和二进制重写都是不修改机器的 API 的,所以任何 guest os 都可以直接运行在虚拟化环境。但是,由于所有的特权指令都会导致 trap,所以在虚拟环境下特权指令的执行开销要远远高于在 本地(native)环境下。
            以前,x86 和 ARM 都不符合 经典虚拟化(classically virtualized) 时,VMWare 采用 binary rewriting 在x86架构上实现虚拟化,经过优化后的性能开销小于10%,但是这项技术十分复杂。
            由于实现起来的复杂,就会增加运行在特权模式下的代码,这会增加受攻击(attack surface )和 hypervisor出现 bug 的几率,所以会降低整个系统的安全性和隔离性。

    2.2 半虚拟化( Para-virtualization)

            半虚拟化Para-virtualization虽然是一个新词,在2002年中的Denali virtual machine monitor被提出来。但是这种设计理念早在 1970 的 IBM 的 CMS 系统就出现了,当时使用 DIAG指令调用到hypervisor里去,并且一直到现在还有很多研究机构在使用这种理念,如Mach,Xen和L4。
            半虚拟化相比于全虚拟化可以提供更好的性能,因为它直接使用各种 API 而不是通过 trap->decode->hardware emulation 的过程来实现仿真。
            当然,它的缺点我也在之前的博客中提到过,那就是必须修改源码,让guest os使用新的 API,这不仅是一项繁重的任务,同时对于一些非开源的操作系统,我们必须采用其他方法,除非这些非开源操作系统的厂商愿意与我们合作。

    2.3 虚拟化环境中的虚拟内存(Virtual memory in virtualization environment)

            为什么要把内存管理部分单独拿出来讨论一下呢?因为这部分很复杂,其实之前我们讨论的内容主要都是cpu运行的问题,比如各种指令和各种模式之间的切换。关于内存,我们先讨论没有引入 guest os时的虚拟内存管理,然后再讨论引入guest os之后的变化。
            虚拟内存管理涉及的内容很多,这里不讨论各种内存分配算法,如何降低缺页率等等,只分析虚拟地址如何转换成物理地址。我们知道,ARM架构是通过 MMU+TLB 来完成从VA(virtual address,虚拟地址)到 PA(physical address,物理地址)的转换,对于页表的访问实际上是由硬件自动完成的(如果不缺页的话)。
            但是加入了虚拟化之后,这个转换就复杂了,guest page table 不完成从 va 到 pa 的转换,只是负责从 guest va 到 guest pa的转换,而由hypervisor完成由guest pa到实际物理地址的转换,这个转换过程如下图所示。

            这个图表现的很清晰,但是想实现是非常难的,因为只有一个页表基址寄存器,所以硬件无法识别是从guest va到guest pa的转换还是va到pa的转换,在没有硬件支持的情况下,只能通过影子页表才能实现
            影子页表的原理也是把两步转换(guest va->guest pa->pa)转换为一步,中间的同步用hash来做。
            影子页表在构建的时候,每次对guest page table的访问都需要trap,由hypervisor把guest pa转换成实际物理地址。
            如果读者想了解这一块内容,我建议深入学习一下KVM以前关于影子页表的实现(由于x86的硬件支持,目前KVM已经放弃影子页表),这里我们没办法深入探讨影子页表,但了解它大致是怎么一回事儿之后,我们可以分析以下它的性能。
            首先,它的性能一定非常不好,因为每次对guest page table的访问都需要trap,而且每次guest page table的修改还需要同步到影子页表上面,虽然用hash的方式能提速,但是相比于native环境性能差距比较大(NOVA做过一个实验,光访问页表的性能损失大约是23%),而且实现起来非常复杂。
            Intel和ARM对这一部分都提供了硬件支持,由硬件来完成这里提到的两级页表转换。其实根据程序运行时的局部性原理,如果每次访问都能TLB hit的话,这种二级页表转换和一级页表转换差别不大,但是当TLB miss的时候,需要访问two stage的页表访问的性能还是差别比较大的,尽管这部分由硬件来做。举个例子,比如KVM在Linux-64位的情况下,是4级页表转换,从va到pa需要访问5次页表,那么引入 two stage 之后,就需要 5*5=25次访问页表,读者可以思考一下这里为什么是相乘的关系。

    三. ARM介绍

            我们首先介绍 ARM 架构里的各个部分,介绍它们的目的是为了理解当 arm 引入 virtualization extension 之后对它们的影响。

    3.1 ARM总体介绍

            arm是一种精简指令集(reduced instruction set computer,RISC)架构,精简(reduced)的意思是每条汇编指令独自完成所有的工作,而与之相对的复杂指令集则不是它的一条汇编指令可能会翻译成好几条机器指令
            大部分精简指令集的指令都在单个时钟周期内完成,它采用一种读取和存储分开的架构(load-store architecture),数据处理指令和I/O指令是分开的,数据处理指令是操作一个寄存器的值,和复杂指令集不同,关于复杂指令集的对应操作读者请自行查阅资料。
            现在arm已经推出v8架构,关于 v8 架构我还不太熟,所以这里以 v7 作为介绍(后续有时间我会研究下v8,在这里进行补充)。v7架构包含16个32bit的通用寄存器,还有一些寄存器是和特定的处理器模式相关的,还有各种协处理器的寄存器,这些寄存器将会在后面展开叙述。

    3.2 ARM协处理器介绍

            ARM协处理器是ARM架构的重要扩展,ARM架构允许最多16个协处理器,其中cp15被保留完成各种控制。cp15作用非常强大,它控制整个系统配置,cache和TLB的管理,MMU的控制和系统性能监控,我们这里主要讨论cp15的内存管理功能。
            当cpu想要访问一个虚拟地址的时候,它首先去TLB里面查这个虚拟地址和ASID,都匹配的话就可以直接返回物理地址,cpu通过物理地址去访问物理内存就行了。如果TLB miss,MMU就会去访问页表,然后找到这个虚拟地址对应的物理地址,把这个虚拟地址、当前进程的PID、物理地址加入到TLB中去,然后返回物理地址给cpu去访问内存。这里面涉及的很多细节这里不讨论了,建议读者去参看ARM官方介绍。

    3.3 处理器模式和TrustZone

            ARM v7包含8种处理器模式(在v8已经变成4种exception level了,从EL0到El3),其中包含1种非特权模式和7种特权模式:

    • 特权模式:FIQ、IRQ、supervisor、monitor、abort、undefined、system;
    • 非特权模式:user。

    显然,除了应用程序运行在user模式以外,其他全部运行在特权模式。ARM的virtualization extension需要处理器支持TrustZone extension,我们来看一下TrustZone是什么。TrustZone将处理器的执行状态分为两个世界:

    • secure world:用于运行可信软件;
    • non-secure world:用于运行不可信软件。

            这里的两个世界和处理器模式是重叠的,软件可以在任何模式、任何世界上运行。那么secure world和non-secure world的区别在哪呢?这里的secure又从何而来?是这样的,secure world有自己独有的内存和外设,这部分内容只有运行在secure world的软件可以访问,运行在non-secure world的软件是不可以访问的。这里引入了一个新的处理器模式,monitor mode,它运行在secure world,被用于做双系统(secure and non-secure world)之间的切换,如下图所示。

    我们可以基于TrustZone去做虚拟化,因为它能够隔离内存、中断并且确保non-secure world的特权软件也不可能访问或者修改运行在secure world的软件的配置信息。然后这样做的缺陷是,在non-secure world只能运行一个guest os,在secure world运行一个hypervisor。Green Hill的INTEGRITY就是这样做的,感兴趣的读者可以去Google一下。

    3.4 中断控制器

    GIC(generic interrupt controller)是ARM里的中断控制器,现在也已经支持virtualization extension。GIC可以分为两部分:

    • Distributor(分发器):分发器负责接收中断,设置这个中断是否enable和它的优先级,之后把它送到对应的cpu interface上去。
    • CPU interface(中断接口):这部分负责屏蔽低优先级中断(相对于正在处理的中断的优先级),让高优先级的中断抢占cpu。

    当外设产生中断的时候,这个中断首先发送给Distributor,Distributor将这个中断发送给对应的cpu interface。当cpu interface接受到这个中断的时候,它会检查这个中断是否enable,如果enable再去比较这个中断的优先级和当前正在处理的中断的优先级,进而决定处理器是否立即处理这个中断。

    3.5 ARM架构的虚拟化问题(Virtualization Issues with the ARM Architecture)

            标准的ARM架构是不符合可虚拟化模型的,有很多敏感指令在非特权模式下执行却不会产生trap。比如CPS指令,这条指令的作用是改变处理器状态,当这条指令在用户态执行时不会产生trap,甚至没有任何效果,可以认为是简单的跳过。
            即使所有的敏感指令都会产生trap,在ARM架构上用上述的trap-and-emulate技术也是很困难的,因为ARM的敏感指令非常多,只要和特权资源交互的指令都是敏感指令,比如虚拟内存子系统,中断控制子系统和协处理器,用上述方式的话开销太大,对系统性能有很大冲击。比如,arm-v7架构不支持页表访问的虚拟化,那么就需要影子页表,每次访问guest pa都需要trap,同样地,中断控制器也需要被仿真,当中断很频繁的时候(timer tick),这种仿真的开销也是非常大的,为了克服这种种弊端,ARM推出了virtualization extension。

    3.6 ARM对虚拟化的硬件支持

            在讨论arm新增加的virtualization extension之前,我们知道对硬件虚拟化的支持主要有intel的VT-x和AMD的AMD-V,它们两个十分类似,所以这里我们只介绍VT-x,看看它对虚拟化做了怎样的支持(为后面做对比)。

    • 将cpu的模式分为hypervisor(VMX root operation)和guest(VMX non-root operation)。
    • 可以配置一些敏感指令和事件,让它们产生或者不产生trap。
    • (新增)提供扩展页表(EPT,extended page table),通过这个页表在硬件上完成second-stage of translation,其实就是常说的二级页表翻译。
    • (新增)在TLB上新增加了VM tag去标识每一个虚拟机,这样可以避免每次VM-entry和VM-exit时的TLB flush操作(其实还增加了VPID,去标识VM里虚拟进程的进程id)。
    • (新增)在Intel的 VT-d里增加了对DMA操作的支持,而且是一种安全的DMA(具体怎么实现的安全读者可以自己分析下)。

    接下来我们看看ARM对虚拟化的支持,这里讨论的虚拟化支持主要是针对v7架构,并且需要实现上文提到的TrustZone。利用硬件扩展实现pure virtualization的总体架构如下图所示:

    • hypervisor运行在non-secure world里的hyp mode,这个hyp mode使hypervisor可以管理non-secure world里其他所有的模式(user mode和kernel mode)里运行的软件。
    • guest os运行在non-secure world的特权模式(kernel mode),guest application运行在non-secure world的user mode。

    上述内容是对虚拟化扩展的一个总体介绍,具体来说,ARM新增了以下几个feature:

    • hyp mode:hyp mode是运行在non-secure world的最高特权级模式,如上图所示。它负责管理guest os,hypervisor运行在这个新的模式里。这个模式将hypervisor和运行中的guest os分开,guest os运行在non-secure的kernel mode。
    • Second-stage of translation:由hypervisor负责把所有的gust pa转换成实际物理地址,其实就是从物理上支持两级页表转换,而不需要使用影子页表。
    • 中断控制:这部分后面展开叙述。
    • 仿真支持:当trap进hypervisor时,硬件向hypervisor提供一些额外的信息,消除了hypervisor取指令然后decode的开销。因为对外设的模拟需要采用trap-and-emulate技术,削减这项技术的开销可以有效的提升性能。
    • trap配置:不是所有的敏感指令或特权操作都需要trap进hypervisor进行处理,我们可以配置指令或操作是否trap,这样可以减少不必要的trap,从而减少开销,提升性能。

    读者可以自行对比Intel和ARM对虚拟化支持的相同点和不同点,分析他们为什么这样做。接下来展开叙述上文提到的中断控制部分。

    3.7 中断控制

            ARM创建了一个新的硬件模块,virtual CPU interface,类比我们前面在介绍GIC时提到过的CPU interface,这个硬件模块可以直接被map到guest os里,从而避免使用trap-and-emulate去仿真CPU interface,guest os可以直接操作这个virtual CPU interface,例如开、关中断。当然关于GIC的另一个部分,Distributor,我们仍然需要通过trap-and-emulate去仿真,但是它对性能的影响不大,因为它只是在初始化的时候负责enable中断,之后就不再修改了。
    当中断到来时,所有的中断都首先被送到hypervisor里进行处理,由hypervisor通过virtual CPU interface发送给当前正在执行的guest os。虚拟中断可以和物理中断进行映射,这样guest os就可以直接操作物理中断而不需要通过hypervisor了。下图所示是一个中断处理流程:

    1. 外设产生一个中断发送到Distributor
    2. Distributor把这个中断发送给CPU interface
    3. CPU interface告诉hypervisor去处理这个中断
    4. hypervisor对这个中断进行检查,发现这个中断是送给guest os处理的,它会设置一个虚拟中断,将物理中断和虚拟中断连接在一起,把这个虚拟中断加入到virtual CPU interface。
    5. virtual CPU interface会根据hypervisor加入的虚拟中断向guest os发送一个中断
    6. guest os通过virtual CPU interface发来的中断进行处理,处理之后返回
    7. virtual CPU interface发现这个虚拟中断来自于一个物理中断,就会在Dirtributor上清除这个物理中断(表示处理完毕),整个虚拟中断处理过程结束。

    这里面还涉及一个硬件扩展,论文上把它称为“priority drop”。正常情况下,当一个中断正在处理的时候,低优先级的中断是不能够抢占处理器的,但是在虚拟化环境却不是这样,比方说有两个guest os,我们暂且称之为os1和os2,假设os1正在处理一个高优先级中断,这时又有一个中断是给os2处理的,这个中断的优先级低于os1的中断的优先级,但是它们应该互不影响才对。ARM加入这个硬件扩展就是为了处理上述问题,每个guest os都有自己的优先级屏蔽策略,互不影响。

    展开全文
  • 1、需要安装VMware虚拟机软件,不会安装的可以查看博主的另一篇文章。 2、下载Windows11镜像文件,百度网盘,提取码:v8au 一、虚拟机配置 1、打开VMware,新建虚拟机 2、选择典型 3、稍后安装操作系统 ...
  • vmware-view-client_2.2.0-0ubuntu0.14.04_i386.deb,ARM ubuntu下可以直接安装使用
  • macos+vmware-fusion安装vmware-tools并使用

    千次阅读 2018-08-01 13:50:13
    参考这个链接:https://www.cnblogs.com/dragon-aslan/p/7209857.html 亲测完美运行
  • 3PAR发布了用于VMware Site Recovery Manager管理工具的Replication Adapter软件。该款软件的推出,使3PAR 的Remote Copy(一款用于InServ Storage Servers的远程数据复制软件),和用于灾难恢复管理和自动化的开创...
  • 本开发平台搭建使用了在windows系统下的虚拟机安装,建议VMWare及操作系统安装文件,均放置在固态硬盘上,使用起来效果不错。我的开发环境搭建用到如下软件包: - VMware Workstation Player 14 非商业版本 - ...
  • 打开VMware Workstation 如果没有安装可以观看VM虚拟机安装 点击创建新的虚拟机,我是使用的15.5的版本 点击下一步 选择镜像,需要镜像可以点击下载镜像 秘钥和密码可以不用填,直接下一步,秘钥是激活秘钥,密码...
  • 打开VMware:right_arrow:目标虚拟机,右击设置:right_arrow:编辑虚拟机设置:right_arrow:选项:right_arrow:共享文件夹:right_arrow:打开总是启用,添加:right_arrow:确定(如图) 如果桌面上没有mnt文件夹,左侧...
  • 前段时间有人遇到一些网络连接问题,让我帮忙处理,他想让ARM开发板连接外网,可以连接网络数据库,同时保证自己的电脑可以上网。 本来说直接可以连接一个路由器,分配一个内网IP给ARM就可以了,但是当时那个朋友是...
  • 为了验证VMware Tools是否真正的安装成功,我们可以利用Linux操作系统是否能够全屏显示来验证。如果能够全屏显示了说明VMware Tools安装成功。在VMware“查看”菜单栏下点击“立即适应客户机‘’,等待一会看是否...
  • 本文档详细介绍了:在windows10主机的vmware软件中安装ubuntu18.04系统,再基于x86架构的ubuntu18.04,搭建openEuler_aarch64架构的qemu虚拟机。
  • mac系统装vmware fusion

    千次阅读 2018-03-04 14:04:26
    最初因为装的vmware fusion 8 导致出现 找不到/dev/vmmon(这个词不是很记得了的)。找了一些解决博客 最后安装较高版本的vmware fusion才行最后安装了vmware fusion 10, 打开ios文件的时候又出现了 找不到可以连接的...
  • VMware虚拟桌面,安卓客户端连接工具
  • VMware Tools 11.0.1 ,VMware Tools packages for Windows
  • 主要为大家详细介绍了VMware Workstation 14 Pro安装Ubuntu 16.04教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要介绍了vmware虚拟机安装安卓Android x86的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 文章目录序言场景一:虚拟机Ubuntu + Win10,互相ping通 (NAT模式,WiFi无线网卡,Ubuntu可以上网)1.1 Win10无线网卡IP动态获取1.2 Ubuntu设置静态IP(VMware NAT模式、无线网卡)1.2.1 VMware设置虚拟机网络编辑...
  • VMware Fusion:适用于Mac的功能强大的简单虚拟机 VMware Fusion使Mac用户可以在Mac上运行Windows以及与Mac应用程序同时运行的数百种其他操作系统,而无需重新启动。 Fusion对于家庭用户而言足够简单,而对于IT专业...
  • VMWare虚拟机、主机和开发板IP设置,可以保证三者互通,且都可以上外网
  • 虚拟机arm虚拟环境搭建

    万次阅读 2018-09-08 16:31:30
    【qemu】虚拟工具模拟A9开发板 1、sudo apt-get update 2、sudo apt-get install...3、qemu-system-arm –h //查看 【gcc】交叉编译器的安装 1、gcc-4.6.4.tar.xz 放到 ubuntu的目录下 ~/work/fs4412/ 2、cd ~/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,390
精华内容 3,356
关键字:

armvmware