实验08 块设备驱动程序.pptVIP

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
主要内容 实验目的 实验内容 相关基本原理 实验参考过程 实验目的 了解Linux操作系统中的设备驱动程序的组成 编写简单的块设备驱动,并进行测试 理解Linux操作系统的设备管理机制 了解USB设备驱动编程 实验内容 编写一个简单的ramdisk块设备驱动程序。 要求该块设备包括open()、request()、ioctl()和release()等基本操作。 2、编写测试程序,验证驱动程序的工作正确性. 相关基本原理 Linux支持多种设备,它们的驱动有如下特点: 1、内核代码。设备驱动程序是内河的一部分、如果驱动出错,则很可嫩个导致系统崩溃。 2、内核接口。设备驱动程序必须为内核或者其子系统提供一个标准接口。 3、内核机制和服务。设备驱动程序使用一些标准的内核服务,如内存分配等。 4、可装载。大多数的Linux操作系统设备驱动程序都可以在需要时装载进内核,在不需要时从内核中卸载出来。 5、可设置。 Linux操作系统设备驱动程序可以集成为内核的一部分,并可以根据需要把其中的一部分集成到内核去,这只需要在编译时进行相应的设置即可。 相关基本原理 6、动态性。当系统启动且各个设备驱动程序初始化后,驱动程序将维护其控制的设备,该设备驱动程序控制的设备即使不存在也不影响系统的运行,此时的设备驱动程序只是多占用了一点系统内存罢了。 设备驱动程序与外界的接口 Linux设备驱动程序与外界的接口可以分为如下三个部分 驱动程序与操作系统内核的接口 驱动程序与系统引导的接口 驱动程序与设备的接口 设备驱动程序的组织结构 自动配置和初始化子程序。 服务于I/O请求的子程序。 中断服务自程序。 设备驱动的常见功能 1)驱动程序的注册与注销 2)设备的打开与释放 3)设备的读写操作 4)设备的控制操作 5)设备的中断和轮询处理 块设备驱动程序设计 块设备 块设备用于存储信息,基本单位为数据块,属于有结构设备。 块设备的基本入口点 主要的函数有:读写函数、request函数、ioctl函数、check_media_change函数、revalidate函数 块设备的注册 内核中的块设备驱动程序由一个主设备号来标识。不过,对于块设备驱动程序不仅在初始化的时候要尽心个注册,在程序退出的时候也要进行注册。对块设备驱动程序进行注册的调用格式为: int regeister_blkdev(unsigned int major,consot char* name,struct block_device_operations *bdops); 其中,major为主设备号,name为设备名字,bdops是指向具体块设备的指针。 如果正常将返回0,否则返回负值。 实验参考过程 1、编写一个简单的块设备驱动: 保存设备信息的数据结构为: Typedef struct Sbull_Dev{ void * *data; int quantum;//当前容量的大小 int qset;//当前数组的大小 unsigned long size; unsigned int new_msg; unsigned int usage;//当快设备正使用时加锁 unsigned int access_key;//由sbulluid 和 sbullprivshiv使用的存取字段 struct Sbull_Dev *next;//指向下一个设备 }; Extern struct sbull_dev *sbull;//块设备信息 实验参考过程-2 1)函数shull_open() Int shull_open(struct inode*inode,struct file*filp){ int num=MINOR(inode-i_rdev); if(num=sbull-size)return –ENODEV; sbull-size=sbull-size+num; if(!sbull-usage){ check_disk_change(inode-i_rdev); if(!*(sbull-data))return –ENOMEM; } sbull-usage++; MOD_INC_USE_COUNT; return 0; } 实验参考过程-3 2)函数sbull_ioctl() #includelinux/ioctl.h #includelinux/fs.h int sbull_ioctl(struct inode* inode,strcut file*filp,unsigned int cmd,unsigned long arg){ int err; struct hd_geometry *geo=(struct hd_geome

您可能关注的文档

文档评论(0)

一天一点 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档