xmemdma64 内核服务

用途

为直接存储器存取 (DMA) I/O 准备一个页面,或在 DMA I/O 完成后处理一个页面。

语法

#include <sys/types.h>
#include <sys/errno.h>
#include <sys/xmem.h>
unsigned long long xmemdma64 (
struct xmem *dp,
caddr_t xaddr,>
int flags)

参数

描述
dp 指定一个跨内存描述符。    
Xaddr 标识指定用于传输的页面的地址。
标志 指定是为 DMA I/O 准备页面还是在 DMA I/O 完成后对其进行处理。 可能的值为:
XMEM_HIDE
为 DMA I/O 准备页面。 如果高速缓存不一致,那么会清空数据高速缓存,隐藏内存页面,然后返回实际页面地址。 如果高速缓存一致,那么将设置修改后的位,并返回页面的实际地址。
XMEM_UNHIDE
在 DMA I/O 后处理页面。 此外,此标志还会显示页面,准备页面上的任何等待进程,并相应地设置修改后的位。
XMEM_ACC_CHK
在页面上执行访问权检查。 如果设置了此标志,那么将验证页面保护属性。
仅限 XMEM_WRITE_ONLY
将预期传输标记为仅出站。 此标志与 XMEM_ACC_CHK 配合使用以指示对页面的只读访问权已足够。

描述

xmemdma64 内核服务在由跨内存描述符指定的区域中的 Xaddr 参数指定的页面上运行。 如果跨内存描述符是针对内核的,那么 Xaddr 参数指定内核地址。 否则, Xaddr 参数将指定跨内存描述符中描述的区域中的偏移量。

对于具有处理器内存高速缓存但未通过高速缓存执行 DMA I/O 的机器,提供了 xmemdma64 内核服务。

如果 参数指示 XMEM_HIDE (即,未设置 XMEM_UNHIDE ) ,并且它是页面的第一个隐藏项,那么 xmemdma64 内核服务会通过清空高速缓存并使该页面无效来为 DMA I/O 准备该页面。 如果设置了 XMEM_UNHIDE 位,并且它是页面的最后一个取消隐藏项,那么将发生以下事件:

  1. 该页面已生效。

    如果页面未处于寻呼机 I/O 状态:

  2. 任何正在页面上等待的进程都已准备就绪。
  3. 除非页面具有只读存储键,否则将设置页面的已修改位。

该页面在 DMA 操作期间无效,因此无法使用任何虚拟地址对其进行寻址。 它阻止任何进程在 DMA 操作期间将页面的任何部分读取或装入到高速缓存中。

指定的页面必须位于内存中,并且必须置顶。

如果设置了 XMEM_ACC_CHK 位,那么 xmemdma64 内核服务还会验证对该页面的访问许可权。 如果页访问权是只读的,那么必须在 参数中设置 仅限 XMEM_WRITE_ONLY 位。

注: xmemdma64 内核服务不会隐藏或显示页面,也不会执行任何高速缓存刷新操作。 该服务的主要功能是进行真实地址转换。

执行环境

可以从 流程中断 环境中调用 xmemdma64 内核服务。

返回值

成功完成后, xmemdma64 服务会返回对应于 Xaddr西普 参数的真实地址。

错误代码

如果下列其中一项为 true ,那么 xmemdma64 内核服务将返回值 XMEM_FAIL :

  • 该描述符无效。
  • Xaddr西普 参数指定的页面无效。
  • 不允许对页面进行访问。