实验8,驱动程序的编写,驱动程序一用户空间和内核空间的通信_第1页
实验8,驱动程序的编写,驱动程序一用户空间和内核空间的通信_第2页
实验8,驱动程序的编写,驱动程序一用户空间和内核空间的通信_第3页
实验8,驱动程序的编写,驱动程序一用户空间和内核空间的通信_第4页
实验8,驱动程序的编写,驱动程序一用户空间和内核空间的通信_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验8用户空间和内核空间的通信一、实验目的:学习利用编写驱动程序,完成用户空间和内核空间的通信,加载驱动模块、显示驱动模块,卸载驱动 模块。二、实验内容前面学习了 bootloader kernel filesystem,进行过内核的移植,根文件系统的制作,现在进行驱动 程序的编写,完成用户空间和内核空间的通信。#su root切换root权限密码123456通过第一个hello world驱动程序,我们学会了驱动程序的框架。知道了,如何编译,如何加载,如何卸载一个驱动程序。接下来我们来做一个完整的驱动程序Demo_Driver.c#i ncludevli nux/kernel.h>#i

2、n clude<li nux/ ini t.h>#i ncludevli nux/fs.h>#i ncludevli nux/module.h>#defi ne Demo_MAJOR 98定义主设备号#defi ne Demo_DEBUG#defi ne VERSION"Demo_Driver" void showvers in( void)prin tk(KERN_EMERG'I*n");pri ntk(KERN_EMERG"tVERSIONtn");prin tk(KERN_EMERG'I*n&quo

3、t;);/static int Demo_temp_cou nt=O;size_t Demo_read(struct file *file,char *buf,size_t cou nt,loff_t *f_ops)#ifdef Demo DEBUGpri ntk(KERN_EMERG"Demo_read-ker nel-n");#en difretur n cou nt;size_t Demo_write(struct file *file,c onst char *buf,size_t cou nt,loff_t * f_ops)#ifdef Demo_DEBUGpri

4、n tk(KERN_EMERG"Demo_write-kernel-n");#en difretur n cou nt;int Demo_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long data)#ifdef Demo_DEBUGprin tk(KERN_EMERG"Demo_ioctl-kern el-n");#en difreturn 0;int Demo_open(struct inode * inode,struct file * file)#i

5、fdef Demo_DEBUGprin tk(KERN_EMERG"Demo_ope n -ker nel-n");#en difMOD_INC_USE_COUNT;return 0;int Demo_release(struct inode *inode,struct file *file)#ifdef Demo_DEBUGpri ntk(KERN_EMERG"Demo_release-kernel-n");#en difMOD_DEC_USE_COUNT;return 0; struct file_operati ons Test_ctl_ops=.

6、ope n=Demo_ope n.read= Demo_read,.write= Demo_write,.ioctl= Demo_ioctl,release: Demo_release,;astatic int HW_Test_CTL_i ni t(void)in t ret = -ENODEV;ret = register_chrdev(Demo_MAJOR,"demo_drv", &Test_ctl_ops);if(retvO)printk(KERN_EMERG"Demo_module failed with %dn-kernel-",ret

7、);return ret;elsepr in tk(KERN_EMERG"Demo_driver register success!-ker nel-n");pri ntk("n.nret=%xn.n",ret);showversi n()订return ret;static int Demo_Test_CTL_i nit(void)in t ret = -ENODEV;#ifdef Demo_DEBUGprin tk(KERN_EMERG"Demo_Test_CTL_i nit-kerinel-n “);#en difret = HW_Tes

8、t_CTL_i nit();if(ret)return ret;return 0;static void clea nup_Test_ctl(void)#ifdef Demo_DEBUGprin tk(KERN_EMERG"clea nup_INT_CTL-kernel-n");#en difun register_chrdev(Demo_MAJOR,"demo_drv");MODULE_DESCRIPTION("simple int drive module");MODULE_LICENSE("GPL");mod

9、ulenit(Demo_Test_CTL_i nit);module_exit(clea nup_Test_ctl);相比于hello world驱动程序,上面这个程序更加完整。首先要介绍一个重要的结构体structfile_operati ons fops=read: device_read;write: device_write;ope n: device_ope n;release: device_release;它的原型在 <include/linux/fs.h> 中struct file_operati onsstruct module * owner;loff_t (*

10、llseek)();ssize_t(*read)();ssize_t(*aio_read)();ssize_te(*write)();在结构体file_operations门中,每一个成员的名字都对应一个系统调用,对应着设备驱动程序提供的入口位置使用方法如第一个file_operationsread : device_read ;这样我们在应用程序中调用read ()对设备文件进行操作时,驱动程序就会直接调用 device_read ()来进行读操作了。现在我们知道了,应用程序中的函数是怎么与驱动程序中的操作函数对应起来了。那么驱动程序中的操作函数是如何连接到设备文件上的呢?靠register

11、_chrdev ()注册我们的设备如上面代码:ret = register_chrdev(Demo_MAJOR,"demo_drv", &Test_ctl_ops);第一个参数是我们的主设备号,第二个是我们要注册的设备的设备名,第三个是我们建立的结构体file_operations 。这三个参数都是有重要作用的。第一个主设备号是内核识别我们设备的标志,内核通过主设备号识别我们的设备文件。第二个是我们要注册的设备名,这个参数要与我们在/dev目录下建立的设备文件名一致,这样我们才可以打开设备文件。第三个是我们的结构体,它建立设备文件到设备操作函数的对应关系。另外一个函

12、数是:un register_chrdev()un register_chrdev(Demo_MAJOR,"demo_drv");用来卸载我们的设备。Makefile代码如下:KERNELDIR ?= /lib/modules/2.6.25-14.fc9.i686/build/PWD := $(shell pwd)#CC=$(CROSS_COMPILE)gcc obj-m :=Demo_Driver.o modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules modules_i nstall:$(MAKE) -C $(KERNELD

13、IR) M=$(PWD) modules_i nstall然后执行命令:make得到我们要加载的模块 Demo_Driver.ko这时候需要我们建立一个设备节点,也就是/dev/目录下的设备文件mknod /dev/demo_drv c 980第二个命令参数是我们注册的设备名p是fifo文件第三个命令参数是c代表char字符型设备b代表block块设备 u是unbuff第四个参数是主设备号,第五个参数是次设备号接着我们编写一个应用程序进行一下测试test_drive.c#in clude<stdlib.h>#i nclude<stdio.h>#in cludevstri

14、 ng.h>#in cludevfc ntl.h>#in clude<u ni std.h>#defi ne DEVICE_NAME "/dev/demo_drv"int mai n()int fd;in t ret;char *i;printf("nstart Demo_driver testnn");fd=ope n(DEVICE_NAME,O_RDWR);pri ntf("fd=%dn",fd);if(fd=-1)printf("open device %s errorn",DEVICE_NAME);elseread(fd,NULL,O);write(fd,NULL,O);ioctl(fd);re

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论