您的位置:首页 > 运维架构 > Linux

Linux总线设备驱动模型

2017-02-16 22:24 260 查看

Kobjec&Kset

Sysfs文件系统



proc文件系统是提供一个接口给用户,让用户能够查看系统运行的状态信息,让用户能够修改内核的一些参数,比如说打印级别
sysfs是基于ram的文件系统,它是把内核的一些数据结构,以及这些数据结构中的一些属性,以及他们之间的关系展示给用户,暴露给用户。

Linux2.6内核引入了sysfs文件系统。sysfs被看成是与proc同类别的文件系统。sysfs把连接在系统上的设备和总线组织成分级的文件,使其从用户控件可以访问到。

Sysfs被加载到/sys/目录下,它的子目录包括:

(1)Block:在系统中发现的每个块设备在该目录下对应一个子目录,每个子目录中又包含一些属性文件,它们描述了这个块设备的各方面属性,如,设备大小。(loop块设备是使用文件来模拟的)

(2)Bus:在内核中注册的每条总线在该目录下对应一个子目录,如:ide,pci,scsi,usb,pcmia。其中每个总线目录内又包含了在整个系统中发现的属于该总线类型的设备,driver目录包含了注册到该总线的所有驱动。

(3)Class:将设备按照功能进行的分类,如/sys/class/net目录下包含了所有网络接口。

(4)Devices:包含系统所有的设备

(5)Kernel:内核中的配置参数

(6)Module:系统中所有模块的信息

(7)Firmware:系统中的固件

(8)Fs:描述系统中的文件系统

(9)Power:系统中的电源选项



一个设备可能存在于3个目录下,但是从物理上讲可能是一个设备,就看怎么划分。从功能上讲是一个鼠标,从总线上讲是一个USB设备

Kobject
Kobject实现了基本的面向对象的管理机制,是构成Linux2.6设备模型的核心结构。她与sysfs文件系统紧密相连,在内核中注册的每个kobject对象对应sysfs文件系统中的一个目录。














实例分析:Kobject.c





Kset能包含目录,kobject智能包含文件不能包含目录。
kset
kest是具有相同类型的kobject的集合,在sysfs中体现成一个目录,在内核中用kset数据结构表示,定义为:







热插拔事件
在Linux系统中,当系统配置发生变化时,如:添加kset到系统;移动kobject,一个通知会从内核空间发送到用户空间,这就是热插拔事件。热插拔事件会导致用户空间中相应的处理程序(如udev,mdev)被调用,这些处理程序会通过加载驱动程序,创建设备节点等来相应热插拔事件。



这三个函数什么时候被调用?当该kset所管理的kobject和kset状态发生变化时(如被加入,移动),这三个函数将被调用。(例:kobject_uevent调用) 。



实例分析:kset.c

设备模型

随着技术的不断进步,系统的拓补结构也越来越复杂,对智能电源管理、热插拔的支持要求也越来越高,2.4内核已经难以满足这些需求。为适应这种形式的需要,Linux2.6内核提供了全新的内核设备模型。

设备模型元素:总线,驱动,设备

总线:总线是处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连接,甚至是内部得虚拟platform总线。在Linux设备模型中,总线由bus_type结构表示,定义在<linux/device.h>



总线的注册和删除:













实例分析:Bus_basic.c





设备:







实例分析:Bus.c,Device.c





device







驱动:



当驱动找到与他匹配的设备的时候,就会调用probe。











Platform驱动程序

Platform总线:Platform总线是Linux2.6内核加入的一种虚拟总线。platform机制的本身使用并不复杂,由两部分组成,platform_device和paltform_driver.
Platform驱动与传统的设备驱动模型相比,优势在于platform机制将设备本身的资源注册进内核,由内核同一管理,在驱动程序使用这些资源时使用同一接口,这样提高了程序的可移植性。

























中断处理

中断概念:
为什么需要中断?
1.外设的处理速度一般慢于CPU
2.CPU不能一直等待外部事件
所以设备必须有一种方法来通知CPU它的工作进度,这种方法就是中断。

中断实现:在Linux驱动程序中,为设备实现一个中断包含两个步骤:
(1)向内核注册中断
(2)实现中断处理函数







快速/慢速中断:这两种类型的中断处理程序的主要区别在于,快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,因此在服务该中断时,不会被其他类型的中断打断;而调用慢速中断处理程序时,其他类型的中断仍可以得到服务。

共享中断:共享中断是将不同设备挂到同一个中断信号线上。Linux对共享的支持主要是PCI设备提供服务。







中断处理程序:
什么是中断处理程序?有何特别之处?
中断处理程序就是普通的C代码。特别之处在于中断处理程序是在中断上下文中运行的,它的行为受到某些限制;(1)不能向用户空间发送或者接收数据;(2)不能使用可能引起阻塞的函数;(3)不能使用可能引起调度的函数。



 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: