发布时间:2014-09-05 17:04:44作者:知识屋
1 底层机制
Linux 的设备驱动模型的底层机制主要包括:kobject,kobj_type,kset 等几个结构。这几个
结构的定义在include/linux/kobject.h 中。
1.1 kobject 代表设备驱动模型中一个基本对象,类似于MFC 中最顶层的基类CObject。每个kobject 都对应于sysfs 中的一个目录。上层结构例如device,device_driver,bus_type 都嵌入了一个kobject,这相当于面向对象程序设计语言中的继承机制
1.2 kobj_type是kobject 所属的类型,定义了某种类型的kobejct 的公共的属性和操作
1.3 kset 是一个kobject 集合(或容器),包含了一系列的kobject。需要注意的是,kset 内部也嵌入了kobject,这表明kset 本身也是一个kobject
2 高层数据结构
高层主要包括三个结构:device,device_driver,bus_type 。这几个结构的定义在
include/linux/device.h 中。
2.1 device代表一个设备,对应于/sys/devices/下的一个目录
2.2 device_driver代表一个设备驱动程序,对应于/sys/bus/XXX/drivers/下的一个目录
2.3 bus_type代表一个总线,对应于/sys/bus/下的一个目录。
2.4 match()方法用于判断挂在总线下的某个device 和某个device_driver 是否匹配,在一个
device 或一个device_driver 注册到总线上时调用。uevnet()方法用于为uevent 机制添加环境变量,在处理uevent 时被调用。其它方法都是操作总线上挂接的device 的
2.5 probe(),remove(),shutdown(),suspend(),resume()这几个方法在device_driver 中也定
义了。内核在调用这些方法时,会优先调用bus_type 中定义的方法。如果相应的方法在
bus_type 中未定义,才会去调用device_driver 中定义的方法。
3 bus_type、device 和device_driver 之间的关系
3.1 bus_type 相当于一个容器,是device 和device_driver 的管理机构,它包含了一个device 集合(kset)和一个device_driver 集合(kset),分别表示挂在这个总线下的所有设备和所有设备驱动程序。
3.2 device_driver 挂在某个bus_type 下面,包含了一个device 集合(kset),表示这个驱动程序操作(或控制)的所有设备。device_driver 还包含一个bus_type 指针,表示驱动程序所在的总线。
3.3 device 挂在某个bus_type 下面,包含了一个device_driver 指针,表示这个设备对应的设备驱动程序。device 还包含一个bus_type 指针,表示设备所在的总线。需要说明的是,一个实际的总线在设备驱动模型中是用两个结构表示的:bus_type 和device。bus_type 代表总线类型,出现在/sys/bus/目录下;device 代表总线设备,出现在/sys/devices/
目录下,这表明实际的总线本质上是一种设备。
4在总线中添加和删除设备的过程:
(1) 设备添加
device_register(dev)->device_add(dev)-> kobject_uevent(KOBJ_ADD)
device_add(dev)->bus_attach_device(dev)->device_attach(dev)
->__device_attach(drv,dev)->bus_type():match(dev,drv)
then ->driver_probe_device()->really_probe()
->bus_type:probe()或device_driver:probe()
(2) 设备删除
device_unregister(dev)->device_del(dev)->bus_remove_device(dev)
->device_release_driver(dev)
->__ device_release_driver(dev)
->bus_type:remove()或device_driver:remove()
device_del(dev)->kobject_uevent(KOBJ_REMOVE)
(3) 当在总线上添加(或删除)设备时,会依次遍历总线上的所有驱动程序,调用总线定义的
match()方法检查要加入(或删除)的设备是否和驱动程序“匹配”,如果匹配成功,则对设备
调用总线或驱动程序中定义的probe(或remove)方法。添加设备时产生KOBJ_ADD uevent,
删除设备时产生KOBJ_REMOVE uevent
5 总结一下在总线中添加和删除驱动程序的过程:
(1) 驱动程序添加
driver_register(drv)-> bus_add_driver (drv)-> driver_attach(drv)
->__driver_attach(dev,drv)
->bus_type():match(dev,drv) then
->driver_probe_device()->really_probe()
->bus_type:probe() 或device_driver:probe()
driver_register(drv)-> kobject_uevent(KOBJ_ADD)
(2) 驱动程序删除
driver_unregister(dev)->bus_remove_driver(drv)-> driver_detach(drv)
->__ device_release_driver(dev) [dev-drv 管理的所有设备]
->bus_type:remove() 或device_driver:remove()
(3) 当在总线上添加(或删除)驱动程序时,会依次遍历总线上的所有设备,调用总线定义的
match()方法检查要加入(或删除)的驱动程序是否和设备“匹配”,如果匹配成功,则对设备
调用总线或驱动程序中定义的probe(或remove)方法。添加驱动程序时产生KOBJ_ADD
uevent,删除驱动程序时产生KOBJ_REMOVE uevent。[注:KOBJ_REMOVE uevent 在
kobject_put(&drv->p->kobj)中产生]
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能