- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验五设备管理
实验五 设备管理——Linux 设备驱动程序安装 实验目的 实验内容 实验准备 实验设计 参考代码 实验结果 思考题 实验目的 认识Linux的设备的种类和设备工作方式,理解设备驱动程序的工作原理,掌握设备驱动程序的编写规范,能编写并安装简单的设备驱动程序。 实验内容 在Linux系统中,编写一个简单的字符型设备驱动程序模块,设备具有独占特性,可执行读和写操作,相关系统调用为open, close, read, write,open和close分别相当于请求和释放设备,read和write内容保存在设备模块内的缓冲区中。设备模块可动态注册和卸载,并建立与之对应的特殊文件/dev/mydev。 实验准备 具有相同的主设备号和类型的设备文件都是由device_struct数据结构来描述的,该结构定义于fs/devices.c。 字符设备初始化函数为chr_dev_init(),包含在/linux/drivers/char/mem.c中,它的主要功能之一是在内核中登记设备驱动程序。具体调用是通过register_chrdev()函数。 编写模块程序的时候,必须提供两个函数,一个是int init_module(void),insmod加载此模块时自动调用init_module(void),负责进行设备驱动程序的初始化工作。init_module返回0以表示初始化成功,返回负数表示失败。另一个函数是void cleanup_module (void),在模块被卸载时调用,负责进行设备驱动程序的清除工作,卸载命令为rmmod dev-name。 在成功地向系统注册了设备驱动程序后(调用register_chrdev成功后),就可以用mknod命令来把设备映射为一个特别文件,其它程序使用这个设备时,只要对此特别文件进行操作即可。 由于内核空间和用户空间的不同,用户通过内核与设备交换数据的时,需要几个特殊函数,从核心空间到用户空间的复制函数为: unsigned?long?copy_to_user(void?*?to,?void?*from,?unsigned?long?len); 从用户空间到核心空间的复制函数为: unsigned?long?copy_from_user(void?*?to,?void?*from,?unsigned?long?len); 在编写程序的时候尤其要注意指针以及数组的使用,在内核部分如果出现内存泄露或者溢出的情况后果是极其严重的,初编驱动程序时尤其要注意。 编程时需要调用内核代码的头文件,这些文件在/usr/src目录下,一般以linux开头,在实验之前确认这些文件已经被安装,并且确认内核代码与当前系统内核版本是否一致 利用课余时间阅读内核源代码,注意其编程风格以及起头文件宏定义的处理,避免编写程序的时候发生一些不必要的问题。查阅资料学习已有例程,并且注意不同的系统版本代码编写的差异。同时掌握linux下对于模块操作的指令。 device_struct struct device_struct{ const char *name; struct file_operations *fops; }; 其中name是某类设备的名字,fops是文件 操作表的指针。 文件操作表数据结构 文件操作表提供一个设备驱动程序的入口点,其数据结构定义如下: #include linux/fs.h struct file_operations { ??????? int (*lseek)(struct inode *inode,struct file *filp, off_t off,int pos); ??????? int (*read)(struct inode *inode,struct file *filp, char *buf, int count); ??????? int (*write)(struct inode *inode,struct file *filp, char *buf,int count); ??????? int (*readdir)(struct inode
文档评论(0)