- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验二:字符设备驱动实验
实验二:字符设备驱动实验
一、实验目的
通过本实验的学习,了解Linux操作系统中的字符设备驱动程序结构,并能编写简单的字符设备的驱动程序以及对所编写的设备驱动程序进行测试,最终了解Linux操作系统如何管理字符设备。
二、准备知识
字符设备驱动程序主要包括初始化字符设备、字符设备的I/O调用和中断服务程序。在字符设备驱动程序的file_operations结构中,需要定义字符设备的基本入口点。
open()函数;
release()函数
read()函数
write()函数
ioctl()函数
select()函数。
另外,注册字符设备驱动程序的函数为register_chrdev()。register_chrdev() 原型如下:
int register_chrdev(unsigned int major, //主设备号
const char *name, //设备名称
struct file_operations *ops); //指向设备操作函数指针
其中major是设备驱动程序向系统申请的主设备号。如果major为0,则系统为该驱动程序动态分配一个空闲的主设备号。name是设备名称,ops是指向设备操作函数的指针。
注销字符设备驱动程序的函数是unregister_chrdev(),原型如下:
int unregister_chrdev(unsigned int major,const char *name);
字符设备注册后,必须在文件系统中为其创建一个设备文件。该设备文件可以在/dev目录中创建,每个设备文件代表一个具体的设备。
使用mknod命令来创建设备文件。创建设备文件时需要使用设备的主设备号和从设备号作为参数。
阅读教材相关章节知识,了解字符设备的驱动程序结构。根据教材提供的实例。编写一个简单的字符设备驱动程序。要求该字符设备包括open()、write()、read()、ioctl()和release()五个基本操作,并编写一个测试程序来测试所编写的字符设备驱动程序。
驱动程序编写后,编写一个Makefile文件来编译此驱动程序。
Makefile格式如下:
obj-m:=mydev.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean
使用#insmod ***.ko来安装此驱动程序。并通过#cat /proc/devices 命令查看新加载设备的设备号。
接下来需要创建设备文件,使用命令 #mknod /dev/*** c 254 0
最后运行测试文件来测试驱动程序。
memdev.c如下:
static mem_major = MEMDEV_MAJOR;
module_param(mem_major, int, S_IRUGO);
struct mem_dev *mem_devp; /*设备结构体指针*/
struct cdev cdev;
/*文件打开函数*/
int mem_open(struct inode *inode, struct file *filp)
{
struct mem_dev *dev;
/*获取次设备号*/
int num = MINOR(inode-i_rdev);
if (num = MEMDEV_NR_DEVS)
return -ENODEV;
dev = mem_devp[num];
/*将设备描述结构指针赋值给文件私有数据指针*/
filp-private_data = dev;
return 0;
}
/*文件释放函数*/
int mem_release(struct inode *inode, struct file *filp)
{
return 0;
}
/*读函数*/
static ssize_t mem_read(struct file *filp, char __user *buf, si
文档评论(0)