网站大量收购独家精品文档,联系QQ:2885784924
  1. 1、本文档共17页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
字符驱动

驱动 驱动程序的地位 ??? ?? 应用程序 ?? 应系统调用 ?? 内核 ?? 驱动 ?? 硬件 计算机 驱使硬件设备行动 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。 驱动分类 字符设备:按照字符流串行顺序依次进行访问的设备,如触摸屏,鼠标等。 块设备:按照任意顺序进行访问,以块为单位进行操作,硬盘,光驱等。 网络设备:面向数据包的接收和发送。如网卡。 驱动程序的功能 设备驱动程序是内核的一部分,它完成以下的功能: 1.对设备初始化和释放。 2.把数据从内核传送到硬件和从硬件读取数据。 3.检测和处理设备出现的错误。 注意: 在用户进程调用驱动程序时,系统进入核心态,这时不再是抢占式 调度。也就是说,系统必须在驱动程序的子函数返回后才能进行其他的工作。如果驱动程序陷入死循环,只有重新启动机器了。 加载驱动程序 方法一:把驱动程序编译到linux内核里面。 缺点: 内核过于庞大。 如果添加新功能或删除旧功能,需要重新编译内核。 方法二:把驱动程序编译成内核模块,然后挂载到内核里面。 特点: 模块可以不被编译到内核映像,控制了内核大小。 模块可以方便的加载,卸载。 内核模块相关操作命令 lsmod lsmod显示当前加载的所有模块,相当于cat /proc/modules。 modinfo 用于查看模块的详细信息 insmod 加载模块至内存空间。(加载成功后,可以用命令 cat /proc/devices 查看加载的虚拟设备) modprobe? 加载模块,不过modprobe能够处理 module 载入的相依问题。 比如要载入 a module,但是 a module 要求系统先载入 b module 时,直接用insmod挂入通常都会出现错误讯息,modprobe 能够 知道先载入b module后才载入a module,如此相依性就会满足。 modprobe之所以会知道模块之间的相依性,是通过读取 /lib/modules/`uname -r`/modules.dep得知的。 rmmod 删除模块。(删除的模块名与加载的模块名相同,注意此处不是 设备名) 主/次设备号 用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都有其文件属性(c/b),表示是字符设备还是块设备。另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。 在内核中,dev_t类型用来保存设备编号(包括主设备号和次设备号),dev_t是一个32位的无符号长整型数,12位表示主设备号,20位表示次设备号。 (1)主设备号?= MAJOR(dev_t dev) (2)次设备号?= MINOR(dev_t dev) (3)设备编号?= MKDEV(int major,int minor) 字符设备驱动程序编写过程 字符设备驱动程序共分为三部分: 实现操作设备函数的代码: 完成对设备的读写等操作,读写等操作函数需要自己编写,通过 struct file_operations结构体完成内核对设备读写操作的映射。 模块初始化代码: 在初始化代码 中主要完成向内核注册设备功能,通过函数 register_chrdev()(老版本)或者register_chrdev_region()(新版本)函数 实现。 卸载模块代码: 完成模块的卸载,通过unregister_chrdev()函数实现。 实现操作设备函数 struct file_operations{ struct module *owner;//拥有该模块的指针,一般THIS_MODULE loff_t (*llseek) (struct file*, loff_t,int);//修改文件当前的读写位置 ssize_t (*read)(struct file *,char *, size_t, loff_t *);//从设备读取数据 ssize_t (*write)(struct file *,const char *, size_t, loff_t *);//向设备发送数据 int (*open) (struct ino

文档评论(0)

little28 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档