本节介绍设备上下文和上下文管理模型。
设备的上下文是指设备硬件的当前状态。设备驱动程序可代表进程管理该进程的设备上下文。驱动程序必须分别为访问设备的每个进程保留单独的设备上下文。设备驱动程序负责在进程访问设备时恢复正确的设备上下文。
帧缓存器可作为设备上下文管理的一个很好的示例。使用加速的帧缓存器,用户进程可以通过内存映射访问直接处理设备的控制寄存器。由于这些进程不使用传统的系统调用,因此访问设备的进程无需调用设备驱动程序。但是,如果进程要访问设备,则必须通知设备驱动程序。驱动程序需要恢复正确的设备上下文并且提供所需的任何同步。
要解决这一问题,可以使用设备上下文管理接口,在用户进程访问设备的内存映射区域时通知设备驱动程序,并控制对设备硬件的访问。设备驱动程序负责同步和管理各种设备上下文。用户进程访问映射时,设备驱动程序必须为该进程恢复正确的设备上下文。
每次用户进程执行以下任一操作时,都会通知设备驱动程序:
下图显示了映射到一个设备的内存中的多个用户进程。驱动程序授予了进程 B 对设备的访问权限,进程 B 不再向驱动程序通知访问情况。但是,如果进程 A 或进程 C 访问设备,仍会通知驱动程序。
在将来某一时刻,进程 A 将访问设备。设备驱动程序会得到通知,并阻止进程 B 将来对该设备的访问。然后,驱动程序会为进程 B 保存设备上下文。驱动程序恢复进程 A 的设备上下文,然后授予进程 A 访问权限,如下图所示。此时,如果进程 B 或进程 C 访问设备,则会通知设备驱动程序。
在多处理器计算机中,多个进程可能会尝试同时访问设备。此情况会引起抖动。有些设备需要较长的时间才能恢复设备上下文。要防止恢复设备上下文所需的 CPU 时间超过实际使用该设备上下文所需的时间,可以使用 devmap_set_ctx_timeout(9F) 设置进程访问设备所需的最短时间。
内核可以保证一旦设备驱动程序向某一进程授予了访问权限,便不允许其他任何进程在 devmap_set_ctx_timeout(9F) 指定的时间间隔内请求访问同一设备。