《精通Linux设备驱动程序开发》——基本概念

来源:互联网 发布:mac 生成.ds store 编辑:程序博客网 时间:2024/04/29 03:48

一、设备和驱动程序介绍

 1、PC兼容的系统的硬件框图

   1)、系统支持各种各样的设备和接口。


 2、嵌入式系统的硬件框图

   1)、访问外围设备的能力是系统性能的关键,设备驱动程序则是决定了访问外围设备的能力。



二、中断处理

 1、中断上下文

   1)、设备往往通过某种硬件信号异步地唤起处理器的注意,这些硬件中断就是中断。每个设备都被分配了一个相关的标识符——称之为中断请求(IRQ)。当处理器检测到

             某一IRQ号对应的中断产生时,它将停止现在的工作,并启动该IRQ所对应的中断服务例程(ISR)。中断处理函数在中断上下文中执行。

            I、ISR是直接与硬件交互的非常重要代码片段。

            II、为了对粗暴打断当前执行例程的行为进行补偿,ISR不得不礼貌运行于受限制的环境下,即所谓的中断上下文。

   2)、中断上下文注意事项

         I、中断上下文打的吗绝不可以停止执行。

         II、为了在中断处理函数中保护临界区,不能使用互斥体,应该使用自旋锁,但应注意,只有在不得不用的时候才采用。

         III、中断处理函数不能与用户空间直接交互数据,因为它们经由进程上下文与用户空间建立连接。

         IV、中断处理函数将工作分为两部分。顶半步设一个标志以宣称它已经服务了该中断,而重大的工作负载则都丢给了底半部。底半部额执行被延后,在其执行环境中,所有

                的中断都是使能的。

         V、中断处理函数不必恃可重用的。

         VI、   中断处理函数可以被更高优先级IRQ的中断处理函数打断。

   3)、同步中断——意味中断不会不期而遇;它们由处理器本身执行某指令产生。

   4)、外部中断和同步中断用相同的确认机制处理。


 2、分配IRQ号

   1)、设备驱动程序必须将它们的IRQ号与一个中断处理函数链接。IRQ额分配可以很直接,也可能需要复杂的探测过程。

   2)、/proc/interrupts文件中有系统中活动的IRQ的列表。


 3、设备实例:导航杆

   1)、驱动程序必须首先请求IRQ并将一个中断处理函数与其绑定。(P65代码)

         I、代码中没有查询和探测IRQ号,二十直接硬编码为ROLLER_IRQ。

         II、参数roller_interrupt()是中断处理函数。中断处理函数的原型返回值类型为irqreturn_t。如果处理成功,返回IRQ_HANDLED,否则,返回IRQ_NONE。

         III、IRQF_DISABLED标志意味着这个中断处理函数为块中断。因此,调用此中断时,内核将禁止所有中断。IRQF_TRIGGER_RISING暗示导航杆将在中断上产生一个上

                升沿以发出中断。IRQF_TRIGGER_HIGE和IRQF_TRIGGER_LOW可以标识一个中断尾高或底电平触发。该参数其他可能值包括IRQF_SAMPLE_RANDOM和

                IRQF_SHARED。

         IV、参数‘roll’用于标识这个设备,标识数据由/proc/interrupts等文件产生。

         V、最后一个参数仅在共享中断的时候使用,用于区分共享同一IRQ线的每个设备。

   2)、导航杆中断函数(代码清单4-1)


 4、softirq和tasklet

   1)、softirq是一种基本的底半部机制,有较强的加锁需求。tasklet建立在softirq之上,使用起来更简单,除非有严格的可扩展性和速度要求,都建议使用tasklet。softirq和

             tasklet的主要不同是前者是可重用的,二后者不是。softirq的不同实例可运行在不同的处理器上,而tasklet则不允许。

   2)、使用softirq分担中断处理函数的负载(代码清单4-2)

   3)、使用tasklet分担中断处理函数的负载(代码清单4-2)

   4)、softirq、tasklet和工作队列对比(P71  表4-1)



三、Linux设备模型

 1、udev

   1)、udev的工作取项:

        I、内核中的sysfs支持。

        II、一套用户空间守护程序和实用工具。

        III、用户自定义规则,位于/etc/udev/rules.d目录中。

   2)、udev实例

        I、首先,从sysfs相应文件中提取产品信息。使用udevinfo可收集设备信息。

        II、接下来,使用收集到的产品信息标识设备并且添加udev命名规则。


 2、sysfs、kobject和设备类

   1)、内核的结构化设备模型在用户空间称为sysfs。

        I、位于内存的文件系统中,而且包含内核数据结构的信息,其特定的对应于设备模型。

   2)、kobject封装了一些公用的对象属性。

        I、kobject主要字段:

        kref对象,用于引用计数管理。

        kset的指针,表征kobject归属的对象集。

        kobj  type,用于描述kobject的对象类型。

   3)、设备类概念是设备模型的另一个特点,在驱动程序中,更有可能用到此接口。

        I、类编程接口建立在kobject和sysfs上。它是深入理解设备模型中各种组件进行端到端交换的很好的着入点。

   4)、设备模型相关组件的联系

   5)、总线-设备-驱动程序编程接口也是设备模型部分另一个抽象。bus_type、device、device_driver这三个接口分别是与总线、设备和驱动程序相对应的主要数据接口。


 3、热插拔和冷插拔

   1)、在运行过程中往系统中插入设备称为热插拔,而在系统启动前就连接设备则称冷插拔。


 4、微码下载

   1)、一些设备在运行前,必须下载微码。微码会在片上的微控制器中执行,。

   2)、应该在用户空间维护微码,并在内核需要的时候将其载入。


 5、模块自动加载



四、内存屏障



五、电源管理

0 0
原创粉丝点击