快速业务通道

Linux设备驱动开发概述

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-16
(&xxx_wait, &wait);//将等待队列移出等待队列头
38 set_current_state(TASK_RUNNING);//设置进程状态为TASK_RUNNING
39 return ret;
40 }
上述流程中,当设备暂时不可写时,驱动主动通过schedule()调度其他进程执行本身进入睡眠状态,进程进入被加入了等待队列,它可以被中断或其他执行路径唤醒.
大多数外设都包含一个以上的中断,Linux将中断分成了2个半部,即顶半部和底半部,顶半部完成尽可能少的比较紧急的功能,它往往只是简单地读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作.“登记中断”意味着将底半部处理程序挂到该设备的底半部执行队列中去.这样,顶半部执行的速度就会很快,可以服务更多的中断请求,而中断处理工作的重心就落在了底半部的头上,它来完成中断事件的绝大多数任务.底半部可以被新的中断打断,这也是底半部和顶半部的最大不同.tasklet、work-queue是Linux内核中常用的用于调度底半部执行的机制,调度底半部的典型方法如下:
1 /*定义tasklet和底半部函数并关联*/
2 void xxx_do_tasklet(unsigned long);
3 DECLARE_TASKLET(xxx_tasklet, xxx_do_tasklet, 0);
4
5 /*中断处理底半部*/
6 void xxx_do_tasklet(unsigned long)
7 {
8 ...
9 }
10
11 /*中断处理顶半部*/
12 irqreturn_t xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs)
13 {
14 ...
15 tasklet_schedule(&xxx_tasklet); //调度底半部执行
16 ...
17 }
高性能处理器一般会提供一个内存管理单元(MMU),该单元辅助操作系统进行内存管理,提供虚拟地址和物理地址的映射、内存访问权限保护和CACHE缓存控制等硬件支持.Linux的每个进程可以访问4GB的内存,0~3GB位于用户空间,对所有进程单独控制,3GB~4GB位于内核空间,被所有进程共享.在Linux内核空间申请内存涉及到的函数主要包括kmalloc()、__get_free_pages()和vmalloc()等.kmalloc()和__get_free_pages()申请的内存在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在较简单的转换关系.而vmalloc() 在虚拟内存空间给出一块连续的内存区,实质上,这片连续的虚拟内存在物理内存中并不一定连续,而vmalloc()申请的虚拟内存和物理内存之间也没有简单的换算关系.
在驱动中,对于外设的寄存器,不能直接访问物理地址,需访问经过映射后的虚拟地址.外设的寄存器可以用2种方式被映射到虚拟地址,一是静态映射,二是通过ioremap()动态映射.静态映射的方法是在将Linux移植到特定平台时建立一个 map_desc数组,通过 MACHINE_START和MACHINE_END宏之间的.map_io成员函数建立页面.
2.Linux设备驱动的架构
近年来内核在驱动方面更偏向于提供设备驱动的架构(Framework)而非单个设备驱动,考虑到框架更强的兼容性,字符设备、块设备、网络设备、MTD设备、TTY设备、I2C设备、LCD设备、音频设备、摄像头、USB设备、PCI设备等驱动的体系结构都变得愈发复杂.
Linux设备驱动作为一个内核模块而存在,模块可以直接编译进内核或编译为.ko文件通过insmod、modprobe动态加载.
Linux字符设备驱动的核心是file_operations结构体,驱动的主体是实现其中的read()、write()、ioctl()等成员函数,如:
1 struct file_operations xxx_fops =
2 {
3 .owner = THIS_MODULE,
4 .read = xxx_read,
5 .write = xxx_write,
6 .ioctl = xxx_ioctl,
7 ...
8 };
Linux块设备驱动并不直接实现file_operations成员函数,其主体变成处理实现block_device_operations成员函数以及处理上层下达的I/O请求,处理I/O请求典型流程如下:
1 static void xxx_request(request_queue_t *q)
2 {
3 struct request *req;
4 while ((req = elv_next_request(q)) !

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号