编写设备驱动程序

管理映射访问

用户进程访问没有有效的映射转换的内存映射区域中的地址时,将会通知设备驱动程序。访问事件发生时,必须使当前对设备具有访问权限的进程的映射转换无效。必须恢复请求访问设备的进程的设备上下文。并且,必须对请求访问的进程的映射转换进行验证。

函数 devmap_load(9F)devmap_unload(9F) 用于验证映射转换和使其无效。

devmap_load() 入口点

devmap_load(9F) 的语法如下所示:

int devmap_load(devmap_cookie_t handle, offset_t offset,
    size_t len, uint_t type, uint_t rw);

devmap_load() 可以验证对于 handleoffsetlen 指定的映射页的映射转换。通过验证对这些页的映射转换,驱动程序将告知系统不要拦截对这些映射页的访问。并且,系统不得在未通知设备驱动程序的情况下允许继续进行访问。

必须通过映射的偏移和句柄调用 devmap_load(),该映射可生成访问事件以便完成访问。如果不针对此句柄调用 devmap_load(9F),则不会验证映射转换,并且进程将收到 SIGBUS

devmap_unload() 入口点

devmap_unload(9F) 的语法如下所示:

    int devmap_unload(devmap_cookie_t handle, offset_t offset,
     size_t len);

devmap_unload() 可使对 handleoffsetlen 指定的映射页的映射转换无效。通过使对这些页的映射转换无效,设备驱动程序将告知系统拦截对这些映射页的访问。并且,下次通过调用 devmap_access(9E) 入口点访问这些映射页时,系统必须通知设备驱动程序。

对于这两个函数而言,请求会影响包含 offset 的整页,直到包含由 offset + len 所表示的最后一个字节的整页(包含该页)。设备驱动程序必须确保对于所映射的每页设备内存而言,在任意时刻仅有一个进程具有有效转换。

如果成功,两个函数都将返回零。但是,如果在对映射转换进行验证或使其无效时出现错误,则该错误将返回给设备驱动程序。设备驱动程序必须将此错误返回给系统。