io_map_init 内核服务

用途

创建并初始化 I/O 映射段。

语法

#include <sys/adspace.h>
#include <sys/vm_types.h>

io_handle_t io_map_init (io_map_ptr, page_offset, io_handle)
struct io_map *io_map_ptr;
vpn_t page_offset;
io_handle_t io_handle;

struct io_map {
        int key;                         /* structure version number */
        int flags;                       /* flags for mapping */
        int32long64_t size;             /* size of address space needed */
        int bid;                         /* bus ID */
        long long busaddr;              /* bus address */
};

描述

io_map_init 内核服务将创建一个段,以针对由 io_map 结构的内容定义的总线地址区域建立禁止高速缓存的虚拟到实际转换。 可以使用 io_map 结构的 标志 参数来定制映射,例如,使用 仅 IOM_RDONLY 标志使该区域成为只读。

io_map_init 内核服务返回不透明类型为 io_handle_t 的句柄,以便在将来 io_mapio_unmap 调用时使用。 所有使用 io_map_init 返回的 io_handle 的服务都必须使用最新调用中的句柄。 使用旧句柄是一个编程错误。

vpn_t 类型参数表示虚拟页号偏移量,以允许调用者在虚拟段中指定映射此区域的位置。 偏移量不得与段中的前一个映射冲突。 调用者应该将访问频率最高 0 性能最关键的 I/O 区域 vpn_t offset 0 映射到段中。 这是因为使用此 io_handle 的后续 io_map 调用将返回表示段开头的有效地址 (即,页面偏移量 0)。 设备驱动程序负责管理细分市场中的各种偏移量。 可以在段中的不同 vpn_t 偏移量处多次映射单个总线内存地址页面。

当调用者要将新映射附加到现有段时, io_handle_t 参数很有用。 对于新 I/O 段的初始创建,此参数必须为空。 对于附加到同一段的映射,此参数是从上次成功的 io_map_init 调用返回的 io_handle_t 。 如果映射由于任何原因而失败 (偏移量与先前映射冲突,或者段中没有更多空间) ,那么将返回 NULL。 在此情况下,先前的 io_handle_t 仍然有效。 如果成功,那么应该在所有将来调用时使用返回的 io_handle_t 。 通过这种方式,设备驱动程序可以管理单个虚拟地址段中单个适配器的多个 I/O 地址空间,从而要求驱动程序仅执行单个连接 io_map,以获取所有映射的可寻址性。

参数

描述
io_map_ptr 指向描述要映射的地址区域的 io_map 结构的指针。
页面偏移 用于将指定区域映射到虚拟地址段的页面偏移量。
io_handle 对于第一个调用,此参数应该为 NULL。 添加到现有映射时,此参数是在先前成功调用 io_map_init时接收到的 io_handle

执行环境

io_map_init 内核服务只能从进程环境中进行调用。

返回值

描述
io_handle_t 虚拟内存中映射的 I/O 段的不透明句柄,必须在后续调用此服务时使用此句柄。
NULL 未能创建或追加映射。