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负责对系统设备的热插拔事件.
阅读(1369) | 评论(0) | 转发(1) |