JavaScript is required to for searching.
跳过导航链接
退出打印视图
编写设备驱动程序     Oracle Solaris 10 1/13 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分针对 Oracle Solaris 平台设计设备驱动程序

1.  Oracle Solaris 设备驱动程序概述

2.  Oracle Solaris 内核和设备树

3.  多线程

4.  属性

5.  管理事件和排队任务

6.  驱动程序自动配置

7.  设备访问:程控 I/O

8.  中断处理程序

9.  直接内存访问 (Direct Memory Access, DMA)

10.  映射设备和内核内存

11.  设备上下文管理

设备上下文简介

什么是设备上下文?

上下文管理模型

上下文管理操作

devmap_callback_ctl 结构

用于设备上下文管理的入口点

devmap_map() 入口点

devmap_access() 入口点

devmap_contextmgt() 入口点

devmap_dup() 入口点

devmap_unmap() 入口点

将用户映射与驱动程序通知关联

管理映射访问

devmap_load() 入口点

devmap_unload() 入口点

12.  电源管理

13.  强化 Oracle Solaris 驱动程序

14.  分层驱动程序接口 (Layered Driver Interface, LDI)

第 2 部分设计特定种类的设备驱动程序

15.  字符设备驱动程序

16.  块设备驱动程序

17.  SCSI 目标驱动程序

18.  SCSI 主机总线适配器驱动程序

19.  网络设备驱动程序

20.  USB 驱动程序

21.  SR-IOV 驱动程序

第 3 部分生成设备驱动程序

22.  编译、装入、打包和测试驱动程序

23.  调试、测试和调优设备驱动程序

24.  推荐的编码方法

第 4 部分附录

A.  硬件概述

B.  Solaris DDI/DKI 服务汇总

C.  使设备驱动程序支持 64 位

D.  控制台帧缓存器驱动程序

E.  pci.conf 文件

索引

设备上下文简介

本节介绍设备上下文和上下文管理模型。

什么是设备上下文?

设备的上下文是指设备硬件的当前状态。设备驱动程序可代表进程管理该进程的设备上下文。驱动程序必须分别为访问设备的每个进程保留单独的设备上下文。设备驱动程序负责在进程访问设备时恢复正确的设备上下文。

上下文管理模型

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

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

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

下图显示了映射到一个设备的内存中的多个用户进程。驱动程序授予了进程 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) 指定的时间间隔内请求访问同一设备。