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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于Linux设备驱动开发概述的所有评论