Intel iommu 硬件(2)

DMA Remapping 简介

Remapping硬件将来自于 集成在root-complex中 或 挂载在PCIE bus上的 设备的memory request分成两类:

Requests-without-PASID:这是来自于endpoint devices的普通memory requests。它们一般指明了访问类型(read/write/atomics)、DMA目的地的地址与大小、源设备标识。

Requests-with-PASID:这是来自于支持virtual memory capabilities的endpoint devices的memory requests。它们除了指明上述普通信息外,还带有附加信息:目标PASID、扩展属性等…

(注:PASID全名Process Address Space ID,来源于PCIE中的概念)
为了简单我们一般把上面两类简称为Requests-without-PASIDRequests-with-PASID,本节只讨论Requests-without-PASID

DMA隔离和地址翻译

什么是domain?

A domain is abstractly defined as an isolated environment in the platform, to which a subset of the
host physical memory is allocated. I/O devices that are allowed to access physical memory directly
are allocated to a domain and are referred to as the domain’s assigned devices. For virtualization
usages, software may treat each virtual machine as a domain.

简单理解domain就是一个平台隔离的环境,是host physical memory的一个子集。对虚机化来说,软件可以将每个虚拟机看作一个单独的domain。

Remapping硬件的作用是:在硬件进行进一步处理(例如:address decoding, snooping of processor caches, and/or forwarding to the memory controllers)之前,将memory request中的地址转换成host physical address。

Source Identifier

source-id:用于标识I/O transaction的发起者。 对于PCIE设备,其source-id位于PCI-Express transaction layer header中,由Bus/Device/Function组成。

同时为了能够记录直通设备和每个Domain的关系,VT-d引入了root-entry/context-entry的概念,通过查询root-entry/context-entry表就可以获得直通设备和Domain之间的映射关系。

Root-Entry

root-table 是4KByte的大小,共包括了256项root-entry,分别覆盖了PCI的Bus0-255,bus号应该索引root-entry,每个root-entry占16-Byte,记录了当前PCI Bus上的设备映射关系,通过PCI Bus Number进行索引。 Root-table的基地址存放在Root Table Address Register当中。Root-entry中记录的关键信息有:

  • Present Flag:代表着该Bus号对应的Root-Entry是否呈现,CTP域是否初始化;
  • Context-table pointer (CTP):CTP记录了当前Bus号对应点Context Table的地址。

Context-entry

同样每个context-table也是一个4K页,记录一个特定的PCI设备和它被分配的Domain的映射关系,即对应Domain的DMA地址翻译结构信息的地址。 每个root-entry包含了该Bus号对应的context-table指针,指向一个context-table,而每张context-table包又含256个context-entry, 其中每个entry对应了一个Device Function号所确认的设备的信息。通过2级表项的查询我们就能够获得指定PCI被分配的Domain的地址翻译结构信息。Context-entry中记录的信息有:

  • Present Flag:表示该设备对应的context-entry是否被初始化,如果当前平台上没有该设备Preset域为0,索引到该设备的请求也会被block掉。
  • Translation Type:表示哪种请求将被允许;
  • Address Width:表示该设备被分配的Domain的地址宽度;
  • Second-level Page-table Pointer:二阶页表指针提供了DMA地址翻译结构的HPA地址(这里仅针对Requests-without-PASID而言);
  • Domain Identifier: Domain标志符表示当前设备的被分配到的Domain的标志,硬件会利用此域来标记context-entry cache,这里有点类似VPID的意思;
  • Fault Processing Disable Flag:此域表示是否需要选择性的disable此entry相关的remapping faults reporting

DMA隔离和地址翻译

VT-d中引入root-table和context-table的目的比较明显,这些额外的table的存在就是为了记录每个直通设备和其被分配的Domain之间的映射关系。 有了这个映射关系后,DMA隔离的实现就变得非常简单。 IOMMU硬件会截获直通设备发出的请求,然后根据其Request ID查表找到对应的Address Translation Structure即该Domain的IOMMU页表基地址, 这样一来该设备的DMA地址翻译就只会按这个Domain的IOMMU页表的方式进行翻译,翻译后的HPA必然落在此Domain的地址空间内(这个过程由IOMMU硬件中自动完成), 而不会访问到其他Domain的地址空间,这样就达到了DMA隔离的目的。

DMA地址翻译的过程和虚拟地址翻译的过程是完全一致的,唯一不同的地方在于MMU地址翻译是将进程的虚拟地址(HVA)翻译成物理地址(HPA),而IOMMU地址翻译则是将虚拟机物理地址空间内的GPA翻译成HPA。IOMMU页表和MMU页表一样,都采用了多级页表的方式来进行翻译。例如,对于一个48bit的GPA地址空间的Domain而言,其IOMMU Page Table共分4级,每一级都是一个4KB页含有512个8-Byte的目录项。和MMU页表一样,IOMMU页表页支持2M/1G大页内存,同时硬件上还提供了IO-TLB来缓存最近翻译过的地址来提升地址翻译的速度。

评论

  1. jxh
    3年前
    2022-10-01 7:59:39

    图片加载失败了

    • Jianping 博主
      2年前
      2023-1-19 16:03:46

      感谢反馈,我看一下

  2. Jianping 博主
    2年前
    2023-1-19 16:41:31

    图片丢失了

    • Jianping 博主
      2年前
      2023-1-19 16:46:51

      。。。。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇