zoukankan      html  css  js  c++  java
  • VFIO PF SRIOV IOMMU UIO概念解释、关联

    1、UIO出现的原因

    第一,硬件设备可以根据功能分为网络设备,块设备,字符设备,或者根据与CPU相连的方式分为PCI设备,USB设备等。它们被不同的内核子系统支持。这些标准的设备的驱动编写较为容易而且容易维护。很容易加入主内核源码树。但是,又有很多设备难以划分到这些子系统中,比如I/O卡,现场总线接口或者定制的FPGA。通常这些非标准设备的驱动被实现为字符驱动。这些驱动使用了很多内核内部函数和宏。而这些内部函数和宏是变化的。这样驱动的编写者必须编写一个完全的内核驱动,而且一直维护这些代码。像这种设备如果把驱动放入Linux内核,不但增大了内核的负担而且还很少使用,更没有人愿意免费的花费大量精力去维护这样的驱动,使用UIO使驱动的开发可以利用所有的用户空间的应用程序开发工具和库,而且当系统内核发生变化时,只要更改UIO框架与其他内核程序交互的接口即可,不需要更改UIO框架下面的driver。

    第二,内核驱动的开发必须使用C语言加上少量汇编代码。uio可以使用C++,Java …等高级语言极大的方便了开发。我们可以发现,有很多的卡的驱动在内核空间已经有实现,这样,我们可以参考已经存在的代码,极大的提高的开发的速度,和降低了开发成本。而且内核驱动的调试会比用户空间程序调试复杂很多。我们经常遇到死机,涉及到多个子系统,棘手。放在用户空间的话如果驱动程序死了,并不影响系统的正常运行并且方便了我们的开发。

    好处:

    a.UIO则是将驱动的很少一部分运行在内核空间,而在用户空间实现驱动的绝大多数功能!使用UIO可以避免设备的驱动程序需要随着内核的更新而更新的问题!

    b.降低了内核态和用户态的切换次数。

    劣势:

    a.UIO的出现,允许将驱动程序用到用户态空间里实现,但UIO有它的不足之处,如不支持DMA、中断等;

     

    2. IOMMU

    实现用户空间设备驱动,最困难的在于如何将DMA以安全可控的方式暴露到用户空间:

    a. 提供DMA的设备通常可以写内存的任意页,因此使用户空间拥有创建DMA的能力就等同于用户空间拥有了root权限,恶意的设备可能利用此发动DMA攻击。

    b. I/O memory management unit(IOMMU)的引入对设备进行了限制,设备I/O地址需要经过IOMMU重映射为内存物理地址,如图2-1。恶意的或存在错误的设备不能读写没有被明确映射过的内存,运行在cpu上的操作系统以互斥的方式管理MMUIOMMU,物理设备不能绕行或污染可配置的内存管理表项。 

    image

    图 2-1 Comparison IOMMU and MMU

    1. What is VFIO?

    1. VFIO是一个可以安全的把设备I/O、中断、DMA等暴露到用户空间(userspace),从而可以在用户空间完成设备驱动的框架。

    2. 得益于vfio低开销的用户空间直接设备访问,虚拟机设备分配(device assignment)、高性能应用等可以获得更高的I/O性能。

    每走一步,都是新的开始!
  • 相关阅读:
    同一位置(同一个ImageView)显示不同的图片levellist (转)
    LinearLayout android:layout_weight的理解
    给C盘减减肥,让你电脑飞一般速度!
    (Android实战)界面设计注意事项
    利用sender的Parent获取GridView中的当前行(转载)
    用SQL查看字符串ASCII码
    自己写DataPage分页
    连接长宽高的UDF
    把Dictionary绑定到combox
    trackbar和processbar功能合并
  • 原文地址:https://www.cnblogs.com/shafei/p/10055299.html
Copyright © 2011-2022 走看看