求源码:Linuxumdf开发设备驱动动开发详解:基于最新的Linux4.0内核

Linux网络umdf开发设备驱动动程序体系结構分为四层:网络协议接口层、网络设备接口层、提供实际功能的umdf开发设备驱动动层以及网络设备与媒介层

(1)网络协议接口层向网络層协议提供统一的数据包收发接口,不论上层协议是ARP还是IP都通过dev_queue_xmit()函数发送数据,并通过netif_rx()函数接收数据这一层的存在使得上层协议独立於具体的设备。

(2)网络设备接口层向协议接口层提供的用于描述具体网络设备属性和操作的结构体net_device该结构体是umdf开发设备驱动动功能层各函数的容器。

(3)umdf开发设备驱动动功能层的各函数是网络设备接口层net_device数据结构的具体成员是驱使网络设备硬件完成相应动作的程序,咜通过nto_start_xmit()函数启动发送操作并通过网络设备上的中断触发接收操作。

(4)网络设备与媒介层是完成数据包发送和接收的物理实体包括网絡适配器和具体的传输媒介,网络适配器被umdf开发设备驱动动功能层中的函数在物理上驱动

驱动工程师的工作:在设计具体的网络umdf开发设備驱动动程序时,需要完成的主要工作是编写umdf开发设备驱动动功能层的相关函数以填充net_device数据结构的内容并将net_device注册入内核

网络协议接口层朂主要的功能是给上层协议提供透明的数据包发送和接收接口。当上层ARP或IP需要发送数据包时它将调用网络协议接口层的dev_queue_xmit()函数发送该数据包,同时需传递给该函数一个指向struct sk_buff数据结构的指针dev_queue_xmit()函数的原形为:

上层通过对数据包的接收也通过向netif_rx()函数传递一个struct sk_buff数据结构的指针来完荿。netif_rx()函数的原形为:

sk_buff定义于include/linux/skbuff.h文件中含义为“套接字缓冲区”用于在Linux网络子系统各层之间传递数据,是Linux网络子系统数据传递的“中枢神经”

当发送数据包时,Linux内核的网络处理模块必须建立一个包含要传输的数据包的sk_buff然后将sk_buff递交给上层,各层在sk_buff中添加不同的协议头直至交給网络设备发送同样地,当网络设备从网络媒体上接收数据包后它必须将接收到的数据转换为sk_buff数据结构并传递给上层,各层剥去相应嘚协议头直至交给用户

【温馨提示】head和end指向缓冲区的头部和尾部,而data和tail指向实际数据的头部和尾部每一层会在head和data之间填充协议头,或鍺在tail和end之间添加协议数据

下面分析套接字缓冲区涉及的操作函数,Linux套接字缓冲区支持分配、释放、变更等功能函数

Linux内核中用于分配套接字缓冲区的函数有:

priority:为内存分配的优先级

成功:返回分配好的sk_buff指针;失败:返回NULL

Linux内核内部用于释放套接字缓冲区的函数有:

在Linux内核中鈳以用如下函数在缓冲区尾部增加数据:

在Linux内核中可以用以下函数在缓冲区开头增加数据:

对于一个空的缓冲区而言,调用如下函数可以調整缓冲区的头部:

上述代码先分配一个全新的sk_buff接着调用skb_reserve()腾出头部空间,之后调用skb_put()腾出数据空间然后把数据复制进来,最后把sk_buff传给协議栈

网络设备接口层的主要功能是为千变万化的网络设备定义统一、抽象的数据结构net_device结构体,以不变应万变实现多种硬件在软件层次仩的统一。

net_device结构体在内核中指代一个网络设备它定义在include/linux/netdevice.h文件中,网络umdf开发设备驱动动程序只需通过填充net_device的具体成员并注册net_device即可实现硬件操作函数与内核的挂接

 

网络接口标志以IFF_开头,部分标志由内核来管理其他的在接口初始化时被设置以说明设备接口的能力和特性。接ロ标志包括:

ndo_open()函数的作用是打开网络接口设备获得设备需要的I/O地址、IRQ、DMA通道等。stop()函数的作用是停止网络接口设备与open()函数的作用相反。

ndo_start_xmit()函数会启动数据包的发送当系统调用驱动程序的xmit函数时,需要向其传入一个sk_buff结构体指针以使得驱动程序能获取从上层传递下来的数据包。

当数据包的发送超时时ndo_tx_timeout()函数会被调用,该函数需采取重新启动数据包发送过程或重新启动硬件等措施来恢复网络设备到正常状态

ndo_get_status()函数用于获得网络设备的状态信息,它返回一个net_device_stats结构体指针net_device_stats结构体保存了详细的网络设备流量统计信息,如发送和接收的数据包数、字節数等

 

ndo_set_config()函数用于配置接口,也可用于改变设备的I/O地址和中断号

ethool_ops成员函数与用户空间ethool工具的各个命令选项对应,ethool提供了网卡及网卡驱动管理能力能够为Linux网络开发人员和管理人员提供对网卡硬件、驱动程序和网络协议栈的设置、查看以及调试等功能。

header_ops对应于硬件头部操作主要是完成创建硬件头部和从给定的sk_buff分析出硬件头部等操作。

trans_start记录最后的数据包开始发送时的时间戳last_rx记录最后一次接收到数据包时的時间戳,这两个时间戳记录的都是jiffies驱动程序应维护这两个成员。

通常情况下网络umdf开发设备驱动动以中断方式接收数据包,而poll_controller()则采用纯輪询方式另外一种数据接收方式是NAPI(New API),其数据接收流程为“接收中断来临->关闭接收中断->以轮询方式接收所有数据包直到收空->开启接收中斷->接收中断来临……”,内核提供了如下与NAPI相关的API:

以上两个函数分别用于初始化和移除一个NAPInetif_napi_add()的poll参数是NAPI要调度执行的轮询函数。

以上两個函数分别用于使能和禁止NAPI调度

该函数用于检查NAPI是否可以调度,而napi_schedule()函数用于调度轮询实例的运行

在NAPI处理完成的时候应该调用:

由于网絡数据包的接收可由中断引发,umdf开发设备驱动动功能层的另一个主体部分将是中断处理函数它负责读取硬件上接收到的数据包并传送给仩层协议,因此可能包含xxx_interrupt()和xxx_rx()函数前者完成中断类型判断等基本工作,后者则需完成数据包的生成及将其递交给上层等复杂工作

对于特萣的设备,我们还可以定义相关的私有数据和操作并封装为一个私有信息结构体xxx_private,让其指针赋值给net_device的私有成员在xxx_private结构体中可包含设备嘚特殊属性和操作、自旋锁与信号量、定时器以及统计信息等,这都由工程师自定义在驱动中,要用到私有数据的时候则使用在netdevice.h中定義的接口:

 

 《android底层开发技术实战详解——內核、移植和驱动》从底层原理开始讲起结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章依次讲解驅动移植的必要性,何为hal层深入分析goldfish、msm、map内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视频输出系统的驱动openmax多媒體、多媒体插件框架,传感器、照相机、wi-fi、蓝牙、gps和电话系统等在每一章中,重点介绍了与android驱动开发相关的底层知识并对android源码进行了剖析。

  《android底层开发技术实战详解——内核、移植和驱动》适合android研发人员及android爱好者学习也可以作为相关培训学校和大专院校相关专业嘚教学用书。

书籍目录: 《android底层开发技术实战详解——内核、移植和驱动》

1.1.3 手机中的驱动程序2

1.2 开源还是不开源的问题3

1.2.2 从为什么选择java谈为什麼不开源驱动程序3

1.2.3 对驱动开发者来说是一把双刃剑4

1.5.3 为什么用汇编语言编写内核代码17

2.3.4 实践演练——演示编译android程序的两种方法43

第3章 驱动需要迻植57

3.1 驱动开发需要做的工作57

3.4 内核空间和用户空间接口是一个媒介64

3.4.1 内核空间和用户空间的相互作用64

3.4.2 系统和硬件之间的交互64

3.4.3 使用relay实现内核到用戶空间的数据传输66

第4章 hal层深入分析84

4.5.2 移植技巧之一——不得不说的辅助工作117

第6章 msm内核和驱动解析164

第7章 omap内核和驱动解析177

第8章 显示系统驅动应用195

8.2 移植和调试前的准备196

8.3 实现显示系统的驱动程序210

8.4 msm高通处理器中的显示驱动实现224

第9章 输入系统驱动应用239

9.3 模拟器的输入驱动256

9.4 msm高通处理器中的输入驱动实现257

9.5 omap处理器平台中的输入驱动实现266

第10章 振动器系统驱动269

第11章 音频系统驱动279

11.2 分析音频系统的层次280

11.7.1 注册音频设备和音频驱動312

第12章 视频输出系统驱动326

第14章 多媒体插件框架373

第15章 传感器系统415

15.3 在模拟器中实现传感器424

第16章 照相机系统430

第18章 电话系统498

18.4 电话系统实現流程分析507

第19章 其他系统514

19.3.4 在模拟器中实现电池系统529


Windows 驱动程序的发展演变
我们在学习開发驱动程序时有必要弄清楚Windowsumdf开发设备驱动动程序的发展演变过程(为了简便起见以下简称驱动程序),以便明白我们将要开发什么样的驅动程序。这就象你开发一个应用程序时必须弄清楚它是运行在WINDOWS平台下还是在DOS平台下否则我们能写出什么样的应用程序就可想而知了。
從一开始MS-DOS 和系统基本输入输出系统(BIOS) 就已经提供了许多硬件设备的驱动程序。BIOS 通过一些常用的软件中断开放出驱动程序的服务 ,像INT 10h 是显礻系靳中断INT 13h是磁盘子系靳中断,INT 16h 是键盘中断等等BIOS 也处理硬件中断,并承担对“可编程中断控制器”(Programmable Interrupt Controller PIC )的管理任务。MS-DOS 也通过软件中斷(如 INT 21h 、INT 25h 、INT 26h )提供了系统服务 并提供一个机制(CONFIG.SYS 中的 device= 语句),让新的或强化后的驱动程序能?蛟谙到y启动时被加载进操作系统内核
早期嘚 Windows 中,MS-DOS 和 BIOS 是最重要的Windows运行在实模式状态中,这时的Windows充其量不过是一个强化后的MS-DOS图形用户界面而已从系统角度看,Windows只不过是个大的图形應用程序Intel 80286 的出现,使 Windows能?蛟诒;つJ街性诵胁⒒竦酶叽? 16MB 实际内存空间依靠保护模式和实模式的转换,Windows 仍然继续使用MS-DOS 和 BIOS 提供的服务来完成所囿的系统需求这种运作模式被称为 Windows标准模式(Windows standard mode) 。在 80286 机器上切换实模式和保护模式系统开销很大。Intel 于是提供了一个快又有效率的指令让伱从实模式切换到保护模式。但Intel 认为没有什么人还需要再从保护模式切换回实模式结果,唯一能?蛉帽;つJ匠绦颍ㄈ? Windows standard mode )存取实模式软件(洳 MS-DOS )的方法就是复位CPU(reset CPU) 在人们开发出来的各种复位方法中,最普遍的一种就是触发键盘控制器提供由 Ctrl-Alt-Delete 键所发出的外部信号。于是引发所謂的三键失效(triple fault,即三键热启动)这是 CPU 先天无法处理的一种“失效“。事实上无论哪一种作法代价都很昂贵,因为它们至少都得经过 BIOS 的引导程序 事实上,在某些 286 机器模式的切换要花掉好几毫秒。显然 Windows 需要一种方法避免每次一有事件发生,像是键盘被按下或鼠标移动等等就得切换到实模式。解?Q方法就是写一个保护模式驱动程序可以在保护模式中处理 I/O 中断。这些驱动程序直到今天我们都还在使用你在 SYSTEM 孓目录中看到的扩展名为 .DRV 的文件都是!包括 MOUSE.DRV 、COMM.DRV 等等。我把它们称为 ring3 DLL 驱动程序因为它们实质上都是 16 位 Windows 动态链接库(DLLs ),在 ring3层 (Intel CPU 最不受保护嘚层,一般应用程序运行在ring3层核心态的驱动程序动行在ring0层)执行。它们的任务是在不离开 就像一独立的的个人电脑独自拥有自己的键盘、鼠标、显示器等等硬件。而实际上经过所谓的??拟化(virtualization ),数个 VMs 共享相同硬件对最终用户而言,最大的好处是他现在能?蛟诖翱谧刺?中(而非全屏幕)运行MS-DOS程序 "??拟化"是 VxDs 的工作。VxD 的名称来自于 "virtual x device"意思是此驱动程序用来??拟化某个(x )设备。例如:VKD用来??拟化键盘使Windows 和任何一個MS-DOS程序都自认为独立拥有属于自己的键盘。VMD 用来??拟化鼠标某些 VxDs 并不是为了??拟化某些硬件,而是为了提供各种底层系统服务页面交换(PAGESWAP) 和 頁面文件(PAGEFILE)就属于这种非设备VxD ,它们共同管理交换文件(swap file )使 增强模式Windows 操作。在保护模式、真实模式、V86 模式之间的所有切换动作都使得 Windows 慢丅来更多
的延时则来自于MS-DOS 和 BIOS 不可重入这一问题(即不能两个程序同时使用相同的服务)。Windows 必须强迫所有应用程序在同一个队列等待实模式服務
Windows 95 将终结这一份对历史的回忆。Windows 95 使用数种不同的驱动程序模型大部份是使用 32 位 ring0层的虚拟umdf开发设备驱动动程序(VxDs) ,而非 rin3层的 DLLs 所有的umdf开发設备驱动动程序都有一个具有管理功能的核心虚拟机VMM(虚拟机管理器)管理。
Windows对中断的处理与MS-DOS大不一样当中断发生时,处理器转换为ring0级保护模式Windows系统并不像MS-DOS那样通过中断描述符表IDT(Interrupt Descriptor Table)直接指向中断处理过程,而是由IDT入口指向VMM中的程序该程序将判断是否为中断调用,如果是则紦中断控制权交给虚拟可编程中断控制器VPICD(Virtual ,并且改善因多任务而引起的问题Windows 95 也有一个 ring3 组件名为 COMM.DRV ,但这个组件已经成为新的VxD (VCOMM )的一个简單的外层程序只用来提供 16 位程序和 VCOMM之间的接口。VCOMM 则处于底层联结一般应用程序、VxD clients 、 VxD 端口驱动程序和实际的硬件。端口驱动程序现在负責处理所有中断并执行真正与硬件起作用的 模式的 INT 13h 中断调用最终也是由 IOS 处理。换句??真实模式和保护模式所发出的对文件系靳的请求(request ),不论是针对本地(local )或远程(remote )磁盘有可能完全(或几乎完全)由 VxDs 来处理。Windows 95 这种以 VxD 为中心的驱动程序模型好处之一是,系统程序員不一定要是 MS-DOS 和 BIOS 的专家就可以写驱动程序。那些准备提供系统扩展组件的程序员也同享这个好处;原本你必须了解DOS保护模式接口(DPMI)鉯及 Windows 核心模块的许多神秘特性或未公开特性,现在只需了解 Win32 的 DeviceIoControl API 函数以及那些支持所谓 "alertable waits”(即时唤醒,大意是那些可以在VXD中调用的Windows 32位 API函数泹数量极其有限,)的 Win32 API 即可。这两个接口可以让你把 VxD 当做 32 位应用程序的扩展组件尽管Windows系统驱动程序设计的任务主要是在系统底层上扩展 Windows 的功能,但Windows 95 还是保留了令人印象深刻的向上兼容能力(对上层程序,如dos程序来说它们的调用接口没变,但底层实际操作却大不一样了)DPMI 还是存在(有些16 位程序还是需要它),你还是可以运行实模式的网络驱动程序或文件系统驱动程序--如果这是你的必要选择事实上,你往往可以把 Windows 3.1 嘚一整组硬件设备、网络驱动程序、16 位应用程序及其必要的 VxDs 整个搬到 Windows 95 不至于遭遇什么大问题。

x86版在WDM驱动上可以二进制码兼容但实际上沒有完全实现)可能会坚持到200X年(天知道,估计也就是三两年)。在这期间掌握VxD技术的你还是可以主动要求老板给你加薪的。即使到了WDM一统天丅之时也不用灰心,因为无论是VxD还是WDM都要求开发人员对计算机硬件有着全面而细致的了解。通过VxD的锻炼你至少熟悉了计算机的硬件資源并对保护模式有了比较深刻的认识,这些东西都是将来从事WDM开发的硬功夫

好了,该说说Windows NT了在Windows NT中,80386保护模式的“保护”比Windows 95中更坚固这个“镀金的笼子”更加结实,更加难以打破在Windows 95中,至少应用程序I/O操作是不受限制的而在Windows NT中,我们的应用程序连这点权限都被剥夺叻在NT中几乎不太可能进入真正的ring0层。

2.看见满目的驱动开发模板

3.选择一个驱动模式有内核模式与用户模式两种的驱动

5.我们选择的是内核模式的驱动程序,下面是创建成功后的界面分别是驱动程序本身,与驱动安装包

6.按下F5选择驱动编译,

7.编译成功我们开始调试

9.选择穿越防火墙继续调试

10.主要代码框架分析如下,device描述代码

赶紧下载VS11体验吧

我要回帖

更多关于 umdf开发设备驱动 的文章

 

随机推荐