火龙果软件Linux驱动开发培训1汇编_第1页
火龙果软件Linux驱动开发培训1汇编_第2页
火龙果软件Linux驱动开发培训1汇编_第3页
火龙果软件Linux驱动开发培训1汇编_第4页
火龙果软件Linux驱动开发培训1汇编_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、The successs roadLinux设备(shbi)驱动高级开发共五十六页今天(jntin)的内容Linux驱动程序基础知识字符设备驱动程序用户与驱动程序同步阻塞(zs)I/O用ioctl控制驱动程序典型的字符设备驱动程序分析共五十六页Linux设备(shbi)驱动的概念驱动程序为硬件提供一个定义良好(lingho)的内部接口驱动程序封装了硬件细节驱动程序为应用程序提供了访问设备的机制共五十六页Linux设备和模块(m kui)的分类设备和模块的分类:字符设备,块设备,网络接口以及(yj)提供公共服务的特定类型设备另外有一些设备驱动比较特殊,比如 frame buffer, 共五十六页

2、设备(shbi)驱动健壮性和安全性驱动程序是内核的一部分驱动程序的漏洞和缺陷直接危及内核留心未初始化的指针(zhzhn),恶意用户程序,缓冲区溢出共五十六页驱动程序与内核(ni h)版本号Linux内核版本号简述 2.0.x 2.2.x 2.4.x 2.6.x版本号在内核编译过程中的影响(yngxing)模块加载时的版本号检查共五十六页Linux下构建(u jin)和运行模块为什么用模块?模块和应用程序有什么(shn me)不同#ifdef _KERNEL_#ifdef MODULEKernel 和 user space共五十六页Linux内核与模块(m kui)中的并发可重入简介(jin j

3、i)共享资源带来的问题并发与同步问题抢占式内核对并发的影响共五十六页模块的编译(biny)和装载编译模块(m kui)都需要什么编译模块相关的宏模块工具insmod,rmmod共五十六页Linux驱动程序模块(m kui)加载共五十六页模块(m kui)的版本依赖内核中定义_module_kernel_version符号版本号定义可以区分不同(b tn)版本内核的接口函数可以在include/linux/version.h找到版本定义KERNEL_VERSION共五十六页模块的平台(pngti)相关平台相关的实现条件编译平台开关与Makefile,Makefile里面会定义与平台相关的开关,驱

4、动程序开发者通过编写和配置(pizh)config文件实现对开关的控制一个实例分析 core-$(CONFIG_FPE_NWFPE) += arch/arm/nwfpe/共五十六页内核(ni h)符号表内核符号简介模块之间用符号连接(linji)在一起符号导出内核符号表 /proc/ksyms System.map共五十六页模块(m kui)初始化和关闭模块加载调用的第一个函数init_module模块所使用资源的分配与释放使用计数模块卸载和cleanup_module显式指定(zhdng)初始化和清除函数共五十六页驱动程序使用(shyng)的资源获取内存区域 kmallocIoport和io

5、mem资源的使用运行时动态分配iomem,ioport静态分配存储器和端口映射我该如何(rh)选择资源分配方式共五十六页典型的嵌入式设备(shbi)存储器映射共五十六页字符(z f)设备驱动程序分析主设备号和次设备号设备文件节点操作file operation结构驱动程序例子(l zi)scull的内存使用熟悉kmalloc,kfree共五十六页主设备(shbi)号和次设备(shbi)号mknod 创建设备文件字符(z f)设备文件例子crw-rw- 1 root uucp 4, 64 2005-03-20 03:36 /dev/ttyS0主设备号区分设备驱动程序用户程序调用open clos

6、e等操作,内核根据主设备号找到对应的驱动程序共五十六页主设备(shbi)号和次设备(shbi)号(2)次设备号区分同一个驱动程序创建的多个(du )设备常见于多个串口,硬盘分区等次设备号通常依次对应同类型多个设备主设备号次设备号hda131hda232hda333共五十六页动态分配主设备(shbi)号register_chrdev注册动态主设备号动态分配主设备号的优缺点/proc/devices和lsmod动态生成(shn chn)设备文件系统节点dev_t和kdev_t共五十六页file_opration结构(jigu)分析file_opration在内核(ni h)中定义linux/fs.

7、hstruct filemode_t f_modeloff_t f_posunsigned int f_flagsstruct file_operations *f_opvoid *private_datastruct dentry *f_dentry共五十六页file_operationsint(*open)(struct inode*,struct file *)增加使用计数,检查错误如果未初始化,则调用初始化识别次设备号,如果必要,更新f_op指针(zhzhn)分配并填写被置于filp-private_data的数据结构int(*realse)(struct inode*,struct

8、file*)进行open的逆操作共五十六页例子(l zi)驱动scull的内存使用scull采用kmalloc和kfree另一种分配内存的方法(fngf)使用面向页的函数共五十六页例子驱动scull的访问(fngwn)竞争分析Copy on write竞争(jngzhng)Write on write竞争同步手段信号量和互斥量PV up() down()共五十六页file_operationsssize_t (*read)(struct file*,char *,size_t,loff_t*)size_t(*write)(struct file*,const char*,size_t,loff

9、_t*)用户空间(kngjin)指针和内核指针向量化的readv,writev共五十六页file_operationsSsize_t (*llseek)(struct file *, loff_t*, int )该方法执行seeking操作,移动当前(dngqin)的文件读写指针loff_t是64位量共五十六页file_operationsunsigned int (*poll) (struct file*, struct poll_table_struct *)poll方法用来查询设备是否可读,可写或出于某种特殊状态(ready or not)该系统调用是可阻塞的poll 和 select系

10、统调用的后端实现(shxin)依赖该该方法共五十六页file_operationsint(*ioctl)(struct inode*,struct file*,unsigned int,unsigned long)ioctl实现了除标准(biozhn)io操作外其他各种操作的方法Ioctl定义依不同驱动程序而异共五十六页file_operationsint(*flush)(struct file*)flush执行设备(shbi)上为完成的操作flush用于NFS代码中一般的设备驱动可以不实现该方法,(flush=NULL)共五十六页file_operationsint (*mmap)(stru

11、ct file*, struct vm_area_struct*)该方法用于将设备内存区映射到进程(jnchng)的地址空间framebuffer,sound,capture等驱动是典型的例子共五十六页file_operationsint (*fsync)(struct file*, struct dentry *, int)fsync是fsync系统调用的后端实现应用程序用它来刷新(shu xn)待处理的数据共五十六页访问(fngwn)设备驱动程序的方法devfs简介devfs的兼容性动态设备(shbi)文件节点的另一种实现方法自动脚本proc简介sysfs简介共五十六页阻塞(zs)型I/O

12、简介用户程序和硬件设备需要同步软件要知道什么时候数据(shj)会到来通常的实现方法是软件处于睡眠状态,有数据到来时进行处理,然后继续睡眠Linux通过等待队列wait queue,实现了几总不同的睡眠方式共五十六页阻塞(zs)进程的睡眠sleep_on(wait_queue_head_t *queue);将当前进程置入等待队列(duli),并且处于睡眠状态中的进程不能被killinterruptible_sleep_on(wait_queue_head_t *queue);将当前进程置入等待队列并且可中断,处于睡眠状态中的进程可以被killsleep_on_timeout(wait_queue

13、_head_t *queue, long timeout);interruptible_sleep_on_timeout(wait_queue_head_t *queue,long timeout);这两个函数与前两个类似,只是多加了超时机制。即进程的睡眠时间不超过timeout中指定的“jiffy”值。共五十六页阻塞进程(jnchng)的睡眠(2)void wait_event(wait_queue_head_t queue, int condition);int wait_event_interruptible(wait_queue_head_t queue, int condition)

14、;这两个宏用来让进程进入睡眠直到condition条件(tiojin)到来。Condition可以是任意条件表达式共五十六页阻塞(zs)进程的唤醒wake_up(wait_queue_head_t *queue);唤醒所有等queue队列的进程(jnchng)wake_up_interruptible(wait_queue_head_t *queue);只唤醒可等待队列里可中断进程wake_up_sync(wait_queue_head_t *queue);wake_up_interruptible_sync(wait_queue_head_t *queue);这两个函数与前两个类似,只是他们

15、让等待进程置入可运行队列,而不是立刻重新调度共五十六页深入(shnr)等待队列驱动程序可以直接操作wait queue简单的流程如下:初始化一个wait_queque_t wait将进程当前状态置为睡眠状态将wait加入到等待队列中调用shedule()并开始睡眠当前进程会一直睡眠直到外部(wib)改变了当前进程的运行状态唤醒后中队列中删除wait共五十六页阻塞I/O驱动(q dn)的可重入编写技巧当驱动程序被访问,并且用户进程进入睡眠状态以后,我们要求别的进程可以继续访问驱动程序在此情况下,我们可以编写可重入驱动主要的思想是将状态量保存在驱动程序实例的局部变量里,而非全局变量不同(b tn)

16、进程访问驱动程序,其中的局部变量保存在该进程的栈当中共五十六页阻塞(zs)I/O和非阻塞I/O对比完全(wnqun)功能的读写操作包括非阻塞的read和write,使用O_NONBLOCK标志打开调用阻塞read时,如果没有数据可读,用户进程就会进入睡眠状态知道有数据可读当调用非阻塞read时,如果没有数据可读,read马上返回-EAGAIN,这样就提供了用户进程查询设备的机制阻塞与非阻塞I/O只影响open,read,write着三个函数共五十六页阻塞I/O的实例(shl)分析例子(l zi)程序scullpipe实现了上面介绍的技术Scullpipe的驱动结构如下typedef struc

17、t Scull_Pipe wait_queue_head_t inq, outq; /* read and write queues */char *buffer, *end; /* begin of buf, end of buf */int buffersize; /* used in pointer arithmetic */char *rp, *wp; /* where to read, where to write */int nreaders, nwriters; /* number of openings for r/w */struct fasync_struct *async

18、_queue; /* asynchronous readers */struct semaphore sem; /* mutual exclusion semaphore */devfs_handle_t handle; /* only used if devfs is there */ Scull_Pipe;共五十六页阻塞I/O的实例(shl)分析(2)ssize_t scull_p_read (struct file *filp, char *buf, size_t count,loff_t *f_pos).if (filp-f_flags & O_NONBLOCK)return -EAG

19、AIN;PDEBUG(%s reading: going to sleepn, current-comm);if (wait_event_interruptible(dev-inq, (dev-rp != dev-wp)return -ERESTARTSYS; dev-rp += count;if (dev-rp = dev-end)dev-rp = dev-buffer; /* wrapped */up (&dev-sem);共五十六页字符(z f)设备定位字符设备定位通过设备驱动llseek方法实现llseek方法修改filp-f_pos来改变设备当前的定位定位对有明确(mngqu)数据区

20、的设备有意义,而对面向数据流的设备无意义共五十六页字符(z f)设备访问控制访问控制可以防止未授权用户使用设备,这种控制通过设置(shzh)文件系统权限来实现最简单实现访问控制是一次只允许一个进程打开设备用一个标志变量来指示当前设备是否已经被打开若已经打开则拒绝新的打开操作共五十六页全局标志的竞争(jngzhng)问题在上例中,如果有两个进程试图同时打开(d ki)设备,则他们有可能同时测试全局标志,并同时成功打开(d ki)。为了避免这种情况发生,我们可以以原子操作的形式修改标志使用自旋锁比较适合此处使用共五十六页限制每次只有一个用户(yngh)访问此种实现允许一个用户多次打开设备维护数据结

21、构的完整性由用户来完成用户第一次打开设备时授权,并记录下设备的属主。该用户可以(ky)对此打开设备其他用户试图再打开设备时,UID检查结果会拒绝打开,并返回-EBUSY,指示设备忙共五十六页用阻塞(zs)open代替EBUSY有些情况下,设备忙时最好让用户稍延迟一会儿而不是返回失败可以用阻塞型的open来实现当用户试图打开设备时,如果设备忙,则把当前进程置入等待队列当前一个用户使用完设备,使用计数(j sh)减到0时,下一个用户睡眠的进程将被唤醒共五十六页Ioctl简介(jin ji)驱动程序支持除了标准的操作,往往还需要支持各种控制命令由此引入和一个重要(zhngyo)的命令操作机制ioct

22、lIoctl相对于使用标准I/O来控制设备有很多好处比如,不用保留特殊关键字符作控制控制处理代码编写明晰,驱动程序和用户程序同时受益于此共五十六页怎样(znyng)使用ioctl用户应用程序调用int ioctl(int fd, int cmd, .);设备驱动程序里实现ioctl方法(fngf)int (*ioctl) (struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg);编码上容易采用switchcase实现各种不同的命令处理共五十六页Ioctl命令(mng lng)实例CDROMEJECT

23、CDROM_SET_SPEEDHDIO_SET_DMAHDIO_GET_DMA串口的ioctl,TIO族TIOCMIWAIT等等(dn dn)共五十六页Ioctl参数(cnsh)用法如果参数是整数,在驱动的ioctl方法里面可以直接使用如果参数是指针,驱动程序首先要检查指针的合法性我们(w men)可以使用int access_ok(int type, const void *addr, unsigned long size);检查通过后,我们可以使用put_user(datum, ptr)put_user(datum, ptr)这两个宏用来访问用户传递来的指针共五十六页Ioctl权能(qun

24、nng)和受限操作驱动程序的访问控制采用(ciyng)linux文件系统的权限机制驱动程序采用权能机制来控制特殊的操作权限驱动程序通过int capable(int capability);函数来确定调用进程是否有权执行操作共五十六页驱动程序当中(dngzhng)如何实现ioctlioctl(,int cmd,)cmd变量存储了IOCTL命令处理代码直接判断cmd里面的内容,来决定(judng)程序处理分支。共五十六页用ioctl控制驱动程序实例(shl)分析int scull_ioctl(struct inode *inode, struct file *filp, unsigned int

25、 cmd, unsigned long arg)int err = 0, tmp;int retval = 0; if (_IOC_TYPE(cmd) != SCULL_IOC_MAGIC) return -ENOTTY;if (_IOC_NR(cmd) SCULL_IOC_MAXNR) return -ENOTTY;if (_IOC_DIR(cmd) & _IOC_READ)err = !access_ok(VERIFY_WRITE, (void _user *)arg, _IOC_SIZE(cmd);else if (_IOC_DIR(cmd) & _IOC_WRITE)err = !access_ok(VERIFY_READ, (void _user *)arg, _IOC_SIZE(cmd);if (err) return -EFAULT;共五十六页用ioctl控

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论