编写适用于 Oracle® Solaris 11.2 的设备驱动程序

退出打印视图

更新时间: 2014 年 9 月
 
 

上下文管理模型

帧缓存器可作为设备上下文管理的一个很好的示例。使用加速的帧缓存器,用户进程可以通过内存映射访问直接处理设备的控制寄存器。由于这些进程不使用传统的系统调用,因此访问设备的进程无需调用设备驱动程序。但是,如果进程要访问设备,则必须通知设备驱动程序。驱动程序需要恢复正确的设备上下文并且提供所需的任何同步。

要解决这一问题,可以使用设备上下文管理接口,在用户进程访问设备的内存映射区域时通知设备驱动程序,并控制对设备硬件的访问。设备驱动程序负责同步和管理各种设备上下文。用户进程访问映射时,设备驱动程序必须为该进程恢复正确的设备上下文。

每次用户进程执行以下任一操作时,都会通知设备驱动程序:

  • 访问映射

  • 复制映射

  • 释放映射

  • 创建映射

下图显示了映射到一个设备的内存中的多个用户进程。驱动程序授予了进程 B 对设备的访问权限,进程 B 不再向驱动程序通知访问情况。但是,如果进程 A 或进程 C 访问设备,仍通知驱动程序。

图 11-1  设备上下文管理

image:图中显示了三个进程 A、B 和 C,其中进程 B 拥有对设备的独占访问权限。

在将来某一时刻,进程 A 将访问设备。设备驱动程序将收到通知,并且它将阻止进程 B 将来访问该设备。然后,驱动程序保存进程 B 的设备上下文。驱动程序恢复进程 A 的设备上下文。然后,驱动程序将向进程 A 授予访问权限,如下图所示。此时,如果进程 B 或进程 C 访问设备,则会通知设备驱动程序。

图 11-2  切换到用户进程 A 的设备上下文

image:该图继续说明上图中的示例,其中独占的设备访问权限已切换给进程 A。

在多处理器计算机中,多个进程可能会尝试同时访问设备。此情况会引起抖动。有些设备需要较长的时间才能恢复设备上下文。要防止恢复设备上下文所需的 CPU 时间超过实际使用该设备上下文所需的时间,可以使用 devmap_set_ctx_timeout(9F) 设置进程访问设备所需的最短时间。

内核可以保证一旦设备驱动程序向某一进程授予了访问权限,便不允许其他任何进程在 devmap_set_ctx_timeout(9F) 指定的时间间隔内请求访问同一设备。