Solaris10的设备和设备驱动管理

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:yttgfnm
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:通過对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: <---the "root" of the device tree
  isa pci@0,0 pseudo:devctl xsvc
  objmgr pci@0,0:devctl scsi_vhci xsvc:xsvc
  options pseudo scsi_vhci:devctl
  /devices/isa: <--- the system has an isa bus
  asy@1,2f8 asy@1,2f8:b,cu i8042@1,60lp@1,3bc:ecpp0 <--- devices on the isa bus
  asy@1,2f8:b fdc@1,3f0 lp@1,3bc
  /devices/isa/fdc@1,3f0: <--- a floppy disk controller on the isa bus
  fd@0,0 fd@0,0:a,raw fd@0,0:b,raw fd@0,0:c,raw <--- floppy disk drives/slices
  fd@0,0:a fd@0,0:b fd@0,0:c
  /devices/isa/i8042@1,60: <--- an i8042 controller
  keyboard@0 keyboard@0:kb8042mouse@1mouse@1:l
  /devices/pci@0,0: <--- pci-host bus bridge
  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: <--- pci-ide bridge
  ide@0ide@0:controlide@1ide@1:control
  /devices/pci@0,0/pci-ide@7,1/ide@0: <--- 1 of 2 ide controllers
  cmdk@0,0 cmdk@0,0:e cmdk@0,0:i,raw cmdk@0,0:n cmdk@0,0:r,raw<--- disks/slices
  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: <--- second ide controller
  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: <--- pseudo device nexus node
  arp@0 pm@0 ptsl@0:ttyp4 <--- pseudo devices
  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)<--- "driver not attached" explained below
  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<--- an isa bus on the system board
  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<--- a pci bus on the system board
  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<--- pci-ide bridge
  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<-- -xarch=v9 needed for SPARC
  # cc -xarch=v9 -D_KERNEL -O -c bar.c<-- compile each .c file for your driver
  # ld -r -o foobar foo.o bar.o<-- create a relocatable object, foobar
  <-- dependencies on other kernel modules
  <-- can be specified with -Ndrv/module
  <-- for example, ld -Nmisc/scsi ...
  <-- for a scsa-compliant driver
  在安装驱动的时候,拷贝可重定位的模块到相关的目录下面(通常是 /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<-- no sparcv9 for x86
  # cp foobar.conf /usr/kernel/drv/foobar.conf
  #
  # add_drv foobar
  #<--any output here is probably an error!
  #
  安装完驱动之后,你可以在设备树中找到设备文件。
  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.
其他文献
摘要:小说《赴宴者》勾勒出了一幅亦真亦假、亦虚亦实的北京社会生活画面,严歌苓独具匠心,让“记者”董丹带领读者在一同享受美味盛宴的同时,跨越中西文化,寻求心灵的回归,也给广大读者献上了一场各种文化纷繁交织的文化“盛宴”,使读者也成为回归心灵家园的“赴宴者”。  关键词: 严歌苓 《赴宴者》 文化 心灵回归  一、引言  在外国文学迅速发展的新千年,许多美国华裔文学家不断走进大家的视野,《赴宴者》的作
摘要:《义务教育语文课程标准(2011年版)》反思了经过十年课改实践所暴露的语文教学存在的一些误区,理清了一些模糊的认识,纠正了一些较为偏激的认识与做法,这些纠偏对大学语文的教学也颇具启发意义。本文从语文教什么、怎样教以及课程效果如何评价三方面阐述了《义务教育语文课程标准》的修订对大学语文教学改革的启示。  关键词:课程标准 大学语文 教学改革  引言  《义务教育语文课程标准(2011年版)》(
编者按  如何用好统编本语文教材?这是当前乃至之后很长时间内教师们需要面对的问题。尤其是对于四至六年级的老师来说,不仅面临教材中很多新的教学内容,还要解决“新旧”教材之间的衔接问题。那么,除了了解教材的编写理念、框架等,在宏观上,我们应该以怎样的视角来看待统编本教材?在使用中应该遵循怎样的原则?具体到教学中,又应如何处理教材变化带来的教学内容和方法上的改变?有哪些具体策略?  本期,统编本教材总主
摘要:IP子网与VLAN都属于网络分组技术,两项技术既有相互联系,又有本质区别,在实际应用中各有千秋,本文从IP子网和VLAN的技术入手,归纳了这两项技术相同点和不同点,以及两项技术在实际组网中的应用。  关键词:IP子网;VLAN;技术;比较;应用。  中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)08-1pppp-0c    1 IP子网技术及其作用    我们现
摘要:Java语言是高职高专院校进行程序设计教学的一门重要编程语言。结合高职高专的培养目标及Java语言的特点,本文从内容的安排、实例的选取、编程思想的培养、项目实训的有效开展等几方面对如何提高高职高专Java教学效果进行了探讨和研究。  关键词:高职高专;Java;教学   中图分类号:G642文献标识码:A文章编号:1009-3044(2008)09-11682-01    Research
摘要:C 程序良好的可移植性使得C 语言成为程序设计人员的首选工具语言,而保证这一特性必需使用标准化的C 编码。国内高校尤其是高职院校的教材中,存在着大量非标准化的C 程序,不利于培养具有标准化C 编程风格的学生。本文从C 发展史、教育工作者和教材规范化等多个角度出发,分析了这一问题产生的原因,并提出了相应的解决办法。  关键词:C 标准;可移植性;高等教育  中图分类号:TP311
摘要:本文主要介绍了嵌入式Linux内核以及在ARM平台下的编译与移植过程。  关键字:Linux 内核;移植;编译  中图分类号:TP311 文献标识码:A文章编号:1009-3044(2008)15-20000-00    Compile And Transplant The Embedded Linux Kernel Based on ARM2410  ZOU Qiu  (Computer
书名:教师的儿童研究引论  作者:王丽华  出版社:浙江大学出版社  出版时间:2017年  ISBN:9787308169868  定价:49元  在新时代教育改革的大背景下,立德树人作为教育的目标和方向,为素质教育带来了新的曙光,同时也对教师提出了更高的要求。近年来,以儿童研究为方向的教师整体发展研究开始受到关注,这一研究对当前的素质教育改革具有非常重要的意義。由王丽华著、浙江大学出版社于20
摘要:利用EXECL建立高效的成绩表处理是班主任在每次学生考试时都要面对的一个问题,该文通过一个具体成绩表的制作过程,重点阐述了如何在EXECL中处理特殊的单元格,以及综合利用公式和函数实现成绩录入表格后自动生成所需的成绩表。  关键字:EXECL;成绩表;公式;函数  中国图书分类号:TP317文献标识码:B文章编号:1009-3044(2008)24-1206-02  To Create a
摘要:该文在分析TD-SCDMA系统无线资源管理机制的基础上,对该系统的动态信道分配算法进行研究。首先对现有的TDD-CDMA系统中的各种动态信道分配算法进行分类总结和分析比较,并在此基础了给出针对TD-SCDMA系统的慢速信道分配算法、快速信道分配算法以及考虑空间分布信息的信道分配方案,阐明了各自的特点和适用范围。研究了在TDD CDMA系统中如何进一步提高信道利用率的问题。  关键词:TDD/