VFIO——将设备暴露到用户态

在开始之前我们先要说一个东西就是 DMA,直接让设备访问内存,可以不通过 CPU 搬运数据。

这是一个比较简单的体系结构图,设备 和 CPU 通过存储控制器访问存储器。一个简单的 case 是 CPU 向存储器写数据,然后设备从存储器读数据。这么快来一切都很正常。但是实际上 CPU 是有一层缓存的,例如下面这样的。

CPU 想内存写数据,但是先要清空到不一致的缓存,然后设备再去读数据,不然设备读到的数据和 CPU 实际的数据会不一致(因为缓存里的数据可能和存储器的不一致),而且实际上缓存也不只是一层,所以需要一个中间层来保证 从 CPU 的角度和从设备的角度内存都是一致的,所以就有了下面这个结构。

CPU 和 设备都会走缓存验证一遍以后,再落到存储器上,这样带上缓存以后大家的一致性都是一样的了。所以从设备的角度,设备也拥有了缓存,实际上这个和 IOMMU 关系不是很大,接下来设备其实也可以和 CPU 一样有一层 MMU,也就是地址到存储器物理地址的转换。注意,这里我用了地址,因为对 CPU 来说是虚拟地址,但是对设备来说是一个总线域的地址。这里要明确区分一下,一个是总线地址,是从设备的角度来看的,一个是 CPU 的虚拟地址,这是从 CPU 角度来看的,两个是不同的东西。将总线域地址转换成存储器物理地址的设备就叫 IOMMU。

如果没有 IOMMU,DMA 也能照常工作,IOMMU 的主要作用就是保护功能,防止使用 DMA 的设备访问任意存储器的物理地址。

IOMMU 在不同架构上名字不太一样,AMD 叫 AMD-Vi,最开始针对的设备只是显卡,Intel 叫 VT-d,arm 叫 SMMU,具体对应的手册也不太一样,但是主要解决的问题是一致的。在 VTd 中,dmar (DMA remapping) 就是那个 IOMMU 设备,通过中断的方式实现类似 page fault 一样的内存分配行为。DMA 传输是由 CPU 发起的:CPU 会告诉 DMA 控制器,帮忙将 xxx 地方的数据搬到 xxx 地方。CPU 发完指令之后,就当甩手掌柜了。IOMMU 有点像 MMU 是一个将设备地址翻译到内存地址的页表体系,也会有对应的页表,这个东西在虚拟化中也非常有用,可以将原本有软件模拟的设备,用直接的硬件替代,而原本的隔离通过 IOMMU 来完成。如下图所示,原本需要通过软件模拟的驱动设备可以通过 IOMMU 以安全的方式来直接把硬件设备分配个用户态的 Guest OS。

理论上讲没有 IOMMU 实际上是可以工作的,但是硬件的角度,设备就拥有了整个存储器的全局视图,这是无论如何都非常不合理的事情,不应该让设备拥有访问任意物理内存的能力。

这里要提的另外一个功能就是对中断的隔离,类似于下面的通过在中断请求中添加标识来重定向中断到对应的中断回调上。

VFIO 的作用就是通过 IOMMU 以安全的方式来将设备的访问直接暴露到用户空间,而不用专门完成某个驱动等待合并到上游或者使用之前的对 IOMMU 没有感知的 UIO 的框架。通过 VFIO 向用户态开放 IOMMU 的功能,编写用户态的驱动。

对于 IOMMU 来说,隔离的级别不一定是单个设备,比如一个后面有几个设备的 PCI 桥,从 PCI 桥角度来说,都是来自 PCI 桥的总线事务。所以 IOMMU 有一个 iommu_group的概念,代表一组与其他设备隔离的设备的集合。

IOMMU 根据手册上讲还有一个域的概念,可以简单理解为一段物理地址的抽象。

在 iommu_group的层级上,VFIO 封装了一层 container class,这个的作用对应于希望能够在不同的iommu_group 之间共享 TLB 和 page tables,这个就是一个集合的概念,跟容器的那个概念没啥关系,一个集合总归要有个名字。通过把 host 的 device 和 driver 解绑,然后绑定到 VFIO 的 driver 上,就会有个/dev/vfio/$GROUP/ 出现,然后这个 $GROUP代表的就是这个 device 的 iommu_group号,如果要使用 VFIO 就要把这个 group 下的所有 device 都解绑才可以。

通过打开/dev/vfio/vfio就能创建一个 VFIO 的 container,然后再打开/dev/vfio/$GROUP用VFIO_GROUP_SET_CONTAINER ioctl 把文件描述传进去,就把 group 加进去了,如果支持多个 group 共享页表等结构,还可以把相应的 group 也加进去。(再强调一遍这个页表是总线地址到存储器物理地址,IOMMU 管理的那个页表)。

下面举个官方的栗子,获取 PCI 设备 0000:06:0d.0 的 group_id (PCI 命名的规则是 domain

linux用户层驱动--VFIO(四)相关推荐

  1. linux用户层驱动--VFIO(五)

    概述 VFIO是一套用户态驱动框架,它提供两种基本服务: 向用户态提供访问硬件设备的接口 向用户态提供配置IOMMU的接口 VFIO由平台无关的接口层与平台相关的实现层组成.接口层将服务抽象为IOCT ...

  2. linux用户态驱动--VFIO(一)

    序言 设备驱动可以运行在内核态,也可以运行在用户态,不管用户态驱动还是内核态驱动,他们都有各自的缺点.内核态驱动的问题是:系统调用开销大:学习曲线陡峭:接口稳定性差:调试困难:bug致命:编程语言选择 ...

  3. Android 系统(4)---Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. HAL:Hardw ...

  4. Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 阅读数:5070 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. ...

  5. linux用户模式驱动,linux设备驱动之控制台驱动

    我们在之前分析过input子系统和tty设备驱动架构.今天需要将两者结合起来.看看linux中的控制台是怎么样实现的. 二:控制台驱动的初始化 之前在分析tty驱动架构的时候曾分析到.主设备为4,次设 ...

  6. Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个基本的介绍.其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装 ...

  7. linux用户态驱动--VIFIO、IOMMU、UIO(二)

    1.UIO的出现,允许将驱动程序用到用户态空间里实现,但UIO有它的不足之处,如不支持DMA.中断等: 2.随着虚拟化的出现,IOMMU也随之出现,IOMMU为每个直通的设备分配独立的页表,因此不同的 ...

  8. linux sd卡驱动教程,Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

    前面对SD卡控制器有了一个基本的介绍.其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装 ...

  9. linux用户层通过spi读写cpld

    cpld的通讯格式会有不同 我这使用的是32bit 需反转的 写时序: 读时序: #include <stdint.h> #include <unistd.h> #includ ...

最新文章

  1. 统计学习方法第四章课后习题(转载+重新排版+自己解读)
  2. 双极结型三极管的结构、特性、参数
  3. Xamarin开发笔记—设备类第三方弹窗的使用和注意事项
  4. 黑白群晖为Plex添加证书,开启HTTPS访问
  5. jsp中文乱码现象解决办法
  6. 阿里oss服务端签名后直传
  7. 毕业论文(设计)开题报告
  8. 【Python自然语言处理】读书笔记:第五章:分类和标注词汇
  9. termux关于python3.10中下载numpy,pandas,matplotlib,以及jupyter|ahonsmile
  10. flash3D引擎对比分析
  11. java语言TAM机程序代码(基础版)
  12. 马士兵Python基础版2020教程P58-P96 PPT笔记+课堂代码
  13. C语言输出 1到20 的阶乘之和
  14. KindEditor 上传漏洞致近百个党政机关网站遭植入
  15. 江苏全国计算机考试考点,江苏省 全国计算机等级考试考点.xls
  16. 【能效管理】变电所运维云平台在上海某医院的设计分析
  17. 【Python】实现中英文互译
  18. 梅花香自苦寒来 ----议张恂《笑看JavaEye软工坛之叽叽喳喳》
  19. 计算机基础知识试题题库
  20. 电路板的地直接与外壳地通过并联电阻/电容相连接分析-ESD/EMC

热门文章

  1. python使用什么来表示不同级别的语句块-python通过什么来区分不同的语句块?
  2. 老师学python可以干嘛-python语言可以干什么
  3. python的优缺点有哪些-Python语言的优缺点有哪些
  4. python正规教育机构-老男孩python教育机构|python该如何自学好?
  5. python散点图拟合曲线-使用python通过点拟合曲线
  6. python的编程模式-python编程(python开发的三种运行模式)【转】
  7. python语言必背代码-Python入门必须知道的11个知识点
  8. python切片语法-Python切片符号(:)用法及示例
  9. python opencv检测人脸
  10. 策略模式优化过多的IF ELSE