中南大学操作系统设备驱动程序设计实验报告
更新时间:2023-04-27 22:33:01 阅读量: 实用文档 文档下载
- 操作系统通过与应用软件推荐度:
- 相关推荐
中南大学操作系统设备驱动程序设计实验报告
中南大学
操作系统课程设计
实验报告
选题: 设备驱动程序设计
一、概述:设计主要完成的任务与解决的主要问题;
1、任务:设备驱动程序设计, 要求如下:
(1)设计Windows XP或者Linux操作系统下的设备驱动程序;
(2)设备类型可以就是字符设备、块设备或者网络设备;
(3)设备可以就是虚拟的也可以就是实际设备;
(4)编写测试应用程序,测试对该设备的读写等操作、
中南大学操作系统设备驱动程序设计实验报告
2、解决的主要问题:
(1)各个相关函数的重写
(2)虚拟字符设备的挂载
(3)虚拟字符设备的测试
二.设计的基本概念与原理;
1.基本概念
(1)Linux系统设备概述
Linux核心与设备驱动之间有一个以标准方式进行互操作的接口。每一类设备(字符设备、块设备以及网络设备)都提供了通用接口,以便在需要时为内核提供服务。这种通用接口使得内核可以以相同的方式来对待不同的设备以及设备驱动。
设备驱动程序只就是处理硬件,将如何使用硬件的问题留给应用程序。可以从不同的角度来瞧待设备驱动程序:它就是位于应用层与实际设备之间的软件。设备驱动程序在Linux内核中扮演着特殊的角色,它们就是一个个独立的“黑盒子”,使某个特定的硬件响应一个定义良好的内部编程接口,同时完全隐藏了设备的工作细节。用户操作通过一组标准化的调用完成,而这些调用就是与特定的驱动程序无关的。将这些调用映射到作用于实际硬件的设备特定的操作上,则就是设备驱动程序的任务。
针对不同的设备驱动程序分为3类:字符设备驱动、块设备驱动、网络设备驱动。
(2)字符设备
可以像文件一样访问字符设备,字符设备驱动程序负责实现这些行为。这样的驱程序通常实现open、close、read与write系统调用。
通过文件系统节点可以访问字符设备,例如/dev/tty1与/dev/lp1。
在字符设备与普通文件系统间的唯一区别就是:普通文件允许在其上来回读写,而大多数字符设备仅仅就是数据通道,只能顺序读写。
当然,也存在这样的字符设备,瞧起来像个数据区,可以来回读取其中的数据。
(3)设备驱动程序
设备驱动程序就就是一组由内核中的相关子例程与数据组成的I\O设备软件接口。
每当内核意识到要对某个设备进行特殊的操作时,它就调用相应的驱动例程。这就使得控制从用户进程转移到了驱动例程,当驱动例程完成后又被返回至用户进程。
(4)模块化
Linux中的可加载模块(module)就是Linux内核支持的动态可加载模块,她们就是核心的一部分(通常就是设备驱动程序),单就是并没编译到核心里面去。Module可以单独编译成为目标代码,module就是个目标文件。它可以根据需要在系统启动后动态地加载到系统核心之中。当module不再被需要时,可以动态地卸载出系统核心。在Linux中大多数设备驱动程序或文件系统都就是作为module的。超级用户可以通过insmod与rmmod命令显示地将module载入核心或者卸载。
2、原理
系统调用就是操作系统内核、应用程序之间的接口,设备驱动程序就是操作系统内核、机器硬件之间的接口。设备为应用程序屏蔽了硬件的细节,这样从应用程序瞧来,硬件设备只就是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。
设备驱动程序就是内核的一部分,它完成以下的功能:
(1)对设备初始化与释放
中南大学操作系统设备驱动程序设计实验报告
(2)把数据从内核传送到硬件与从硬件读取数据
(3)读取应用程序传送给设备文件的数据与回送应用程序请求的数据
(4)检测与处理设备出现的错误
另外,为了让驱动程序能够正常的工作,操作系统内核为驱动程序提供一系列的支持,这些支持包括许多方面。例如,驱动程序需要向内核申请使用系统内存,驱动程序需要向内核申请使用系统硬件资源,驱动程序需要向内核注册自己。
下面就是内核提供的可供驱动程序使用的几个重要的函数。
(1)内存分配函数kmalloc
(2)I/O端口相关函数request_region、release_region、check_region等
(3)内核打印函数printk
此外操作系统将每个外部设备当做文件来处理,内核通过结构来访问driver的功能。
的定义在文件
每个字符设备都有一个结构。这个结构指向一组操作函数(open、read、、、)。每个函数的定义由driver提供。当然,有些标准操作某些设备并不支持,这时,结构中对应的表项为NULL。随着Linux内核的不断升级,结构也不断变大。在最新的版本中,函数原型也发生了一些变化。当然,新版本总会向下兼容。
这个结构每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这就是Linux 的设备驱动程序工作的基本原理。既然就是这样,则编写设备驱动程序的主要工作就就是编写子函数,并填写的各个域。
三.总体设计:实现的方法与主要技术路线;
预先设计好内存大小,利用Linux内核提供的几个重要函数,为自己的虚拟字符设备申请设备号,进行内存分配,进行cdev的注册,重写cdev中的结构中的write、read、open、close 等方法,以实现自定义的对设备的读写操作。最后,当不用设备时,利用Linux的rmmod命令将该字符设备卸载。
四、详细设计;
字符设备结构
struct globalmem_dev
{
struct cdev cdev;/*cdev 结构体*/
unsigned int count;
}
1、模块加载
(1)在globalmem_init(void)中先申请设备号、后分配内存,最后进行cdev的注册。这
三个步骤Linux内核都有提供相应的基本函数以来完成,直接调用即可。
(2)cdev的注册通过globalmem_setup_cdev函数完成,在其中把我们自定义的结构连
中南大学操作系统设备驱动程序设计实验报告
接到cdev中的中
(3)将自定义的模块初始化注册方法放到module_init()中
函数如下:
/*初始化并注册cdev*/
static void globalmem_setup_cdev(struct globalmem_dev *dev,int index)
{
printk(KERN_INFO "globalmem_setup_cdev() begin\n");
int err,devno=MKDEV(globalmem_major,index);
cdev_init(&dev->cdev,&globalmem_fops);
dev->cdev、owner=THIS_MODULE;
dev->cdev、ops=&globalmem_fops; err=cdev_add(&dev->cdev,devno,1);
if(err) printk(KERN_NOTICE "Error %d adding LED %d",err,index);
}
/*初始化加载模块*/
int globalmem_init(void)
{
printk(KERN_INFO "globalmem_init() begin\n");
int result;
dev_t devno= MKDEV(globalmem_major,0);
if(globalmem_major){
result=register_chrdev_region(devno,1,"globalmem");
}
else{
result=alloc_chrdev_region(&devno,0,1,"globalmem");
globalmem_major=MAJOR(devno);
}
if(result<0) return result;
globalmem_devp = kmalloc(sizeof(struct globalmem_dev),GFP_KERNEL);
if(!globalmem_devp){
result=ENOMEM;
goto fail_malloc;
}
memset(globalmem_devp,0,sizeof(struct globalmem_dev));
globalmem_setup_cdev(globalmem_devp,0);
return 0;
fail_malloc:
unregister_chrdev_region(devno,1);
return result;
}
2.设备操作
自己重写write、read、open、close方法,然后就像填表一样放到自己声明的中,再把该结构体连接到cdev的结构中。
(1)文件打开
利用Linux调用打开方法时传入的参数,将其中的指向这一设备的文件的私有数据
正在阅读:
中南大学操作系统设备驱动程序设计实验报告04-27
高考作文经典素材之时代先锋03-08
公司年会主持词串词04-30
第一学期计算机应用基础试题11-13
在第二十期青干班开学典礼上的讲话09-12
浅谈如何当好一名电力中层干部第2页12-10
六语上8《爱之链》滕州滨湖望重01-24
特殊旅客服务技巧论文05-07
菏泽市初级中学武术教学现状及发展对策浅析12-06
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 中南大学
- 设备驱动
- 程序设计
- 操作系统
- 实验
- 报告
- 冬奥会主题班会案例
- 人教版七年级数学下册8二元一次方程组小专题三二元一次方程组的实际应用习题新版新人教版8233
- 七年级数学上册《有理数的乘法和除法》教案 北师大版
- 济南银丰唐郡中式风格家庭装修设计---济南万泰装饰公司
- 2018年上海师范大学数理学院333教育综合之教育学基础考研基础五套测试题
- 2020年春季学期云南省义务教育地方课程系列教材一年级下册《童眼看云南》教案教学设计
- 电大心理学形成性考核册1—4答案(全)
- 小班建构游戏小动物的家教案
- 2017届高考物理二轮专题突破专题十选考部分(2)机械振动与机械波光导学案
- 欣赏文学之宋元明清文学
- A-P-035_耐酸性磺酸类共聚物的合成
- 2018年天津商业大学商学院436资产评估专业基础之资产评估学教程考研冲刺五套模拟题
- 热轧窄带钢压下规程设计
- 烧机砖项目可行性研究报告(技术工艺+设备选型+财务概算+厂区规划)方案设计
- 信息技术与高中化学实验教学整合探析
- 库存产品定期盘点制度标准范本
- 融资主管笔试题及答案
- 广东省2014高考英语二轮复习专项训练阅读理解三十三
- 浙江重点项目-杭州师范大学仓前校区(一期、二期)建设工程项目可行性研究报告
- XX公司员工手册范本