- 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模块和设备驱动程序
一. 实验目的
1. 通过实验了解linux 下文件驱动程序的框架;
2. 通过驱动程序的编写,理解linux对设备管理的方式;
3. 理解设备驱动程序中与内核交互部分。
二. 实验指导
Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它和dos或window环境下的驱动程序有很大的区别。
1. Linux 设备
在Linux中,用户进程不能直接对物理设备进行操作,必须通过系统调用向内核提出设备请求,由内核实现对物理设备的分配并完成进程请求的操作。在内核中实现对设备进行操作的一组程序称为设备驱动程序。系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口,为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:
1).对设备初始化和释放
2)把数据从内核传送到硬件和从硬件读取数据
3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据
4)检测和处理设备出现的错误
在Linux系统把设备分为3类:块设备、字符设备和网络设备。每类设备都有独特的管理控制方式和不同的驱动程序。
字符设备:以字符为单位进行输入输出的设备,并且以字符为单位对设备中的信息进行组织和处理。包括:显示器、键盘、打印机、绘图仪、串口等。通常对字符设备传送的数据是顺序处理。字符设备以访问文件的方式访问。
块设备:以一定大小的数据块为单位进行输入输出,设备中的数据也以物理块为单位进行组织和管理。块设备可以采取随机存取方法。包括硬盘、软盘、光盘、RAM盘等。通常作为外存使用,Linux文件系统建立在外存中,块设备通过文件系统访问。为匹配CPU与块设备间的速度差异,通常使用缓冲区传送数据。
网络设备:与网络通信线路连接的网络适配器。Linux使用套接口以文件I/O方式提供对网络数据的访问。
本实验主要介绍字符设备驱动程序的编写方法。
2. 有关设备操作的系统调用
在Linux系统中,应用程序操作设备就是访问设备对应的设备文件,与操作普通文件的访问方式基本相似。设备访问的系统调用主要如下:
打开设备系统调用open:实现分配和打开设备的功能;
读设备系统调用read:从设备读取数据;
写设备系统调用write:向设备写数据;
设备控制系统调用ioctl:控制设备的工作模式和状态;
关闭设备系统调用close:释放设备,将设备归还系统。
3. Linux设备驱动程序的构成
Linux系统的每个系统调用都有一个相应的内核函数实现该系统调用的功能。Linux设备驱动程序需要实现的内核函数由以下结构定义:
struct file_operations {
int (*lseek) (struct inode * ,struct file *, off_t ,int);
int (*read) (struct inode * ,struct file *, char * ,int); //读例程,实现读系统调用
int (*write) (struct inode * ,struct file *, const char * ,int); //写例程,实现读写系统调用
int (*readdir) (struct inode * ,struct file *, void *, filldir * ,int);
int (*select) (struct inode * ,struct file *, int ,select_table *);
int (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long); //控制例程,实现设备控制
int (*mmap) (struct inode * ,struct file *, struct vm_area_struct *);
int (*open) (struct inode * ,struct file *); //打开例程,打开设备
int (*release) (struct inode * ,struct file *); //释放例程,设备释放
int (*fsync) (struct inode * ,struct file *);
int (*fasync) (struct inode * ,struct file *,int);
int (*check_media_change) (kdev_t dev);
int (*revalidate
文档评论(0)