linux驱动程序实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
字符设备驱动程序
实验报告
院系名称:
学生姓名:
学号:
专业名称:
班级:
年月日至时间:
年月日
实验题目字符设备驱动程序
一、实验目的
通过编写一个简单的C语言字符设备驱动程序,来加深对上次的内存管理实验的复习,以及对本次学习的字符设备驱动的应用。
二、实验内容
编写一个字符设备驱动程序,以内核模块的形式插入内核,编译方法与内核编译方法一致。创建设备节点,然后通过编写一个测试程序,输出“hello world!”。
三、实验步骤
①用C语言编写一个字符设备驱动程序;
②编译,链接,将程序插入内核模块中;
③创建设备节点,编写测试程序,运行输出“hello world”。
四、调试以及运行过程
因为用的是学校的电脑,在运行时,就出现错误。开始是怎么都插不进去模块。最后发现原来是makefile文件开始用小写,后来改成Makefile,,竟然对了。虽然最后显示内核模块插入了,但是无法进行编译,总是显示,无法正常运行。最后,把代码拷进同学电脑里,对了。才发现,有时要相信自己,换一个位置去试,就会发现惊喜。
五、心得体会
对于程序,我们要多练,才能懂得其真正的用处在哪里。没有编写程序运行前只知道一点皮毛,真正操作后才会受益匪浅。通过编写字符设备驱动程序,我知道了当我们不会写代码时,可以先试着把别人的类似代码敲一遍,然后找出那种属于自己的感觉,理解清楚别人的思想,然后根据需要编写属于自己的代码。
六、源代码
1.字符设备驱动程序
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Helight");
//定义主设备号与次设备号
#define DP_MAJOR 250
#define DP_MINOR 0
//定义变量
static int char_read(struct file *filp,char __user *buffer,size_t,loff_t *);
static int char_open(struct inode *,struct file *); static int char_write(struct file *filp,const char __user *buffer,size_t ,loff_t*);
static int char_release(struct inode *,struct file *); static int chropen;
struct cdev *chardev;
static int len;
//file_operations结构中的每个函数都对应一个具体的功能,也就是对设备的不同操作
static const struct file_operations char_ops =
{
.read = char_read,
.write = char_write,
.open = char_open,
.release = char_release,
};
//设备驱动模块加载函数
static int __init char_init(void)
{
dev_t dev;
printk(KERN_ALERT"Initing......\n");
dev=MKDEV(DP_MAJOR,DP_MINOR);
chardev = cdev_alloc( );
if(chardev==NULL)
{
return -1;
}
if(register_chrdev_region(dev,10,"chardev"))
{
printk(KERN_ALERT"Register char dev error\n");
return -1;
}
chropen=0;
len=0;
cdev_init(chardev,&char_ops);
if(cdev_add(chardev,dev,1))
{
printk(KERN_ALERT"Add char dev error\n");
}
return 0;
}
//文件打开函数会在设备结构体指针赋值给私有数据
static int char_open(struct inode *inode,struct file *file)
{
if(chropen==0)
chropen++;
Else
{
printk(KERN_ALERT"Another process open the char device\n");
return -1;
}
try_module_get(THIS_MODULE);
return 0;
}
//释放函数
static int char_release(struct inode *inode,struct file *file)
{
chropen--;
module_put(THIS_MODULE);
return 0;
}
//读函数
static int char_read(struct file *filp,char __user *buffer,size_t length,loff_t *offset)
{
if(length<12)
{
if(!copy_to_user(buffer,"hello world!",length))
{
return 0;
}
}
else
{
if(!copy_to_user(buffer,"hello world!",strlen(hello,world!""))) {
return 0;
}
}
return -1;
}
//写函数
static int char_write(struct file *filp,const char __user *buffer,size_t length,loff_t *offset)
{
return 0;
}