[RDMA]Memory Protection

本文主要介绍内存的保护机制,包括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

创建虚拟内存区域的步骤如下:

  1. software执行Register Memory Region verb来创建一个区域。
  2. Register Memory Region verb依次调用OS Memory Allocation Routine以请求所请求大小的缓存区。
  3. OS Memory Allocation Routine在物理主内存中定位页面的总大小≥该区域所请求的大小。
  4. OS Memory Management Rountine分配的页面肯定几乎不会占用连续的物理内存地址范围。
  5. 调用OS Memory Management Rountine时,verb必须指定分配给该区域的页面必须又OS固定在内存中,这可防止OS将这些页面交换到大容量存储中。
  6. OS Memory Management Rountine将每个页面的起始物理地址返回给verb。
  7. verb创建一个表(在HCA或HCA的本地内存中),该表定义VA(Virtual Address)范围(由起始VA与区域长度定义)映射到分配给新创建区域的一系列物理页面。

1.2.3 Region Windowing Mey Be Enabled When Region Is Created

为使窗口绑定到一个区域,必须在创建区域时指定,通过使用Register Memory RegionRegister 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的操作如下:

  1. 根据它们的可用性,它将以下三个4KB的页面分配给正在创建的MR:①第一页占用的物理内存地址范围从61000h到61FFF;②第二页占用的物理内存地址范围从74000h到74FFFh;③第三页占用的物理内存地址范围为8B000h ~ 8BFFFh。
  2. 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)所请求的属性。
  3. 这三个页面被固定在内存中,不会被交换到大容量存储中。
  4. 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 RegionRegister 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

以下是窗口特性的列表:

  • 窗口的创建或销毁需要用户模式到内核模式的转换(高开销操作),但更改其绑定不需要(因此开销很低)。
  • 使用窗口:
  1. 使用Allocate Memory Window verb创建新窗口,并将其分配给一个PD。
  2. 使用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的成员。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值