CXL事务层(续)

3.2 CXL.cache

3.2.1 概览

CXL.cache协议将设备和主机之间的交互定义为多个请求,每个请求至少有一条相关的响应消息,有时还有数据传输。该接口在每个方向上由三个通道组成:请求(Request)、响应(Response)和数据(Data)。通道按其方向命名,D2H表示设备到主机,H2D表示主机到设备。

  • D2H请求通道,将新请求从设备传送到主机。请求通常以内存为目标。每个请求将收到0、1或2个响应,和最多一个64字节的缓存行。通道可以反压(Back Pressure)。

  • D2H响应通道,将设备的所有响应传送到主机。设备对监听的响应返回该缓存行在设备缓存中的状态,并可能表示数据正返回到主机提供的数据缓冲区。对于链路层信用,它们可能仍会被暂时阻止,但不应要求完成任何其他交易来释放信用。

  • D2H数据通道,将所有数据和字节启用从设备传输到主机。数据传输可以是隐式(由于监听)或显式写回(由于缓存容量而导致的“逐出”)的结果。在所有情况下,都将传输完整的64字节缓存行。D2H数据传输必须进行,否则可能会出现死锁。它们可能会因链路层信用暂时被阻止,但不得要求完成任何其他交易来释放信用。

  • H2D请求通道,将请求从主机传送到设备。这些请求都是为保持一致性的监听。可能会返回数据,请求携带数据缓冲区的位置,任何返回数据都应写入该缓冲区。

  • H2D响应通道,携带排序消息并提取写入数据。每个响应都携带来自原始设备请求的请求标识符,以指示响应应该路由到哪里。

  • H2D数据通道,为设备读取请求提供数据。在所有情况下,都将传输完整的64字节缓存行。

3.2.2 CXL.cache通道描述

通常,所有CXL.cache通道都必须彼此独立工作。然而,有一个特例,为了保证正确性,必须维护通道之间的顺序。主机需要等待设备观察到H2D响应上发送的全局排序(Global Ordering,GO)消息,然后再发送相同地址的后续监听。为了限制跟踪GO消息所需的缓冲量,主机保证通过CXL.cache发送的GO消息后,在一定周期内不能再发送的监听。

每个通道都必须使用信用来发送任何消息,并从接收方收集信用返回。在操作过程中,每当接收器处理完消息后,它都会返回一个信用。如果没有可用的信用,发送方必须等待接收方返回信用。下表描述了哪些通道必须被排空才能继续,哪些通道可以无限期阻塞。

3.2.3 CXL.cache写描述

CXL.cache每个通道消息的字段定义如下。

3.2.3.1 D2H请求

关于Opcode,后面的章节会详细描述这些D2H请求。

3.2.3.2 D2H响应

3.2.3.3 D2H数据

3.2.3.4 H2D请求

3.2.3.5 H2D响应

3.2.3.6 H2D数据

3.2.4 CXL.cache事务描述

3.2.4.1 D2H请求

D2H请求,有四种语义:CXL.cache Read,CXL.cache Read0,CXL.cache Read0/Write,CXL.cache Write。

CXL.cache Read

CXL.cache Read需要D2H请求信用,在D2H CXL.cache请求通道上发送请求消息。CXL.cache Read请求需要0或1条响应(GO)消息和64字节缓存行的数据信息。响应(如果存在)和数据消息都指向初始D2H请求分组的CQID字段中提供的设备跟踪器条目。在收到来自主机的所有消息之前,设备条目必须保持活动状态。为确保向前进度,设备必须具有保留的数据缓冲区,以便在发送请求后能够立即接受所有64字节的数据。但是,由于先前的数据返回没有排出,设备可能暂时无法接受来自主机的数据。一旦从主机接收到响应消息和数据消息,就可以认为事务已完成,并且条目已从设备中解除分配。

下图显示了CXL.cache Read的过程。需注意,响应(GO)消息可以在数据消息之前、之后或之间接收。

CXL.cache Read0

CXL.cache Read0接受响应消息,但是没有数据消息。响应消息指向初始D2H请求消息的CQID值中指示的设备条目。一旦收到这些请求的GO消息,就可以认为它们已完成,并且条目已从设备中解除分配。主机不得为这些事务发送数据消息。

CXL.cache Write

CXL.cache Write需要D2H请求信用。主机收到请求消息后,需要发送两条单独的或一条合并的GO-I和WritePull消息。GO消息绝不能在WritePull之前到达设备,但它可以在组合消息中到达。如果事务是posted类型的写,那么合并的回复消息类型更能派上用场。如果是non-posted类型的写,host需要先发GO-I消息,再发WritePull消息。

下图显示了完成CXL.cache Write事务的过程,WritePull消息触发数据消息。

下图显示了WritePull是来自GO的单独消息的情况(强序不可缓存写请求)。

下图显示了主机FastGO和ExtCmp的响应(弱序写请求)。

至于什么是强序,弱序,就不解释了。

CXL.cache Read0-Write

CXL.cache Read0-Write需要D2H请求信用。WritePull消息会触发设备发出64-byte数据给主机。一旦设备接收到GO-I消息并发送了所有所需的数据消息,则认为CXL.cache Read0-Wrtie事务已完成。此时,可以从设备中释放条目。主机在接收到所有64字节的数据并发送GO-I响应消息后,会认为Read0-Write结束。

D2H请求的opcode如下:

  • RdCurr:这些是来自设备的完整缓存行读取请求,以获取最新数据,但不会更改任何缓存(包括主机)中的现有状态。主机不需要跟踪发出RdCurr的设备中的缓存行。RdCurr获取数据,但无法占有。设备接收到处于无效状态的行,这意味着它只能使用一次该行,无法缓存该行。

  • RdOwn:来自设备的完整缓存行读取请求,用于缓存处于任何可写(writable)状态的行。通常,RdOwn请求接收处于Exclusive(GO-E)或Modified(GO-M)状态的行。处于Modified状态的缓存行,必须将其写回主机。在错误情况下,RdOwn请求可能会收到处于Invalid(GO-I)或Error(GO-Err)状态的行。两者都将返回全是1的数据。设备负责处理错误。

  • RdShared:设备发起读取完整缓存行的请求,用于缓存处于Shared状态的行。通常,RdShared请求接收处于共享(GO-S)状态的行。在错误情况下,RdShared请求可能会收到处于Invalid(GO-I)或Error(GO-Err)状态的行。两者都将返回全是1的数据。设备负责处理错误。

  • RdAny:备发起读、读取完整缓存行的请求,用于缓存处于任何状态的行。在错误情况下,RdAny请求可能会收到处于Invalid(GO-I)或Error(GO-Err)状态的行。两者都将返回全是1的数据。设备负责处理错误。

  • RdOwnNoData:设备向指定的缓存行地址发起该请求,目的是拥有独占的权限。在错误情况下,RdOwnNoData请求可能会收到处于Error(GO-Err)状态的行。设备负责处理错误。

  • ItoMWr:设备对指定的缓存行地址发起独占权限请求,并以原子方式将缓存行写回主机。由于设备会将整个缓存行的数据都修改掉,所以不需要主机将该缓存行数据发给设备。当主机给了请求该缓存行的独占权限后,设备会回复响应消息GO-I-WritePull。设备不需要再保留写回的数据。如果错误发生,设备回复GO-Err-WritePull,主机丢弃设备写回的数据。设备处理该错误。

  • MemWr:与ItoMWr有些类似,但是写回数据的位置可能不同。只有当命令命中缓存时,数据才会写入其中;如果未命中,数据将直接写入内存。一旦请求被授予所有权,典型的响应就是GO-I-WritePull。设备不保留该行的副本。如果错误发生,设备回复GO-Err-WritePull,主机丢弃设备写回的数据。设备处理该错误。

  • ClFlush:设备发起请求,无效掉指定地址的缓存行。主机返回的典型响应是GO-I。

  • CleanEvict:设备发送请求给主机,要求evict一条64-byte的Exclusive缓存行。该请求会收到GO-WritePull或GO-WritePullDrop类型的响应消息。不论设备收到哪种响应消息,都必须放弃对该缓存行的监听所有权限。如果收到的是GO-WritePull,那么设备将数据发送给主机,如果是GO-WritePullDrop,那么主机直接将该组数据丢弃。

  • DirtyEvict:设备发送请求给主机,要求evict一条64-byte的Modified缓存行。请求发出后,应该收到的响应消息是GO-WritePull,这也意味着device对该缓存行失去了监听所有权,并需要将数据发送出去。一旦设备发起了这样的一个请求,并且在设备接收到GO-WritePul或GO-WritePullDrop响应消息前,访问的缓存地址已经被监听了,这时候,设备需要设置数据消息的Bogus字段,用来指示这个数据也许不是最新的。当有错误出现,主机回复GO-Err-WritePull,这个时候设备写回的数据会被主机丢弃掉。设备负责处理错误。

  • CleanEvictNoData:设备发起请求给主机,以便在设备中删除一条干净的缓存行。此请求的唯一目的是更新主机中的监听过滤器(snoop filter),并且不会交换任何数据。只有在主机挂载内存的地址范围内,才需要CleanRecictNodeData。对于设备挂载内存的地址范围,等效操作可以在设备内部完成,而无需向主机发送事务。

  • WOWrInv:弱顺序写无效缓存行(0-63byte)请求,可以设置字节启用组合。通常,WOWrInv接收一个FastGO-WritePull,后跟一个ExtCmp。收到FastGO-WritePull后,设备会将数据发送到主机。对于主机挂载内存,一旦内存中的写入完成,主机就会发送ExtCmp。在错误情况下,将收到GO-Err-Writepull。设备将正常发送数据,但主机将丢弃数据。设备负责处理错误。在所有情况下,在GO错误之后,主机仍将发送ExtCmp。

  • WOWrInvF:与WOWrInv类似,不同的是它是一条完整的缓存行(64byte),没有字节使能。

  • WrInv:这是一个0-64字节的写无效行请求。通常,WrInv会收到一个WritePull,然后是GO。获得WritePull后,设备将数据发送到主机。一旦内存中的写入完成(主机挂载内存或设备挂载内存),主机将发送GO。在错误情况下,会收到GO-Err。设备负责处理错误。

  • CacheFlushed:设备通过此请求通知主机其缓存已刷新,并且不再包含处于Shared、Exclusive或Modified状态的任何缓存行。主机可以使用此信息清除其监听过滤器,阻止对设备的监听并返回GO。一旦设备接收到GO,在设备发送下一个可缓存D2H请求之前,保证不会从主机接收任何监听。

下表是D2H请求与对应的H2D响应(非设备挂载内存)

下表是D2H请求与对应的响应(设备挂载内存)

3.2.4.2 D2H响应

D2H响应编码:

  • RspIHitI:这是设备对主机的监听请求的响应,表示在设备端没有此缓存行副本。如果设备返回RspIHitI,主机可以认为该缓存行已从设备中清除。

  • RspVHitV:这是设备对主机的监听请求的响应,表示在设备端有此缓存行副本,但是状态没有改变。如果设备返回RspVHitV,主机可以认为设备至少有一个该缓存行的副本。

  • RspIHitSE:这是设备对主机的监听请求的响应,表示在设备端该缓存行是干净的,而且现在无效了。如果设备返回RspIHitSE,主机可以认为该缓存行已经从设备清掉了。

  • RspSHitSE:这是设备对主机的监听请求的响应,表示在设备端该缓存行是干净的,而且现在降级为Shared。如果设备返回RspSHitSE,主机将认为此缓存行副本还保留在设备中。

  • RspSFwdM:H2D的监听请求命中的缓存行是Modified状态,之后变为了Shared状态。设备可以将状态变为Invalid。设备会通过D2H CXL.cache数据通道发送64-byte给主机。

  • RspIFwdM:H2D的监听请求命中的缓存行是Modified状态,之后变为了Invalid状态。主机可以认为设备不再有该缓存行的副本。设备会通过D2H CXL.cache数据通道发送64-byte给主机。

  • RspVFwdV:缓存行的状态没有发生变化。设备仅把当前的数据发送给主机。

3.2.4.3 H2D请求

下图是H2D监听完成的过程。主机可以按照与数据消息的任何相对顺序接收响应消息。对于监听数据传输,字节启用字段始终为1,也就是全部启用。

H2D请求和相关的响应:

  • SnpData:主机发起的监听请求,主机想将这条缓存行状态修改为Shared或者是Exclusive。设备响应一般发送数据。设备接到该请求后,必须无效掉自己的副本或者降级修改状态为Shared。如果设备修改过此缓存行,必须把“脏”数据发送给主机。

  • SnpInv:主机发起的监听请求,主机想拥有这条缓存行的所有权,状态修改为Exclusive。这种请求一般是由于主机要对该缓存行进行写操作。如果设备内有“脏”数据,那么必须将该数据返回给host。

  • SnpCur:该监听请求是为了获得最新的缓存行数据,但是并不改变它的现有状态。如果设备中的缓存数据处于Modified状态,必须返回一份数据给主机。主机和设备两端的缓存行状态不需要改变,主机不更新缓存。

3.2.4.4 H2D响应

H2D响应编码:

  • WritePull:主机告诉设备,把数据发给主机,但是不用改变缓存行的状态。用于WrInv请求,该消息需要先于GO-I消息发出,因为GO-I消息发出,意味着I/O的写操作已经完成。

  • GO:(Global Observation)表示读请求是一致的,写请求是一致的,连贯的。系统设备已观察到该事务,RspType字段中编码的MESI状态表示与该事务相关的数据应置于请求者缓存的哪个状态。

  • GO_WritePull:这是GO+WritePull消息。没有缓存状态需要传输给设备。GO+WritePull消息用于posted写类型

  • ExtCmp:系统观察到了有Fast_GO数据。访问存储会得到最新的数据

  • GO_WritePull_Drop:此消息的语义与Go_WritePull相同,只是设备不应向主机发送数据。当主机确定不需要数据时,可以发送此响应来代替GO_WritePull。由于始终需要传输字节启用,因此不会为部分写入发送此响应

  • Fast_GO:与GO消息类似,区别是,该消息意味着只有本地知道了,而GO消息是全系统知道了。当事务是完全可观测的时候,在该消息后面会发出ExtCmp消息。如果设备不支持该消息,则忽略这条消息,一直等待ExtCmp消息。

  • Fast_GO_WritePull:与GO_WritePull类似,但是该消息告诉设备,请求只是被本地观测到。当事务是完全可观测的时候,在该消息后面会发出ExtCmp消息。如果设备不支持该消息,则忽略这条消息,一直等待ExtCmp消息。主机不需要传输缓存状态给设备。

  • GO_ERR_WritePull:与GO_WritePull类似,但该消息是告诉设备,请求出现了错误,需要设备去处理。对于WritePull,设备一定要把数据发送给主机,主机会将该数据丢弃。主机不需要传输缓存状态给设备。

3.2.5 可缓存性详述和请求限制

本小节的细节和限制适用于所有的设备。

3.2.5.1 GO-M响应

主机的GO-M响应表明设备被授予修改数据(modified data)的唯一副本。设备必须缓存此数据,并在完成后将其写回。

3.2.5.2 Device/Host Snoop-GO-Data假设

当主机向设备返回GO响应时,期望到达接收GO的请求的相同地址的监听将看到该GO的结果。例如,如果主机发送GO-E请求RdOwn,然后紧接着向同一地址发送监听,接下来会期望设备将缓存行转换为M状态,并且返回RspIFwdM响应给主机。为了实现这一目的,CXL.cache链路层确保设备将接收这两条消息,以使顺序完全明确。当主机向设备发送监听请求时,要求在主机收到监听响应并收到所有隐式写回(implicit writeback,IWB)数据之前,不会向设备中含有该地址的任何请求发送GO响应。当主机向设备返回数据,并且该请求的GO尚未发送到设备时,主机可能在发送GO消息之前不会向该地址发送监听请求。

从根本上讲,与读取请求相关的GO也适用于该请求返回的数据。为读取请求发送数据意味着数据有效,这意味着即使GO尚未到达,设备也可以使用它。

3.2.5.3 Device/Host Snoop/WritePull假设

在主机收到来自64字节地址的所有WritePull数据之前,主机不可以对该地址启动监听。相反,在主机收到对挂起的写入地址监听的响应之前,主机不可以启动WritePull。

1.2.5.4 CXL.cache上逐出(Evicts)的监听响应和数据传输

如果已在CXL.cache D2H请求通道上发出设备逐出事务,但尚未从主机收到WritePull,并且监听命中WB,则设备必须跟踪此监听命中。当设备开始处理WritePull时,设备必须在发送到主机的所有D2H数据消息中设置Bogus字段。目的是向主机传达请求数据已作为IWB数据发送,因此逐出的数据可能已过时。

3.2.5.5 对相同地址的多个监听

只允许主机在某一时刻对指定设备的指定缓存行地址有一个未完成监听。也就是说,主机必须等到接收到监听响应和所有IWB数据(如果有)后,才能将下一个监听请求发送到该地址。

3.2.5.6 对同一缓存行的多个读请求

只有在以下特定情况下,才允许对同一缓存行执行多个读请求。

3.2.5.7 对同一缓存行的多个逐出

不允许对同一缓存行发起多次逐出请求。

3.2.5.8 对同一缓存行的多个写请求

允许在CXL.cache上对同一缓存行执行多个WrInv/WOWrInv/ItoMWr/MemWr。主机或交换机可以自由的进行重新排序请求,并且设备按照重新排序的顺序接收相应的H2D响应。但是,通常不建议设备对同一缓存行发出多个写请求。

3.2.5.9 GO

只有在主机保证请求将拥有缓存行的所有权之后,才会发送GO响应。

3.2.5.10 FastGO

FastGO只允许用于不需要严格排序的请求。

3.2.5.11 逐出到设备挂载的内存

设备仅允许向设备挂载的内存发出WrInv和WOWrInv*。

3.2.5.12 CXL.cache上的内存类型

要在CXL.cache上发出请求,设备需要通过CXL.io上的ATS请求从主机获取主机物理地址。

3.2.5.13 一般假设

略。

3.2.5.14 Buried Cache State Rules

略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/291039.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ESCTF-密码赛题WP

*小学生的爱情* Base64解码获得flag *中学生的爱情* 社会主义核心价值观在线解码得到flag http://www.atoolbox.net/Tool.php?Id850 *高中生的爱情* U2FsdG开头为rabbit密码,又提示你密钥为love。本地toolfx密码工具箱解密。不知道为什么在线解密不行。 *大学生的爱情* …

Django屏蔽Server响应头信息

一、背景 最近我们被安全部门的漏洞扫描工具扫出了一个服务端口的漏洞。这个服务本身是一个Django启动的web服务,并且除了登录页面,其它页面或者接口都需要进行登录授权才能进行访问。 漏洞扫描信息和提示修复信息如下: 自然这些漏洞如何修复&#xff0c…

mysql之MyBatis核心工作原理

MyBatis核心工作原理 一、源码环境 1.手动编译源码 工欲善其事必先利其器。为了方便我们在看源码的过程中能够方便的添加注释,我们可以自己来从官网下载源码编译生成对应的Jar包,然后上传到本地maven仓库,再引用这个Jar。大家可以自行去官…

如何用Python脚本自动发送邮件?

目录 1. 基础知识 1.1. SSH(Secure Shell)协议 1.2. SMTP(Simple Mail Transfer Protocol)协议 1.3. SSH协议与SMTP协议之间的关系 2. QQ邮箱设置 2.1. 开启SMTP服务 2.2. 编写脚本 3. 测试成功 1. 基础知识 邮件的发送过…

学习鸿蒙基础(7)

一、Watch状态变量更改通知 Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用Watch为状态变量设置回调函数。 1、装饰器参数:必填。常量字符串,字符串需要有引号。是(string)> void自定义成员函数的方法…

Spring Transaction 指定事务管理器问题

一,单个数据源,单个事务管理器与Transactional默认事务管理器名称不一致问题 在平时代码中使用声明性事务时,直接在方法上面加注解即可,如下 Transactional(rollbackFor Exception.class) 并没有指定事务管理器,为…

人工智能|推荐系统——搜索引擎广告

原文题目 Dark sides of artificial intelligence: The dangers of automated decision-making in search engine advertising(JASIST,2023) 人工智能的阴暗面:搜索引擎广告自动决策的危险 摘要 随着人工智能应用的日益广泛,搜索引擎供应商越来越多地要求广告商使用基于机…

Linux内核之debugfs_create_dir与debugfs_create_file实例与调用栈流程(三十二)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Flink集群主节点JobManager启动分析

1.概述 JobManager 是 Flink 集群的主节点,它包含三大重要的组件: ResourceManager Flink集群的资源管理器,负责slot的管理和申请工作。 Dispatcher 负责接收客户端提交的 JobGraph,随后启动一个Jobmanager,类似 Yarn…

动态内存管理+柔性数组

动态内存存在的意义 C语言是一种过程式编程语言,提供了底层访问能力和丰富的功能,广泛应用于操作系统、嵌入式系统、硬件驱动程序等领域。C语言的动态内存管理主要是通过malloc()、calloc()、realloc()和free()这几个标准库函数来实现的。 理解动态内存…

图论- 最小生成树

一、最小生成树-prim算法 1.1 最小生成树概念 一幅图可以有很多不同的生成树,比如下面这幅图,红色的边就组成了两棵不同的生成树: 对于加权图,每条边都有权重(用最小生成树算法的现实场景中,图的边权重…

151 shell编程,正则表达式,在C语言中如何使用正则表达式

零,坑点记录:bash 和 dash 的区别,导致的坑点 查看当前用的shell 是啥,用的是/bin/bash hunandedehunandede-virtual-machine:~$ echo $SHELL /bin/bash 当shell 脚本运行的时候(后面会学到方法,这里是最…

什么是搜索引擎(SEO)爬虫它们是如何工作的?

什么是搜索引擎(SEO)爬虫&它们是如何工作的? 你的网站上有蜘蛛🕷️。别抓狂!我说的不是真正的八条腿的蜘蛛🕷️。 我指的是搜索引擎优化爬虫。他们是实现SEO的机器人。每个主要的搜索引擎都使用爬虫来…

蓝队面经(一)

蓝队面经(一) 文章目录 蓝队面经(一)入侵排查思路windows入侵排查思路Linux入侵排查思路 Linux 如何查看登录日志Windows 和 Linux 的日志文件放在哪里?WindowsLinux Linux 常用排查命令有哪些?Linux 的 Selinux 是什么?如何设置 Selinux&…

第十二章:预处理命令

文章目录 第十二章:预处理命令宏定义无参宏定义带参数的宏定义 文件包含处理 第十二章:预处理命令 作用:由编译预处理程序对程序中的特殊命令作出解释,以产生新的源程序对其进行正式编译 C语言与其他语言的重要区别就是可以使用预…

前端bugs

问题: Failed to load plugin typescript-eslint declared in package.json eslint-config-react-app#overrides[0]: Cannot find module eslint/package.json 解决: google了一晚上还得是chatgpt管用 运行以下命令【同时还要注意项目本身使用的Node版…

Windows 远程访问 Ubuntu Desktop - 虚拟网络控制台 (Virtual Network Console,VNC)

Windows 远程访问 Ubuntu Desktop - 虚拟网络控制台 [Virtual Network Console,VNC] References 1. Desktop Sharing 2. Desktop Sharing Preferences 勾选 允许其他人查看您的桌面 勾选 要求远程用户输入此密码 取消勾选 必须为对本机器的每次访问进行确定 3. 虚拟…

【QT学习】1.qt初识,创建qt工程,使用按钮,第一个交互按钮

1.初识qt--》qt是个框架,不是语言 1.学习路径 一 QT简介 ,QTCreator ,QT工程 ,QT的第一个程序,类,组件 二 信号与槽 三 对话框 四 QT Desiner 控件 布局 样式 五 事件 六 GUI绘图 七 文件 八 …

js的一些底层

数据类型 按照存储方式,JavaScript的数据类型可以分为两种,原始数据类型(原始值)和引用数据类型(引用值)。 原始数据类型目前有六种,包括Number、String、Boolean、Null、Undefined、Symb…

若依ruoyi-vue实现excel导入导出

文章目录 Excel注解excel数据导入前端实现后端实现 下载模板前端实现后端实现 excel数据导出前端实现后端实现 自定义标题信息导出用户管理表格新增标题(用户列表)导入表格包含标题处理方式 自定义数据处理器自定义隐藏属性列导入对象的子对象导出对象的…