快速业务通道

Linux设备驱动开发概述

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-16
作者:宋宝华 email:author@linuxdriver.cn
在过去这些年,Linux已经成功应用于服务器和桌面系统,而近年来,随着嵌入式系统应用的持续升温,Linux也开始广泛应用于嵌入式领域,逐步成为通信、工业控制、消费电子等领域的主流操作系统.Linux正以其独特的优势极大地吸引电子设计工程师,很多工程师从自己编写的或专用的RTOS转移到Linux,Linux在嵌入式系统中的占有率与日俱增.全世界有无数的嵌入式产品正使用Linux作为其操作系统,在这些采用Linux作为操作系统的设备中,无一例外都包含着多个Linux设备驱动,没有这些设备驱动,用户便无法享受Linux上诸多精彩纷呈的应用.
1.Linux设备驱动开发的基础
Linux设备驱动的开发需要牢固的硬件基础,并需要对驱动中所涉及的Linux内核知识有良好的掌握,具体表现在:
(1)驱动直接与硬件打交道,在编写某类硬件设备的驱动时,我们对该驱动涉及到的硬件的工作原理和接口有清楚的掌握,许多时候,我们需要直接操作寄存器、控制中断和DMA.
(2)编写Linux设备驱动涉及到许多Linux内核的API,会大量使用自旋锁、信号量、等待队列、tasklet、内存与I/O访问,如果对内核中的相关API了解不够充分,很难写出高质量的驱动.
在Linux设备驱动开发中,自旋锁和信号量是两种最常用的用于并发控制的手段,几乎所有的设备驱动中都使用了自旋锁或信号量.自旋锁和信号量控制临界区的方法相似:
spin_lock (&lock) ; //获取自旋锁,保护临界区
critical section //临界区
spin_unlock (&lock) ; //释放自旋锁

down(&mount_sem);//获取信号量,保护临界区
critical section //临界区
up(&mount_sem);//释放信号量
自旋锁或信号量的区别在于:信号量是进程级的,用于多个进程之间对资源的互斥,虽然也是在内核中,但是该内核执行路径是以进程的身份,代表进程来争夺资源的.如果竞争失败,会发生进程上下文切换(当前进程进入睡眠状态,CPU运行其它进程).当所要保护的临界区访问时间比较短时,用自旋锁是非常方便的,它节省上下文切换的时间.自旋锁锁定期间不允许阻塞,因此要求锁定的临界区小.
阻塞和非阻塞I/O是设备访问的两种不同模式,阻塞操作意味着在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作,被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足.而非阻塞操作的进程在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止.应用程序多以阻塞方式访问设备,在Linux驱动程序中,经常使用等待队列(wait queue)来实现进程的阻塞与唤醒控制,一个典型的流程如下所示:
1 static ssize_t xxx_write(struct file *file, const char *buffer, size_t count,
2 loff_t *ppos)
3 {
4 ...
5 DECLARE_WAITQUEUE(wait, current); //定义等待队列
6 add_wait_queue(&xxx_wait, &wait); //添加等待队列
7
8 ret = count;
9 /* 等待设备缓冲区可写 */
10 do
11 {
12 avail = device_writable(...);
13 if (avail < 0)
14 __set_current_state(TASK_INTERRUPTIBLE);//改变进程状态
15
16 if (avail < 0)
17 {
18 if (file->f_flags &O_NONBLOCK) //非阻塞
19 {
20 if (!ret)
21 ret = - EAGAIN;
22 goto out;
23 }
24 schedule(); //调度其他进程执行
25 if (signal_pending(current))//如果是信号唤醒
26 {
27 if (!ret)
28 ret = - ERESTARTSYS;
29 goto out;
30 }
31 }
32 }while (avail < 0);
33
34 /* 写设备缓冲区 */
35 device_write(...)
36 out:
37 remove_wait_queue

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号