Linux驱动移植指南
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
网络接口设备
• 内核不再调用read,write,它调用与数据包 传送相关的函数,不再映射到文件系统。 • 发送 程序是在驱动程序的上层协议层有数 据要发送时自动调用的。一般驱动程序中 不对发 送数据进行缓存,而是直接使用硬 件的发送功能把数据发送出去。接收数据 一般是通 过硬件中断来通知的。在中断处 理程序里,把硬件帧信息填入一个skbuff结 构中,然后调用netif_rx()传递给上层处理。
通过查询调试:
可以使用ioctl的方法,可以为设备驱动调试实现若干 ioctl命令。这些命令从驱动程序空间复制相关数据到进 程空间,在进程空间里检查这些数据。
Linux设备驱动的中断处理 Linux设备驱动的中断处理
Linux的中断挂接函数request_irq
Linux中挂接中断号和中断处理函数的调用.
块设备
• 块设备是文件系统的宿主(磁盘、磁带、 CD-ROM 、Flash芯片) • 在大多数Unix系统中,只能将块设备看 作多个块进行访问为,一个块设备通常 是1K字节数据 • 块设备和字符设备只在内核内部的管理 上有所区别,因此也就是在内核/驱动程 序间的软件接口上有所区别 • 块设备也通过文件系统节点来读写数据 • 块设备的读写 都有缓存来支持,并且块 设备必须能够随机存取(random access)
字符设备的移植
主设备号和次设备号 1.主设备号是一个用来索引静态字符设备 数组的整数,标识设备对应的驱动程序,内核 利用主设备号将设备与相应的驱动程序对应起 来。 2. 次设备号只由设备驱动程序使用;内核 的其他部分不使用它,仅将它传递给驱动程序。 次设备号提供了一个驱动程序控制若干个设备 的方法。
2. Release方法 .release方法的作用正好与open相反。这个设备 方法有时也称为close。 · ·使用计数减1。 1 ·释放open分配在filp->private_data 中的内存。 ·在最后一次关闭操作时关闭设备。 close调用与close方法 3.Read方法 .一般通过copy_to_user/__put_user完成驱动提 供给用户的read操作;
块设备驱动的移植
块设备驱动的注册 1. register_blkdev函数:使用指向块设 备驱动操作的数据结构 block_device_operations向内核传递驱动 实现的函数。 2. unregister_blkdev函数:使用主设备 号为参数,从系统中注销设备驱动。
块设备驱动的移植
块设备驱动的主设备号和从设备号
网络接口设备驱动程序的包发送和接收
1. 数据交换的主要数据结构sk_buff. 该数据结构主要定义了数据长度,数据缓冲的指 针。以及各种协议头的定义。 2. 系统发送时调用的发送方法hard_start_xmit 该方法主要实现将系统送来的sk_buff数据结构中 的数据包通过设备发送出去。 2. 设备驱动接收时调用的接收函数netif_rx 设备驱动在接收到数据包时,利用该包构造一个 Sk_buff的数据结构,然后调用该函数,将收到的数据 包送到系统。
Linux的中断释放函数free_irq free_irq
Linux中的中断释放函数
Linux设备驱动的中断处理 Linux设备驱动的中断处理
快速和慢速中断处理
这两种中断处理程序的主要差别就在于,快速中断 处理程序保证中断的原子处理,而慢速中断处理程 序则不保证(这种差别在最新的中断处理的实现也保 留了)。也就是说,“开启中断”处理器标志位(IF)在 运行快速中断处理程序时是关闭的,因此在服务该 中断时不允许被中断。而调用慢速中断处理时,内 核启动微处理器的中断报告,因此在运行慢速中断 处理程序时其它中断仍可以得到服务。 l
字符设备的移植
字符设备驱动的挂接 1.内核内部使用一个file结构来标识设备,而且 内核使用file_operations结构访问驱动程序的函数。 2. register_chrdev注册函数:使用参数fops-它 是一个指向一组操作(open,read等等)表的指 针。这个表的每一个项都指向由驱动程序定义的 处理相应请求的函数。 通过该调用可以把驱动程 序注册到内核中. 3. file_operations结构是一个定义在<linux/fs.h> 中的函数指针表。
字符设备的移植
字符设备驱动需要实现的主要方法 1. Open方法 ·如果是首次打开,初始化设备。 ·检查设备相关错误(诸如设备未就绪或相似的 硬件问题)。 ·标别次设备号,如有必要更新f_op指针。 ·分配和填写要放在filp->private_data里的数据结 构。 ·增加使用计数。
字符设备的移植
常用的内存分配函数:
.kmalloc函数
kmalloc函数可以分配的内存空间最大不能超过32个页 物理内存只能按页大小进行分配 .get_free_page 功能类似于kmalloc,但是可以为DMA分配内存。 .vmalloc 分配虚拟地址空间的连续区域
Linux设备驱动的接收方式 Linux设备驱动的接收方式
阻塞型
当调用设备驱动的进程在需要等待(在接收)时,设备 驱动可以挂起调用进程,让它进入睡眠状态以便其他进 程可以使用计算资源。
非阻塞型
设备驱动在资源不满足时(如接收数据)直接返回, 而不挂起调用进程。
异步触发
使用异步触发机制,当数据达到时,向所有注册异步 触发的进程发送SIGIO信号。这种方式的效率最高。
块设备驱动的主设备号和从设备号的意义和字符 设备驱动一样,都是对驱动程序和设备的索引。
块设备驱动的主要方法
open: 1 . open: 开启设备程序,和字符设备类似 release: 2 . release: 释放设备程序, 和字符设备类似的工作
块设备驱动的移植
块设备驱动的request函数 块设备驱动的request函数 request
Linux驱动移植指南 Linux驱动移植指南
简介
Linux驱动程序简介:
.设备驱动程序提供的是机制,而不是策略 .设备驱动程序应该仅仅处理硬件,将如何使 用硬件的问题留给应用程序。 .运行于内核空间,是内核的一部分
Linux驱动程序分类 Linux驱动程序分类
字符型设备驱动 块设备驱动 网络设备驱动
使用blk_init_queue将块设备驱动的函数实 现挂接到相应的块设备队列; request函数根据输入的参数实现对实际物理 设备的读操作和写操作; 由系统内核决定何时调用request函数进行实 际的物理读写操作;
网络接口设备的移植
网络接口设备驱动简介 网络接口设备驱动简介
网络接口并不象字符和块设备那样存在于文件系统。 相反,它在核心层处理包的发送和接收,并不与进 程中的某个打开的文件绑定在一起,所以网络接口设 备不需要主设备号和次设备号。一个网络接口必须 在特定的数据结构中注册自己,从而在与外部世界 交换包时可以被调用。
字符型设备
• 可以象文件一样访问字符设备,字符设备驱动 程序负责实现这些行为 • 这样的驱动程序通常会实现open,close,read 和write系统调用 • 通过文件系统节点可以访问字符设备,例如 /dev/tty1和/dev/lp1 • 区别是:普通文件允许在其上来回读写,而大 多数字符设备仅仅是数据通道,只能顺序读写 • 字符设备通常是指存取时没有缓存的设备
Linux设备驱动的中断处理 Linux设备驱动的中断处理
Linux设备驱动的慢速中断处理的实现方式 设备驱动的慢速中断处理的实现方式
.mark_bh方法 在2.4版本以前常用的方法 .task_let方法 在2.4版本引入的新的方法,可以很方便的实现 慢速中断处理的机制。
Linux设备驱动的内存 Linux设备驱动的内存
网络接口设备的移植
网络驱动程序的核心数据结构net_device
该数据结构定义了所有网络设备驱动的属性和方法, 网络设备驱动在注册到系统时必须使用该数据结构。
网络驱动程序的注册函数register_netdevice
该函数将网络设备驱动注册到系统。使用net_device 数据结构做为参数。
网络接口设备的移植
Leabharlann Baidu谢
谢谢!
Linux设备驱动的常用调试技术 Linux设备驱动的常用调试技术
在Linux设备驱动的调试中,常用调试技术有: 打印信息调试: 类似于应用程序中的printf,在linux/kernel.h中定义了 8种记录级别串,Linux处理消息可以在任何地方调用 printk,因为printk函数是将消息写到一个长度为 printk printk LOG_BUF_LEN个字节的循环缓冲区中;