Linux设备驱动开发 新手,创建第一个字符设备驱动时对一些代码的功能不是很了解,能解释一下吗?
才开始学习Linux设备驱动开发,借的这本书有代码但是没有注释,下面这个驱动的意思就懂不了,希望各位大神指点指点。万分感谢下面的都是我编写的一个字符设备驱动的代码,请问s...
才开始学习Linux设备驱动开发,借的这本书有代码但是没有注释,下面这个驱动的意思就懂不了,希望各位大神指点指点。万分感谢
下面的都是我编写的一个字符设备驱动的代码,请问static int read_test()这个函数开始到static void release_test()这个函数中的参数和内部代码的意义是什么?
万分感谢。
采纳之前会加分到100,谢谢
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/module.h>
unsigned int test_major = 0;
static int read_test(struct inode *node,struct file *fle,char *buf,int count)
{
int left;
if (access_ok(VERIFY_WRITE, buf, count))
{
for (left = count; left > 0; left--)
{
_put_user('a',buf);
buf ++;
}
}
return count;
}
static int write_test(struct inode *node, struct file *fle, char *buf, int count)
{
return count;
}
static int open_test(struct inode *inode,struct file *file)
{
try_module_get(THIS_MODULE);
return 0;
}
static void release_test(struct inode *inode, struct file *file)
{
module_put(THIS_MODULE);
}
struct file_operations test_fops =
{
.owner = THIS_MODULE,
.read = read_test,
.write = write_test,
.open = open_test,
.release = release_test,
};
int init_module()
{
int result;
result = register_chrdev(0,"test,&test_fops");
if (result < 0)
{
printk(KERN_INFO "dddddddddddddddd");
return result;
}
return 0;
} 展开
下面的都是我编写的一个字符设备驱动的代码,请问static int read_test()这个函数开始到static void release_test()这个函数中的参数和内部代码的意义是什么?
万分感谢。
采纳之前会加分到100,谢谢
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/module.h>
unsigned int test_major = 0;
static int read_test(struct inode *node,struct file *fle,char *buf,int count)
{
int left;
if (access_ok(VERIFY_WRITE, buf, count))
{
for (left = count; left > 0; left--)
{
_put_user('a',buf);
buf ++;
}
}
return count;
}
static int write_test(struct inode *node, struct file *fle, char *buf, int count)
{
return count;
}
static int open_test(struct inode *inode,struct file *file)
{
try_module_get(THIS_MODULE);
return 0;
}
static void release_test(struct inode *inode, struct file *file)
{
module_put(THIS_MODULE);
}
struct file_operations test_fops =
{
.owner = THIS_MODULE,
.read = read_test,
.write = write_test,
.open = open_test,
.release = release_test,
};
int init_module()
{
int result;
result = register_chrdev(0,"test,&test_fops");
if (result < 0)
{
printk(KERN_INFO "dddddddddddddddd");
return result;
}
return 0;
} 展开
1个回答
展开全部
上层的read函数最终会调用read_test,write亦是如此。
read_test中:
if是判断是否准备好;for循环是来将要读取的count个数据写到buf(用户空间)中去,这里写的是‘a’.
release_test:
主要作用是将引用计数减1;引用计数是用来统计使用该模块的次数的。由此推断在open中有引用计数加一。这样就将资源的释放交给了内核,当引用计数为零时,内核将释放该驱动申请的资源。
read_test中:
if是判断是否准备好;for循环是来将要读取的count个数据写到buf(用户空间)中去,这里写的是‘a’.
release_test:
主要作用是将引用计数减1;引用计数是用来统计使用该模块的次数的。由此推断在open中有引用计数加一。这样就将资源的释放交给了内核,当引用计数为零时,内核将释放该驱动申请的资源。
追问
谢谢,再请教一下,
read_test中:
_put_user()这个函数是用来做什么的?
将count个数写到buf中的意义是什么?
read_test和write_test函数写出来的意义是什么?
追答
_put_user()是用来将内核空间的数据拷到用户空间。
count就是要拷贝的字节数,你和上层的read函数中的参数对比下就知道了。
他写的这两个函:read_test和write_test,在真正的驱动中没太大意思,这里举例子告诉你写字符驱动大概的框架。真正的驱动要根据硬件等来写。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询