本文主要介绍内存的保护机制,包括MR(Memory Region)、MW(Memory Window)以及Memory Protection Domain以应对本地访问冲突、远程访问冲突、违反访问权限或未经授权访问远程UD QP。
1Memory Regions
1.1 Definition
MR是本地HCA memory中的内存页的集合。当software(通过verb调用)创建这些区域时,调用者在正在创建的MR内定义本地和可能的远程访问权限的组合:
- 本地访问权限授予本地CA(例如,QP)内的逻辑在区域内执行定义的访问类型的权限。
- 远程访问权限授予远端CA内的QP在区域内执行定义的访问类型的权限。当远端QP发送访问与目标QP关联的本地memory的请求时,目标QP必须被授予代表远端QP访问本地内存的适当访问权限。换句话说,为了让远端QP访问此CA的本地内存,本地CA也必须被授予本地访问权限。
在HCA中的QP访问它的内存之前,必须建立一个或多个MR,允许本地访问,也可能允许远端访问。
1.2 Virtual Memory Regions
当software让verb创建虚拟内存区域时,由OS Memory Rountine选择哪些物理内存页分配给该区域。
1.2.1 Creating a Virtual Region
虚拟区域是通过执行verb调用的Register Memory Region来创建的。software提供了以下输入参数:
- 所需的起始虚拟内存地址(64-bit):
—可以是任何字节对齐的64-bit地址。
—不必是与页面对齐的起始地址。
—如起始地址不与页面对齐,则该区域从OS Memory Management Rountine分配给该区域的第一个物理页面的偏移量开始。
—注,如请求的虚拟地址范围已经在使用中(即,OS Memory Management Rountine已为另一个请求者将虚拟起始地址映射到内存中的物理页面),OS将为该区域分配不同的虚拟地址范围。
- 区域长度(in bytes):
—定义了分配给该区域的虚拟地址范围的结束地址。
—该区域可能在分配给该区域最后一页的中间结束。
- 访问控制属性:
—总是自动授予本地读访问权限。
—启动/禁用本地写访问。
—启动/禁用远程写访问。(也要求启动本地写访问)
—启动/禁用远程读访问。
—启动/禁用远程Atomic operation访问。(也要求启动本地写访问)
—启动/禁用内存窗口绑定。
从verb调用返回一些输出参数:
- L_Key。本地访问秘钥。当HCA中的本地逻辑希望访问该区域是,必须指定此秘钥。在WR中指定Gather Buffer List或Scatter Buffer List时,所提供列表中的每个条目都由起始虚拟内存地址、缓冲区长度以及创建该内存区域时分配给该区域的L_Key。
- R_Key。远程访问秘钥。当HCA中的本地逻辑希望访问该区域时,必须指定此秘钥。R_Key是在远端QP希望访问该区域时发送的RDMA或Atomic请求包中提供的。
- Region handle。在进行任何后续verb调用以操作该区域的特征时,必须指定句柄。
1.2.2 Actions Taken by Verb to Create a Region
创建虚拟内存区域的步骤如下:
- software执行Register Memory Region verb来创建一个区域。
- Register Memory Region verb依次调用OS Memory Allocation Routine以请求所请求大小的缓存区。
- OS Memory Allocation Routine在物理主内存中定位页面的总大小≥该区域所请求的大小。
- OS Memory Management Rountine分配的页面肯定几乎不会占用连续的物理内存地址范围。
- 调用OS Memory Management Rountine时,verb必须指定分配给该区域的页面必须又OS固定在内存中,这可防止OS将这些页面交换到大容量存储中。
- OS Memory Management Rountine将每个页面的起始物理地址返回给verb。
- verb创建一个表(在HCA或HCA的本地内存中),该表定义VA(Virtual Address)范围(由起始VA与区域长度定义)映射到分配给新创建区域的一系列物理页面。
1.2.3 Region Windowing Mey Be Enabled When Region Is Created
为使窗口绑定到一个区域,必须在创建区域时指定,通过使用Register Memory Region或Register Physical Memory Region verb。
1.2.4 Characteristicss of a Region
- 多个区域可以部分或完全重叠相同的物理内存位置。
- 一个区域只与注册的HCA相关,与其他HCA无关。
- 每注册一个时区,区域注册verb必须向OS Memory Management Rountine发出一个固定(pin)请求。(即使是一些之前已被分配并由以前的区域注册固定的页面)
- 当使用一个所有区域都被注销的页面时,OS必须解除对该页面的锁定,这意味OS Memory Management Rountine必须跟踪为一个页面接收了多少固定请求(pin request)。
- 只有特权代码(kernal code)才被允许进行面向区域的verb调用。
- software命令HCA(通过verb)创建QP或CQ时,verb可以在OS管理的内存中构建与新的QP或CQ相关联的数据/控制结构。这种情况下:
—verb必须指示OS Memory Management Rountine固定了包含这些结构的页面。
—隐式授予对这些私有数据/控制结构的本地HCA读/写访问权限。
—HCA外部的software(verb层之上)不能访问这些结构。
—尽管结构可能存在系统内存中,但它们可能不在HCA区域内。
1.2.5 Region-Oriented Verbs
面向区域的verb:
- Register Memory Region。
- Reregister Memory Region。允许修改虚拟区域的VA,长度,PD(Protection Domain)和访问属性。
- Register Physical Memory Region。与Register Memory Region verb不同,此verb允许指定页列表、页数、IOVA、区域长度、IOVA在第一页中的偏移量、PD和访问控制属性。
- Reregister Physical Memory Region。允许修改页列表、页数、IOVA、区域长度、IOVA在第一页的偏移量、PD和访问控制属性。
- Register Shared Memory Region。创建与先前存在的区域具有相同物理内存位置关联的新区域。
- Query Memory Region。返回与该区域关联的L_Key、R_Key、访问属性和PD。
- Destory Memory Region。摧毁整个区域。verb调用OS Memory Management Rountine,并指示它销毁与该区域分配的页面相关联的虚拟到物理映射(Virtual-to-physical mappings)。
1.2.6 Shared Memory Regions
可以设置多个区域,共享内存中相同物理页面。通过调用Register Shared Memory Region verb来完成。特点如下:
- 创建一个与先前存在的区域的物理内存位置相关联的新区域。
- VA、PD和访问权限不需要与已有区域相同。然而,长度是相同的。
- 新的区域尽可能共享处理器映射资源(例如,Page Table entries)。多个区域可以共享相同的映射资源。
- 由此verb创建的区域的行为与由其他内存注册verb创建的内存区域相同。
1.2.7 Register/Register/Deregister Are High Overhead
以下三种操作都是高开销的:
- 区域的初始创建涉及从User模式切换到Kernel模式(然后再切换回来),以及随之而来的所有hardware/software开销。
- 重新注册区域也涉及到模式切换。
- 区域的破坏(即注销)也涉及到模式切换。
1.2.8 Example Virtual Region
相关虚拟区域的例子如下。假定:
- software执行verb调用的Register Memory Region。
- 请求的64位起始虚拟地址为141200h。
- 该区域的长度为10000d bytes。
- 对于本例,访问控制属性可以是任意的。
- 处理器页面大小为4KB。
verb调用OS Memory Management Rountine,指定以下内容:
- 请求64-bit起始虚拟地址为141200h。
- 区域的长度为10000d bytes。
- OS分配的页面必须固定在内存中。
- 请求的访问控制属性可以是任何所需的。
注意,请求的虚拟起始地址(141200h)与物理页起始地址(即可以被4KB页大小整除的地址)不对齐。
OS Memory Management Rountine的操作如下:
- 根据它们的可用性,它将以下三个4KB的页面分配给正在创建的MR:①第一页占用的物理内存地址范围从61000h到61FFF;②第二页占用的物理内存地址范围从74000h到74FFFh;③第三页占用的物理内存地址范围为8B000h ~ 8BFFFh。
- OS Memory Management Rountine创建virtual-to-phtsical address mapping(以特定于处理器的方式,通常通过创建Page Table entries):①分配给该区域的内存的第一个物理页中,虚拟地址范围141200h到141FFFh映射到物理地址范围61200h到61FFFh;②虚拟地址范围142000h到142FFFh映射到分配给该区域的内存的第二个物理页中的物理地址范围74000h到74FFFh;③在分配给该区域的内存的第三个物理页中,虚拟地址范围143000h ~ 143910h映射到物理地址范围8B000h ~ 8B910h;④这三个页面的访问控制属性设置为调用者(verb)所请求的属性。
- 这三个页面被固定在内存中,不会被交换到大容量存储中。
- OS Memory Management Rountine将以下信息返回给调用者(即verb):①分配给该区域的三个物理内存页的起始物理地址;②分配给虚拟地址范围的起始虚拟内存地址。注意,这可能与请求的虚拟内存起始地址相同,也可能不相同。
然后,verb在HCA或其本地内存中创建一个virtual-to-physical address mapping。
1.3 Physical Memory Regions
software会指定分配给区域的物理页面(Page)。当创建一个虚拟内存区域时(通过执行Register Memory Region verb),调用者会将它留给QS Memory Management Routine来决定物理内存中的哪些页面将被映射到该区域的虚拟地址空间。
某些情况下,调用者要求特定物理内存地址包含在该区域的虚拟地址空间中。这种情况下,创建的是物理区域,而不是虚拟区域。
以下是调用Register Physical Memory Region verb时需提供的输入参数(部分):
- 包含该区域的物理页(协议中称“buffer”)的列表。注意,每个页面必须在HCA支持的页面边界上开始和结束。页面大小由处理器类型决定,如处理器支持多种页面大小,则由所选页面大小决定。
- 列表总页数。
- 请求将IOVA(IO Virtual Address)分配到该区域的第一个字节。注意,请求的虚拟地址范围是否已经被使用。即,QS Memory Management Routine已经将其映射到另一个请求者的内存中的物理页面,那么OS将为该区域分配不同的虚拟地址范围。
- 区域长度(以字节为单位)。区域结束地址由长度定义,可以是列表中最后一个物理页内的任何位置。
- 区域第一页内IOVA的偏移量。
- 访问控制属性:
—总是自动授予本地读访问权限。
—启动/禁用本地写访问。
—启动/禁用远程写访问(需要启动本地写访问)。
—启动/禁用远程读访问。
—启动/禁用远程原子操作访问(需要启动本地写访问)。
—启动/禁用内存窗口绑定。
verb提供的输出参数:
- 区域句柄。在进行任何后续verb调用以操作此区域时,必须指定句柄。
- 实际的IOVA(可能与请求的IOVA相同,也可能不同)。
- L_Key,可能还有R_Key。访问密钥(又名Region ID)。注意,R_Key仅请求远程访问权限时返回。当远程QP希望访问该区域时,R_Key在RDMA或原子请求包中提供。
HCA创建了映射表,即注册物理区域后,verb创建虚拟到物理的页面映射表,将分配IOVA范围内的地址映射到物理内存中的相应位置。
物理区域中的一个或多个页面也可能是虚拟区域的一部分,即可以共享物理和虚拟区域页面。这种情况下,这些页面必须保持固定(由OS),直到页面不再被任何注册区域使用。
2 Memory Windows
2.1 Definition
可以为整个区域定义以下访问控制属性。
- 总自动授予本地读访问权限。
- 启动/禁用本地写访问。
- 启动/禁用远程写访问(需要启动本地写访问)。
- 启动/禁用远程读访问。
- 启动/禁用远程原子操作访问(需要启动本地写访问)。
- 启动/禁用内存窗口绑定。
假设远程CA中的多个QP将访问HCA的本地内存区域的各个区域,那么并不是所有远程QP都被希望在该区域内都具有相同的访问权限。可以通过在区域上覆盖多个窗口,并在每个窗口内分配不同的远程访问权限来实现。
这允许software:
- 以动态的方式授予或撤销对已注册区域的子集的远程访问权限,其性能损失比使用Deregistration/Registration/Reregistration Region verb小。
- 向不同的远程QP授予不同远程访问权限和/或在注册区域内授予不同范围的远程访问权限。
2.2 Windows Only Supported for RC、UC、and RD
窗口只支持RC、UC和RD传输类型,因为只有支持RDMA或原子操作才会支持QP类型。
2.3 Window Management Verbs
窗口管理的verb有:
- Allocate Memory Window。创建一个窗口并将其分配给PD,然后必须执行verb调用的Bind Memory Window,以将窗口绑定到先前创建的区域。
- Query Memory Window。返回窗口的R_Key与PD。
- Bind Memory Window。将窗口与区域关联,为窗口指定区域内的起始VA(和长度),并为远程QP的访问分配远程访问权限。
- Deallocate Memory Window。破坏一个窗口。
2.4 Binding a Window To a Region
窗口不能绑定到一个区域,除非该区域在创建时启用了窗口绑定。假设该区域支持窗口绑定,下一步使用Allocate Memory Window verb创建窗口,该窗口分配时还没有与任何内存区域关联,以下是software在verb调用Allocate Memory Window中提供的输入参数:
- HCA句柄。
- 分配给内存窗口(MW)的保护域(PD)。
输出参数:
- 窗口句柄。它必须在任何后续调用以操作或查询窗口时使用。
- R_Key。该verb返回的远程访问密钥实际上是一个没有定义访问权限的虚拟R_Key(规范称为未绑定的R_Key)。它被用作后续Bind Memory Window verb中的输入参数之一。
创建窗口后,通过执行Bind Memory Window verb将窗口绑定到区域。内存区域需要启动本地写访问,内存窗口、区域和用于执行绑定操作的QP都必须属于同一个PD。
Bind Memory Window verb的输入参数如下:
- HCA句柄。
- QP句柄。
- 包含执行请求所需信息的WR。WR包含的内容如下:
—用户自定义的64-bit WR ID。
—内存窗口句柄。由Allocate Memory Window verb返回。
—当前与MW关联的R_Key。执行Allocate Memory Window verb返回。
—内存区域(MR)句柄。由Register Memory Region或Register Physical Memory Region verb返回。
—MW将绑定到WR的L_Key。
—绑定范围的虚拟起始地址。虚拟起始地址的最大宽度为64-bit。
—要绑定到范围长度(以字节为单位)。
—范围权限。以下选项可以任意组合选择(特别注明除外):
①启动远程写访问(要求该区域已启动本地写访问)。
②启动远程读访问。
③启动远程原子访问操作(如果支持原子操作)。要求该区域启动了本地写访问。
—完成通知类型。如果SQ设置为可选信号,则必须指定此参数。
返回的唯一输出参数是与新绑定关联的R_Key(其值必须不同于作为输入参数提供的R_Key)。
当Bind Memory Window verb被执行时,绑定内存操作被发送到指定的本地QP的SQ(远程QP将使用该QP访问本地内存)。但在QP的SQ Logic执行WQE之前,窗口实际上并没有绑定到指定的区域。
这是一个规则,在绑定操作完成之前,任何在绑定MW操作之后发布到SQ的WQE都不能开始执行。
2.5 Window Characteristic
以下是窗口特性的列表:
- 窗口的创建或销毁需要用户模式到内核模式的转换(高开销操作),但更改其绑定不需要(因此开销很低)。
- 使用窗口:
- 使用Allocate Memory Window verb创建新窗口,并将其分配给一个PD。
- 使用Bind Memory Window verb,将窗口绑定到已启用用于窗口的预先存在区域。
- 绑定(或重新绑定)窗口是通过将WR发布到QP的SQ来完成的(注意,WQE的执行不会导致在链路上发送任何数据包)。
- 窗口和区域必须是同一个PD的成员。
- 分配给窗口的虚拟地址范围可以覆盖被绑定区域的全部地址范围,也可以是该区域的一部分地址范围。
- 常用的窗口用法:
—分配一次窗口。
—将其用于多个绑定。
- 被绑定的窗口和试图访问窗口内位置的任何QP都必须是同一PD的成员。
- Bind Memory Window verb的每次执行都必须导致先前分配的R_Key无效,并向调用者返回一个新的R_Key。
- HCA通过字节粒度强制窗口访问权限。
- 具有远程访问权限的窗口可以绑定到没有远程访问权限的区域,然后允许在窗口内进行远程访问。
- 提交一个窗口长度为0的绑定请求,以使窗口绑定无效,而不是释放窗口或启用对新区域的远程访问。
- 当远程QP正在访问窗口时,释放或重新绑定窗口是不合适的。若发生这种情况,正在处理或正在使用该窗口的远端QP发出的任何传输请求都必须因违反保护而失败。
- 当某区域仍与任何窗口绑定时,取消注册或重新注册此区域是错误的,这样的窗口被称为“orphans”。
- 绑定请求仅支持RC或UC服务类型,如HCA支持RD服务,则支持RD。
3 Protection Domains
3.1 Definition
PD提供保护,防止未授权或无意使用某内存区域。PD还可以用于控制对目标UD QP的访问。
3.2 Creation
PD必须在创建作为该PD成员的任何QP、区域、窗口或地址句柄之前被创建(即,分配)。创建PD需要注意如下:
- 使用Allocate Protection Domain verb创建PD。
- 只有内核模式的OS代码才允许执行此verb调用。
- PD是特定于创建它们的HCA的。
当PD、区域或窗口被创建时,它们都将称为PD的成员。当software调用verb以创建QP、区域或窗口时,PD作为输入参数之一提供。
3.3 Destruction
使用verb调用的Deallocate Protection Domain破坏PD。
- 如果任何QP、区域、窗口或地址句柄仍是该PD的成员,则PD不能被销毁。
- 只有内核模式的OS代码才允许执行此verb调用。
3.4 PD Relationship to Regions,Windows,and QPs
区域、窗口、QP与PD之间存在如下关系:
- 分配给QP的PD(在创建QP时)与分配给该区域或窗口的PD匹配时,QP才能访问MR或MW。
- 每个QP只能是一个PD的成员,创建QP创建时被分配。
- 多个QP可以是同一个PD的成员。
- 每个区域或窗口都是单个PD的成员。
- 多个区域或窗口可以是同一个PD的成员。