Solaris10的设备和设备驱动管理

时间:2022-10-21 11:38:19

Solaris10的设备和设备驱动管理

摘要:通过对Solaris基本的驱动规格的研究,介绍了Solaris下的设备驱动器和设备配置,比较了Solaris 10和linux2.6环境下设备驱动配置的异同。文章涉及的大部分内容可以在早期的版本中使用。

关键词:设备;设备驱动;Sun Solaris 10;Linux

中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)36-2801-04

Introduction to Solaris10 Drivers

ZHANG Le

(College of software Engineering, Southeast University, Nanjing 210036, China)

Abstract: This article explains basic driver programming inside Solaris 10. It introduces device drivers and devices and compares Solaris 10 and Linux in general. Most of the article should hold for earlier releases of either system.

Key words: devices; device drivers; Sun Solaris 10; Linux

1 引言

Solaris 10是一款多任务处理的分布式企业网络系统,最初运行在SUN公司的SPARC系列芯片之上。最多4万台 Solaris 10网络操作系统组合成的企业网络计算环境可以集中用一台工作站来进行统一管理,Solaris操作系统一直以稳定和强健的特性在Unix多路计算机处理 领域占有重要的地位。Solaris使用Motif图形用户接口以及NFS、NIS、ZFS等网络文件系统,目前版本的Solaris 10也可运行在x64处理器架构的计算机上。在Solaris和Linux系统中,设备驱动的用途和目的相同,就是为系统提供一种控制和连接设备的一种手段,通常情况下,使用者连接设备是通过标准的I/O 命令进行系统调用:比如 open,close,这些系统命令调用了设备驱动程序。另外,操作系统也会自动调用相关的程序去处理错误和连接那些可能存在于系统中的不同的总线结构。此外许多系统管理相关的命令也可能调用设备驱动程序。因此掌握Solaris的设备和设备驱动管理是在Solaris系统下编程必不可少的过程。

2 系统结构和设备树

Solaris使用设备树来表示它的设备。每一个设备树上的节点表示一个设备。设备树显示了设备在系统的物理位置。使用者和程序能够通/devices和prtconf命令显示设备驱动。下面就是一些例子。

bash-2.05b# ls -R /devices

/devices:

isa pci@0,0 pseudo:devctl xsvc

objmgr pci@0,0:devctl scsi_vhci xsvc:xsvc

options pseudo scsi_vhci:devctl

/devices/isa:

asy@1,2f8 asy@1,2f8:b,cu i8042@1,60lp@1,3bc:ecpp0

asy@1,2f8:b fdc@1,3f0 lp@1,3bc

/devices/isa/fdc@1,3f0:

fd@0,0 fd@0,0:a,raw fd@0,0:b,raw fd@0,0:c,raw

fd@0,0:a fd@0,0:b fd@0,0:c

/devices/isa/i8042@1,60:

keyboard@0 keyboard@0:kb8042mouse@1mouse@1:l

/devices/pci@0,0:

pci-ide@7,1 pci8086,7112@7,2 pci8086,7112@7,2:hubd

pci1014,130@2 pci8086,7112@7,2:1 pci8086,7191@1

pci1014,130@2,1 pci8086,7112@7,2:2 pci8086,7191@1:devctl

/devices/pci@0,0/pci-ide@7,1:

ide@0ide@0:controlide@1ide@1:control

/devices/pci@0,0/pci-ide@7,1/ide@0:

cmdk@0,0 cmdk@0,0:e cmdk@0,0:i,raw cmdk@0,0:n cmdk@0,0:r,raw

cmdk@0,0:a cmdk@0,0:e,raw cmdk@0,0:j cmdk@0,0:n,raw cmdk@0,0:s

cmdk@0,0:a,raw cmdk@0,0:f cmdk@0,0:j,rawcmdk@0,0:o cmdk@0,0:s,raw

cmdk@0,0:b cmdk@0,0:f,raw cmdk@0,0:k cmdk@0,0:o,raw cmdk@0,0:t

cmdk@0,0:b,raw cmdk@0,0:g cmdk@0,0:k,raw cmdk@0,0:p cmdk@0,0:t,raw

cmdk@0,0:c cmdk@0,0:g,raw cmdk@0,0:l cmdk@0,0:p,raw cmdk@0,0:u

cmdk@0,0:c,raw cmdk@0,0:h cmdk@0,0:l,raw cmdk@0,0:q cmdk@0,0:u,raw

cmdk@0,0:d cmdk@0,0:h,raw cmdk@0,0:m cmdk@0,0:q,raw

cmdk@0,0:d,raw cmdk@0,0:i cmdk@0,0:m,raw cmdk@0,0:r

/devices/pci@0,0/pci-ide@7,1/ide@1:

sd@0,0 sd@0,0:e sd@0,0:i,raw sd@0,0:n sd@0,0:r,raw

sd@0,0:a sd@0,0:e,raw sd@0,0:j sd@0,0:n,raw sd@0,0:s

sd@0,0:a,raw sd@0,0:f sd@0,0:j,raw sd@0,0:o sd@0,0:s,raw

sd@0,0:b sd@0,0:f,raw sd@0,0:k sd@0,0:o,raw sd@0,0:t

sd@0,0:b,raw sd@0,0:g sd@0,0:k,raw sd@0,0:p sd@0,0:t,raw

sd@0,0:c sd@0,0:g,raw sd@0,0:l sd@0,0:p,raw sd@0,0:u

sd@0,0:c,raw sd@0,0:h sd@0,0:l,raw sd@0,0:q sd@0,0:u,raw

sd@0,0:d sd@0,0:h,raw sd@0,0:m sd@0,0:q,raw

sd@0,0:d,raw sd@0,0:i sd@0,0:m,raw sd@0,0:r

/devices/pseudo:

arp@0 pm@0 ptsl@0:ttyp4

arp@0:arp pm@0:pm ptsl@0:ttyp5

bl@0 poll@0 ptsl@0:ttyp6

bash-2.05b#

在上面的例子中列出的就是设备的名字,比如 /devices/pci@0,0/pci-ide@7,1表示了这是一个系统总线的(或者是主板的)PCI控制器,并且PCI总线是在一个PCI-IDE桥结构中。设备在的设备树上名字有2部分组成,@之前的部分表示设备的名字,@之后到‘:’的部分表示接口编号和设备在总线的位置。而设备驱动的名称在‘:’之后。Linux不管设备的位置和硬件都使用相同的名字表示。比如Linux不管硬盘是IDE还是SCSI接口都表示为/dev/hda,/dev/hdb,等等。Solaris以3种不同的方式表示物理和逻辑设备:物理设备名称,物理设备文件和逻辑设备文件。物理设备名称很容易识别,因为他们是一组很长的字符串,提供了与设备的物理安装相关的所有细节。而位于/dev目录下的物理设备文件是用物理设备名字的缩写得到的实例名,这个名字可以给内核解释。实例名到物理设备的映射关系不是固定的,在/etc/path_to_inst文件中总是会包含着他们之间的对应细节。实际上的设备驱动的文件存储在/devices目录之下。

值得注意的是:无论是LINUX还是Solaris 10 都使用了名为devfs的设备文件系统来管理设备。这意味着设备驱动自身就可以创建和删除节点。在Solaris中,驱动通过调用在attach(9f) h和detach(9f)设备驱动文件夹中的ddi_create-minor(9f)和ddi_remove_minor_node(9f)指令来完成创建和删除。与之相对应的在Linux初始命令中的devfs_mk_dir(),devfs_mk_cdev(),和devfs_mk_bdev()和清除命令中的devfs_remove()可以完成对节点的创建和删除。虽然Linux没有使用到devfs,但是它通过调用在驱动中的或在register_chrdev()中mknod()方法,或者其他相关的程序,或者手动创建了设备文件。在Solaris10之前的Solaris没有devfs,所以它的驱动通过使用ddi_create_minor_node(9f)来创建和删除节点,无论是硬盘驱动还是网络驱动。

这是一个例子:

bash-2.05b# prtconf

System Configuration:Sun Microsystemsi86pc

Memory size: 512 Megabytes

System Peripherals (Software Nodes):

i86pc

scsi_vhci, instance #0

+boot (driver not attached)

memory (driver not attached)

aliases (driver not attached)

chosen (driver not attached)

i86pc-memory (driver not attached)

i86pc-mmu (driver not attached)

openprom (driver not attached)

options, instance #0

packages (driver not attached)

delayed-writes (driver not attached)

itu-props (driver not attached)

isa, instance #0

motherboard (driver not attached)

i8042, instance #0

mouse, instance #0

keyboard, instance #0

fdc, instance #0

fd, instance #0

lp, instance #0

asy, instance #0

pci, instance #0

pci8086,7190 (driver not attached)

pci8086,7191, instance #0

display, instance #0

pci1014,130, instance #0

pci1014,130, instance #1

pci10b7,6356 (driver not attached)

pci10b7,6159 (driver not attached)

pci1014,153 (driver not attached)

pci8086,7110 (driver not attached)

pci-ide, instance #0

ide, instance #0

cmdk, instance #0

ide, instance #1

sd, instance #0

pci8086,7112, instance #0

pci8086,7113 (driver not attached)

used-resources (driver not attached)

pseudo, instance #0

xsvc, instance #0

objmgr, instance #0

cpus (driver not attached)

cpu, instance #0 (driver not attached)

bash-2.05b#

“driver not attached” (“驱动未联接”表示)没有驱动,即该设备未被使用并且并且驱动没有载入。或者硬件已经给配置好了但是物理上不存在。可使用prtconf -D 去为已存在的设备寻找合适的驱动。

Solaris对设备和总线分别驱动,以扩展传统的设备驱动程序管理的功能:一个设备驱动控制一个设备的硬件,一个总线连接驱动程序在两类不同的总线中控制和转换数据。那些设备可能附属有其他的设备(通常通过一个总线)使用连接驱动程序连接。举例说包括总线控制器,象PCI-Host总线桥,PCI-PCI桥等等。叶节点驱动主要是给没有额外的附加设备的设备准备的。包括虚拟设备,网络设备,显示卡和存储设备等等。大部分的系统中的设备都是叶节点设备。

叶节点设备驱动支持字符设备和块设备。比如说块设备是一些可寻址的可复用的数据硬盘。其他的一些设备能够以字符设备的形式执行。硬盘驱动既是字符设备也是块设备。一些关联的设备有一个字符设备可以像关联驱动一样执行。

3 设备和驱动类型

许多总线驱动允许ioctl(2)使用基础的叶节点驱动结构和整个程序。SCSI主机总线适配器(一个在系统中负责转换许多总线的设备,比如PCI等等)和一个SCSI是一个关联节点的格式,它们被开发用来处理SCSI HBA的问题,叫做SCSA(SUN 通用SCSI结构)下面来简单的描述一下不同类型的设备和设备驱动结构是如何支持不同类型的设备。

3.1 总线适配器(SCSI,IDE等等)

网络驱动SCSA(SUN 通用SCSI结构)使得开发者不需要知道HBA控制器的是如何管理SCSI的就可以进行驱动的开发(比如硬盘,磁带机,扫描仪,等等)。同样的HBA驱动也不需要知道目标设备在SCSI总线的情况。

下面是一个关于SCSA自适应目标和HBa驱动共同工作的例子。所有的工作从SCSA的CSSI_部分开始执行。注意:这里不是一个完整的过程。

User reads/writes a file;

foo_strategy(struct buf *bp)/* target driver strategy routine */

scsi_init_pkt(...);/* calls hba to alloc and init a SCSI packet */

/* see scsi_init_pkt(9F) and scsi_pkt(9s) */

makecom_g5(...);/* build the scsi command descriptor block, see makecom(9f) */

place completion callback routine pointer into scsi_pkt;

scsi_transport(...);/* hand over built scsi packet to HBA for transport on the bus */

bar_tran_start(...)/* hba routine to handle scsi pkts */

send command to target on SCSI bus via HBA;

bar_intr(...)/* interrupt handler following completion/timeout */

clean up;

call target callback function via scsi_pkt;

foo_completion(...)/* target callback function */

biodone(bp);/* wakeup waiting readers/writers */

scsi_free_pkt(...);

3.2 网络驱动

SOLARIS使用流消息在不同的网络协议栈部分中转递数据包。值得注意的是SOLARIS10已重写了TCP/IP以至于TCP和IP已不是分开的流模块。这样做的目的主要是因为性能的原因。参看FIReengine在SOLARIS的描述得到更多的细节。

在SOLARIS中,一个网络驱动必须能认知流形式并且符合DLPI规格表。DLPI(数据连接提供者接口)是一个流数据连接的规格(网络控制器)驱动。因为流和DLPI添加了许多复杂的功能用于写一个网络驱动。SUN公司开发了通用局域网驱动用来屏蔽DLPI和大部分来自于网络驱动的流。

3.3 USB驱动

SOLARIS使用了一个类似于LINUX的方式来支持USB驱动。

4 编译和安装

我们可以使用SUN公司的编译器编译。步骤如下:

# cc -xarch=v9 -D_KERNEL -O -c foo.c

# cc -xarch=v9 -D_KERNEL -O -c bar.c

# ld -r -o foobar foo.o bar.o

在安装驱动的时候,拷贝可重定位的模块到相关的目录下面(通常是 /usr/kernel/drv, /kernel/drv, or /kernel/`uname -m`/kernel/drv。在SPARC中,驱动在SPARCV9的子目录中。如果你的驱动有DRIVE.CONF文件,则驱动文件在DRV目录下面。拷贝结束以后,使用命令DEVFSADM(1M)或者ADD_DEV(1M)配置驱动)。

# cp foobar /usr/kernel/drv/sparcv9/foobar

# cp foobar.conf /usr/kernel/drv/foobar.conf

#

# add_drv foobar

#

#

安装完驱动之后,你可以在设备树中找到设备文件。

5 调试

SOLARIS系统中有四种基本的调试工具:

MDB:模块调试器。它为调试程序提供了一个完整的可定制的环境,其中包括一个动态模块工具程序员可以使用它来实现自己的调试命令,从而完成对特定的程序的分析。每个MDB程序可以在在运行中或者故障后不同的上下文中检查程序。这一套内置的MDB模块可以帮助程序员调试Solaris内核和相关的设备驱动和内核模块。

KMDB:运行时的内核调试器。它允许你在运行的系统的内核中设置中断点断点并设置单步运行。它可以调试运行中的内核和内核系统崩溃转储。它也可以控制和调试运行中的用户进程和用户的核心转储。kmdb扩展了调试器的功能,增加了对内核执行指令的控制。而mdb只能观看内核的运行。我们可以在控制台的命令行上用mdb的-k选项启动kmdb。当我们遇到solris启动时的挂起或者是系统崩溃时 就可以使用内核调试器来收集问题的资料。我们可以在启动时使用-k选项来调用内核调试器。但是它不是"安全"的,因为在kmdb工作的时候,它完全控制了系统,当它追踪时系统完全暂停了。它做微观分析,允许用户观察每条指令的执行,允许用户观察和改变处理器的状态。

DTRACE:动态追踪工具。它被设计在较高的层面上追踪它在函数层面工作,从而对运行中的系统的影响最小的。

CMN_ERR(9F):和Linux的printk()相似的输出功能。

6 总结

通过本文我们了解了SOLARIS是如何管理驱动,并且对使用相应的Solaris的服务器自带的工具包去编译和调试驱动有了认识,同时也比较了linux和Soalris在设备和设备驱动管理上的区别。这将在Solaris系统下编程有很大帮助。

参考文献:

[1] McDougall R,Mauro J.Solaris Internals[M].Beijing:China Machine Press,2007.

[2] McDougall R,Mauro J,Gregg B.Solaris性能与工具[M].北京:机械工业出版社,2007.

[3] Winsor J.Solaris参考手册[M].北京:人民邮电出版社,2000.

[4] Corbet J,Rubini A,Kroah-Hartman G.Linux device drivers[M].南京:东南大学出版社,2005.

上一篇:并行计算在舰船设计中的应用及展望 下一篇:高职院校《Photoshop》课程项目化教学的研究与...