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.  设备上下文管理

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.  调试、测试和调优设备驱动程序

测试驱动程序

启用 Deadman 功能以避免硬挂起

使用串行连接进行测试

针对 tip 连接设置主机系统

在 SPARC 平台上设置目标系统

在 x86 平台上设置目标系统

设置测试模块

设置内核变量

装入和卸载测试模块

设置 kmem_flags 调试标志

避免测试系统中发生数据丢失

备份关键系统文件

使用替代内核进行引导

考虑替代备份计划

捕获系统故障转储

恢复设备目录

调试工具

事后调试

使用 kmdb 内核调试器

在 SPARC 平台上使用替代内核引导 kmdb

在 x86 平台上使用替代内核引导 kmdb

在 kmdb 中设置断点

为驱动程序开发者提供的 kmdb 宏

使用 mdb 模块调试器

模块调试器入门

使用 kmdb 和 mdb 执行的有用调试任务

使用 kmdb 查找系统寄存器

检测内核内存泄漏

使用 mdb 编写调试器命令

获取内核数据结构信息

获取设备树信息

检索驱动程序软状态信息

修改内核变量

调优驱动程序

内核统计信息

内核统计信息结构成员

内核统计信息结构

内核统计信息函数

Oracle Solaris 以太网驱动程序的内核统计信息

用于动态检测过程的 DTrace

24.  推荐的编码方法

第 4 部分附录

A.  硬件概述

B.  Solaris DDI/DKI 服务汇总

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

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

E.  pci.conf 文件

索引

调优驱动程序

Oracle Solaris OS 提供了内核统计信息结构,以便针对驱动程序实现计数器。使用 DTrace 功能可以实时分析性能。本节介绍有关设备性能的以下主题:

内核统计信息

为了协助进行性能调优,Oracle Solaris 内核提供了 kstat(3KSTAT) 功能。kstat 功能提供了一套函数和数据结构,以供设备驱动程序和其他内核模块导出特定于模块的内核统计信息。

kstat 是用于记录设备使用情况的可计量方面的数据结构。kstat 存储为以 null 终止的链接列表。每个 kstat 都有一个通用的头区和一个特定于类型的数据区。头区由 kstat_t 结构定义。

内核统计信息结构成员

kstat 结构的成员包括:

ks_class[KSTAT_STRLEN]

kstat 类型分类为 bus、controller、device_error、disk、hat、kmem_cache、 kstat、misc、net、nfs、pages、partition、 rps、ufs、vm 或 vmem。

ks_crtime

kstat 的创建时间。ks_crtime 通常用于计算各个计数器的速率。

ks_data

指向 kstat 的数据区。

ks_data_size

数据区大小总额(以字节为单位)。

ks_instance

创建此 kstat 的内核模块的实例。ks_instance 与 ks_module 和 ks_name 结合使用,以便为 kstat 指定唯一且有意义的名称。

ks_kid

kstat 的唯一 ID。

ks_module[KSTAT_STRLEN]

标识创建此 kstat 的内核模块。ks_module 与 ks_instance 和 ks_name 结合使用,以便为 kstat 指定唯一且有意义的名称。KSTAT_STRLEN 可设置 ks_module 的最大长度。

ks_name[KSTAT_STRLEN]

为 kstat 指定的名称,与 ks_module 和 ks_instance 结合使用。KSTAT_STRLEN 可设置 ks_module 的最大长度。

ks_ndata

为以下可支持多个记录的 kstat 类型指示数据记录的个数:KSTAT_TYPE_RAW、KSTAT_TYPE_NAMED 和 KSTAT_TYPE_TIMER

ks_next

指向链表中的下一个 kstat。

ks_resv

保留的字段。

ks_snaptime

上一数据快照的时间戳,在计算速率时很有用。

ks_type

数据类型,对于二进制数据可为 KSTAT_TYPE_RAW,对于名称/值对可为 KSTAT_TYPE_NAMED,对于中断统计信息可为 KSTAT_TYPE_INTR,对于 I/O 统计信息可为 KSTAT_TYPE_IO,对于事件计时器可为 KSTAT_TYPE_TIMER。

内核统计信息结构

不同种类的 kstat 的结构如下:

kstat(9S)

由设备驱动程序导出的每条内核统计信息 (kstat) 都由头区和数据区构成。kstat(9S) 结构是统计信息的头部分。

kstat_intr(9S)

中断 kstat 的结构。中断类型包括:

  • 硬中断-源自硬件设备自身

  • 软中断-因系统使用某些系统中断源而引起

  • 监视程序中断-由定期计时器调用引起

  • 虚假中断-输入了中断入口点,但没有需要提供服务的中断

  • 多个服务-在从任何其他类型返回之前检测到中断并提供了服务

驱动程序通常只报告从其处理程序中声明的硬中断和软中断,但度量虚假类中断对自动向量化的设备很有用,以便查找特定系统配置中的任何中断延迟信息。具有多个相同类型中断的设备应使用多个结构。

kstat_io(9S)

I/O kstat 的结构。

kstat_named(9S)

命名的 kstat 的结构。命名的 kstat 是名称-值对数组。这些对位于 kstat_named 结构中。

内核统计信息函数

用于使用 kstat 的函数包括:

kstat_create(9F)

分配和初始化 kstat(9S) 结构。

kstat_delete(9F)

从系统中移除 kstat。

kstat_install(9F)

向系统中添加完全初始化的 kstat。

kstat_named_init(9F)、kstat_named_setstr(9F)

初始化已命名的 kstat。kstat_named_setstr() 将 str(一个字符串)与已命名的 kstat 指针相关联。

kstat_queue(9F)

许多 I/O 子系统都至少有两个基本的事务队列要管理。一个队列用于已接受但尚未开始处理的事务。另一个队列用于正在进行处理但尚未处理完的事务。因此,保留了两个累积时间统计量:等待时间和运行时间。等待时间是提供服务之前的时间。运行时间是提供服务期间的时间。kstat_queue() 函数系列可根据驱动程序等待队列和运行队列之间的转换来管理这些时间:

Oracle Solaris 以太网驱动程序的内核统计信息

下表中介绍的 kstat 接口是从驱动程序中获取以太网物理层统计信息的有效方法。以太网驱动程序应导出这些统计信息,以指导用户更好地诊断和修复以太网物理层问题。除 link_up 之外,所有统计信息在未提供时的缺省值均为 0。应将 link_up 统计信息的值假定为 1。

以下示例给出了所有共享的链路设置。在这种情况下,可使用 mii 来过滤统计信息。

kstat ce:0:mii:link_*

表 23-2 以太网 MII/GMII 物理层接口内核统计信息

Kstat 变量
类型
说明
xcvr_addr
KSTAT_DATA_UINT32
提供当前正在使用的收发器的 MII 地址。
  • (0) - (31) 用于给定以太网设备的物理层设备的 MII 地址。

  • 在没有可从外部访问的 MII 接口,因此 MII 地址不明确或不相关的情况下,使用 (-1)。

xcvr_id
KSTAT_DATA_UINT32
提供当前正在使用的收发器的特定供应商 ID 或设备 ID。
xcvr_inuse
KSTAT_DATA_UINT32
指示当前正在使用的收发器的类型。IEEE aPhytType 枚举以下集合:
  • (0) 其他未定义

  • (1) 不存在 MII 接口,但未连接任何收发器

  • (2) 10 Mb/s Clause 7 10 Mb/s Manchester

  • (3) 100BASE-T4 Clause 23 100 Mb/s 8B/6T

  • (4) 100BASE-X Clause 24 100 Mb/s 4B/5B

  • (5) 100BASE-T2 Clause 32 100 Mb/s PAM5X5

  • (6) 1000BASE-X Clause 36 1000 Mb/s 8B/10B

  • (7) 1000BASE-T Clause 40 1000 Mb/s 4D-PAM5

此集合比 ifMauType 指定的集合小,后者定义为包括上述所有类型及其半双工/全双工选件。由于 cap_* 统计信息可提供此信息,因此可从 xcvr_inuse 和 cap_* 的组合中派生缺少的定义,以提供 ifMayType 的所有组合。

cap_1000fdx
KSTAT_DATA_CHAR
指示设备支持 1 Gb/s 的全双工传输。
cap_1000hdx
KSTAT_DATA_CHAR
指示设备支持 1 Gb/s 的半双工传输。
cap_100fdx
KSTAT_DATA_CHAR
指示设备支持 100 Mb/s 的全双工传输。
cap_100hdx
KSTAT_DATA_CHAR
指示设备支持 100 Mb/s 的半双工传输。
cap_10fdx
KSTAT_DATA_CHAR
指示设备支持 10 Mb/s 的全双工传输。
cap_10hdx
KSTAT_DATA_CHAR
指示设备支持 10 Mb/s 的半双工传输。
cap_asmpause
KSTAT_DATA_CHAR
指示设备支持非对称暂停以太网流量控制。
cap_pause
KSTAT_DATA_CHAR
指示当 cap_pause 设置为 1,cap_asmpause 设置为 0 时,设备支持对称暂停以太网流量控制。当 cap_asmpause 设置为 1 时,cap_pause 具有以下含义:
  • cap_pause = 0 基于接收拥塞传送暂停。

  • cap_pause = 1 接收暂停并减慢传送,以避免拥塞。

cap_rem_fault
KSTAT_DATA_CHAR
指示设备支持远程故障指示。
cap_autoneg
KSTAT_DATA_CHAR
指示设备支持自动协商。
adv_cap_1000fdx
KSTAT_DATA_CHAR
指示设备正在通告支持 1 Gb/s 的全双工传输。
adv_cap_1000hdx
KSTAT_DATA_CHAR
指示设备正在通告支持 1 Gb/s 的半双工传输。
adv_cap_100fdx
KSTAT_DATA_CHAR
指示设备正在通告支持 100 Mb/s 的全双工传输。
adv_cap_100hdx
KSTAT_DATA_CHAR
指示设备正在通告支持 100 Mb/s 的半双工传输。
adv_cap_10fdx
KSTAT_DATA_CHAR
指示设备正在通告支持 10 Mb/s 的全双工传输。
adv_cap_10hdx
KSTAT_DATA_CHAR
指示设备正在通告支持 10 Mb/s 的半双工传输。
adv_cap_asmpause
KSTAT_DATA_CHAR
指示设备正在通告支持非对称暂停以太网流量控制。
adv_cap_pause
KSTAT_DATA_CHAR
指示当 adv_cap_pause 设置为 1,adv_cap_asmpause 设置为 0 时,设备正在通告支持对称暂停以太网流量控制。当 adv_cap_asmpause 设置为 1 时,adv_cap_pause 具有以下含义:
  • adv_cap_pause = 0 基于接收拥塞传送暂停。

  • adv_cap_pause = 1 接收暂停并减慢传送,以避免拥塞。

adv_rem_fault
KSTAT_DATA_CHAR
指示设备遇到故障,设备将把该故障转发给链路合作伙伴。
adv_cap_autoneg
KSTAT_DATA_CHAR
指示设备正在通告支持自动协商。
lp_cap_1000fdx
KSTAT_DATA_CHAR
指示链路合作伙伴设备支持 1 Gb/s 的全双工传输。
lp_cap_1000hdx
KSTAT_DATA_CHAR
指示链路合作伙伴设备支持 1 Gb/s 的半双工传输。
lp_cap_100fdx
KSTAT_DATA_CHAR
指示链路合作伙伴设备支持 100 Mb/s 的全双工传输。
lp_cap_100hdx
KSTAT_DATA_CHAR
指示链路合作伙伴设备支持 100 Mb/s 的半双工传输。
lp_cap_10fdx
KSTAT_DATA_CHAR
指示链路合作伙伴设备支持 10 Mb/s 的全双工传输。
lp_cap_10hdx
KSTAT_DATA_CHAR
指示链路合作伙伴设备支持 10 Mb/s 的半双工传输。
lp_cap_asmpause
KSTAT_DATA_CHAR
指示链路合作伙伴设备支持非对称暂停以太网流量控制。
lp_cap_pause
KSTAT_DATA_CHAR
指示当 lp_cap_pause 设置为 1,lp_cap_asmpause 设置为 0 时,链路合作伙伴设备支持对称暂停以太网流量控制。当 lp_cap_asmpause 设置为 1 时,lp_cap_pause 具有以下含义:
  • lp_cap_pause = 0 链路合作伙伴将基于接收拥塞传送暂停。

  • lp_cap_pause = 1 链路合作伙伴将接收暂停并减慢传送,以避免拥塞。

lp_rem_fault
KSTAT_DATA_CHAR
指示链路合作伙伴遇到链路故障。
lp_cap_autoneg
KSTAT_DATA_CHAR
指示链路合作伙伴设备支持自动协商。
link_asmpause
KSTAT_DATA_CHAR
指示链路正采用非对称暂停以太网流量控制来运行。
link_pause
KSTAT_DATA_CHAR
指示暂停功能的精度。指示当 link_pause 设置为 1,link_asmpause 设置为 0 时,链路正采用对称暂停以太网流量控制来运行。当 link_asmpause 设置为 1 且相对于链路的本地视图时,link_pause 具有以下含义:
  • link_pause = 0 此站将基于接收拥塞来传送暂停。

  • link_pause = 1 此站将接收暂停并减慢传送,以避免拥塞。

link_duplex
KSTAT_DATA_CHAR
指示链路双工模式。
  • link_duplex = 0 链路关闭,且双工模式未知。

  • link_duplex = 1 链路打开,且处于半双工模式。

  • link_duplex = 2 链路打开,且处于全双工模式。

link_up
KSTAT_DATA_CHAR
指示链路是打开还是关闭。
  • link_up = 0 链路关闭。

  • link_up = 1 链路打开。

用于动态检测过程的 DTrace

DTrace 是一种全面的动态跟踪工具,用于检查用户程序和操作系统自身的行为。通过 DTrace,可以收集环境中处于关键位置(称为探测器)的数据。通过 DTrace 可以记录栈跟踪、时间戳、函数的参数或探测器触发频率计数等数据。由于 DTrace 允许动态插入探测器,因此无需重新编译代码。有关 DTrace 的更多信息,请参见《Oracle Solaris 11.1 Dynamic Tracing Guide 》。