《实验七-IO设备驱动.ppt》由会员分享,可在线阅读,更多相关《实验七-IO设备驱动.ppt(21页珍藏版)》请在三一办公上搜索。
1、1,实验七I/O设备驱动,王兴隆,2013年8月,2,实验目的实验原理实验内容,3,7.1实验目的,读懂I/O设备驱动代码,理解内核态与用户态的联系练习使用I/O设备用户态函数接口,4,7.2实验原理,用户态I/O设备操作函数字符设备驱动介绍,5,用户态I/O操作函数,6,open函数,7,close函数,8,read函数,9,write函数,10,范例7.1,#include#include#include#includemain()int fd,size;char s=”Linux Programmer!n”,buffer80;fd=open(“/tmp/temp”,O_WRONLY|O_
2、CREAT);write(fd,s,sizeof(s);close(fd);fd=open(“/tmp/temp”,O_RDONLY);size=read(fd,buffer,sizeof(buffer);close(fd);printf(“%s”,buffer);,11,ioctl函数,ioctl用于向设备发控制和配置命令,有些命令也需要读写一些数据,但这些数据是不能用read/write读写的。fd是设备的文件描述符。request是ioctl的命令,可变参数取决于request,通常是一个指向变量或结构体的指针。若出错则返回-1,成功返回值取决于request。,#include int
3、 ioctl(int fd,int request,),12,范例7.2,/利用ioctl获得终端窗口大小#include#include#include#include int main()struct winsize size;if(ioctl(STDOUT_FILENO,TIOCGWINSZ,13,字符设备驱动介绍,linux驱动程序分为两种形式:直接编译进内核编译成module形式,需要时手动加载module驱动的工作流程分为四部分:用linux提供的命令加载modulemodule初始化用户操作设备时,调用module提供的各种服务函数module卸载,14,module加载,源代码
4、参见MyStrDev.c使用insmod./MyStrDev.ko 加载modulelinux内核调用宏module_init(MyStrDev_init)进行初始化,其中MyStrDev_init是一个函数指针,初始化工作由此函数完成。,15,module初始化,MyStrDev_init函数功能分配并注册主设备号和次设备号初始化代表设备的结构体:MyStrDev_dev*dev初始化设备在内核中的cdev结构体structcdev structkobjectkobj;/由cdev_init设置structmodule*owner;/设为THIS_MODULEconststructfile_
5、operations*ops;/由cdev_init设置structlist_headlist;/由cdev_init设置 dev_tdev;/由cdev_add设置 unsignedintcount;/由cdev_add设置;,16,设备操作,在定义的结构体file_operations用来存储驱动内核模块对设备进行各种操作的函数的指针。,struct file_operations struct module*owner;int(*open)(struct inode*,struct file*);int(*release)(struct inode*,struct file*);ssiz
6、e_t(*read)(struct file*,char _user*,size_t,loff_t*);ssize_t(*write)(struct file*,const char _user*,size_t,loff_t*);int(*ioctl)(struct inode*,struct file*,unsigned int,unsigned long);,17,module卸载,使用rmmod MyStrDev卸载module内核调用module_exit(MyStrDev_exit)进行卸载,其中MyStrDev_exit是一个函数指针,卸载工作由此函数完成。,18,7.3 实验内容,阅读MyStrDev.c程序代码,理解程序功能。编译程序,学会加载和卸载驱动。编写用户态程序,验证你对程序功能的理解。,19,实验评价,读懂源程序,了解驱动程序编写的框架学会加载和卸载驱动编写用户态测试程序,调用用户态下的open、close、read、write、ioctl函数,验证自己对程序的理解是否正确,20,实验参考,关于字符驱动程序更详细的介绍请参考 请将MystrDev.c和Makefile文件放在同一文件夹下驱动加载和卸载的详细命令请参考cmd.txt,谢谢大家!,