2009年7月13日星期一

Linux2.6设备模型解析

Linux2.6设备模型解析




概述:

设备模型的概念是在linux2.5中提出的,原先的目的是通过观测各个设备的当前信息从而使的电源管理的任务变得更加容易.但是在后来的发展中却逐渐演变成了对设备的管理.

理解和掌握设备模型的概念对程序员编程是有益的,程序员通过对它的理解而能尽可能的控控制他的程序.

设备模型主要是一组可以反应当前系统体系结构和状态的数据结构.通过这些数据结构,驱动模型主要实现以下一些任务反应系统如下一些状态:

当前系统中有那些设备,它们和那些总线相连,它们当前的状态如何,哪一个驱动在驱动这个设备.

系统总线结构,那些总线与其它的总线相连(例如usb控制器可以连接到PCI总线上),那些设备是可以连接到当前系统的,那些设备是已经连接到了当前系统.

系统用那些设备驱动,那些设备系统可以支持,它们是什么总线类型.

存在那些类别的设备,每种类中有那些设备是和当前系统相连的,设备模型可以告诉你类似的信息:这个系统上鼠标在哪里,而并不需要知道鼠标在物理上怎样连接的.

还有其它一些事

驱动模型是通过跟踪检测当前配置的变化(无论是硬件还是软件),并通过一组复杂的数据结构来反应.

设备模型中的概念:

    在设备模型中使用了新的词来描述它的数据结构,下面就大概说一下这些会在驱动模型中出现的名称.详细的内容会在后面讲到.

    Device:连接到总线的物理或是虚拟对象.(总线有可能也是虚拟的)

    Driver:是一种可以探测设备并且被绑定在设备上的软件,它可以执行一定管理功能.

    Bus:是一种给其它设备提供接入点的设备.

    Class:一种特殊类型的设备,她可以按照一定的方式来执行.例如类中可能包含磁盘,分区,串口等...

   
Subsystem:它提供一种系统结构的顶级视图.内核中的Subsystem包含了devices(提供一种系统内所有设备的分层视
图),class(对设备的分类),bus(面向总线的视图),和其它的一些.其实这个系统是对系统内设备模型所有设备组织的一种关系图.

   

    Sysfs:

    Sysfs是一种类proc文件系统的虚拟文件系统,它为用户空间提供了设备模型可视化的表示.

    要区分开device model和sysfs之间的关系.它们是不通的东西,但是又有着联系,具体体现在设备模型可以不需要sysfs而单独存在,但是sysfs却必须依赖于device model.

    Sysfs一般是挂载在/sys目录下的.其顶层目录如下:

helight@helight-desktop:/sys$ ls

block  bus  class  devices  firmware  fs  kernel  module  power  slab



Block:该目录下是系统中所有块设备的描述信息,如下:

helight@helight-desktop:/sys$ ls block/

ram0  ram10  ram12  ram14  ram2  ram4  ram6  ram8  sda

ram1  ram11  ram13  ram15  ram3  ram5  ram7  ram9  sr0

还可以看看sda这个目录下的情况:

helight@helight-desktop:/sys$ ls block/sda/

capability  device   queue  removable  sda2  sda6  sda8  size    stat       uevent

dev         holders  range  sda1       sda5  sda7  sda9  slaves  subsystem

可以看出这里有都我系统硬盘的描述,一共有7个分区但是我系统实际上windows下的分区4(c,d,e,f)个加上linux的分区2个(swap和/)一共6个分区.用fdisk -l查看其中:

Disk /dev/sda: 164.6 GB, 164696555520 bytes

255 heads, 63 sectors/track, 20023 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Disk identifier: 0x67edf08c



   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1        2550    20482843+   7  HPFS/NTFS

/dev/sda2            2551       20023   140351872+   f  W95 Ext'd (LBA)

/dev/sda5            2551        7650    40965718+   b  W95 FAT32

/dev/sda6            7651       12750    40965718+   7  HPFS/NTFS

/dev/sda7           12751       15300    20482843+   7  HPFS/NTFS

/dev/sda8           15301       15431     1052226   82  Linux swap / Solaris

/dev/sda9           15432       20023    36885208+  83  Linux

其中sda2是一个W95 Ext'd (LBA).

在看其它的文件,这里都是sda这个设备的相关信息.其中device和subsystem是两个软连接文件.

subsystem -> ../../block

device -> ../../devices/pci0000:00/0000:00:0f.0/host2/target2:0:0/2:0:0:0

其中subsystem是说这个设备属于那种设备.device是指向设备在什么地方.

bus:该目录下面是系统所支持的个中总线.如下:

helight@helight-desktop:/sys$ ls bus/

acpi  eisa  i2c  isa  MCA  pci  pci_express  platform  pnp  scsi  serio  spi  usb

class:该目录下是系统设备的分类.如下

helight@helight-desktop:/sys$ ls class/

atm        firmware     input    power_supply  scsi_generic  usb_endpoint

backlight  graphics     mem      ppdev         scsi_host     usb_host

dma        hidraw       misc     printer       sound         vc

dmi        hwmon        net      scsi_device   spi_master    video_output

drm        i2c-adapter  pci_bus  scsi_disk     tty           vtconsole

devices:该目录描述的是系统当前的设备

helight@helight-desktop:/sys$ ls devices/

isa  LNXSYSTM:00  pci0000:00  platform  pnp0  pnp1  system  virtual

module:系统当前所有的内核模块

helight@helight-desktop:/sys$ ls module/

其它也就不一一列举了.

Kobjects:

kobject结构是驱动模型中的一个核心数据结构,它里面的数据描述了这个驱动是属于什么设备,是什么类型,它的名字,它的引用次数等等.

Kset:

kset是一个用来包含kobject这个对象的容器,kset又属于subsystem,kset负责对系统设备的热插拔事件.

没有评论:

发表评论