深入浅出Linux设备驱动编程--字符设备驱动程序
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-07-04
…
}
write( ) 函数 当设备特殊文件进行write () 系统调用时,将调用驱动程序的write () 函数:
ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
向设备发送数据.如果没有这个函数,write 系统调用会向调用程序返回一个-EINVAL.如果返回值非负,则表示成功写入的字节数.
globalvar_write函数中内核空间与用户空间的内存交互需要借助第2节所介绍的函数:static ssize_t globalvar_write(struct file *filp, const char *buf, size_t len, loff_t
*off)
{
…
copy_from_user(&global_var, buf, sizeof(int));
…
}
ioctl() 函数 该函数是特殊的控制函数,可以通过它向设备传递控制信息或从设备取得状态信息,函数原型为:
int (*ioctl) (struct inode * ,struct file * ,unsigned int ,unsigned long);
unsigned int参数为设备驱动程序要执行的命令的代码,由用户自定义,unsigned long参数为相应的命令提供参数,类型可以是整型、指针等.如果设备不提供ioctl 入口点,则对于任何内核未预先定义的请求,ioctl 系统调用将返回错误(-ENOTTY,“No such ioctl fordevice,该设备无此ioctl 命令”).如果该设备方法返回一个非负值,那么该值会被返回给调用程序以表示调用成功.
llseek()函数该函数用来修改文件的当前读写位置,并将新位置作为(正的)返回值返回,原型为:
loff_t (*llseek) (struct file *, loff_t, int);
poll()函数poll 方法是poll 和select 这两个系统调用的后端实现,用来查询设备是否可读或可写,或是否处于某种特殊状态,原型为:unsigned int (*poll) (struct file *, struct poll_table_struct *);
我们将在“设备的阻塞与非阻塞操作”一节对该函数进行更深入的介绍.
设备“gobalvar”的驱动程序的这些函数应分别命名为gobalvar_open、gobalvar_ release、gobalvar_read、gobalvar_write、gobalvar_ioctl,因此设备“gobalvar”的基本入口点结构变量gobalvar_fops 赋值如下:
struct file_operations gobalvar_fops = {
read: gobalvar_read,
write: gobalvar_write,
};
上述代码中对gobalvar_fops的初始化方法并不是标准C所支持的,属于GNU扩展语法.
完整的globalvar.c文件源代码如下:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
#define MAJOR_NUM 254 //主设备号编译上述文件:
gcc –o globalvartest.o globalvartest.c
运行
./globalvartest.o可以发现“globalvar”设备可以正确的读写. |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
关于深入浅出Linux设备驱动编程--字符设备驱动程序的所有评论