字符设备:设备发送与接收数据是以字符的形式进行;
块设备:是以数据缓冲区的形式进行
虚拟字符设备
驱动部分:
注册设备函数:register_chrdev()
举例: register_chrdev(MAJOR_NUM, " gobalvar ", &gobalvar_fops)
MAJOR_NUM 为主设备号,“gobalvar”为设备名,gobalvar_fops 为包含基本函数入口点的结构体,类型为 file_operations
注销设备函数:unregister_chrdev(MAJOR_NUM, " gobalvar ")
对于字符设备来说,要提供的主要入口有:open ()、release ()、read ()、write ()、ioctl ()、llseek()、poll()等
open()函数 对设备特殊文件进行 open()系统调用时,将调用驱动程序的 open () 函数
int (*open)(struct inode * ,struct file *); 参数 inode 为设备特殊文件的 inode (索引结点) 结构的指针,参数 file 是指向这一
设备的文件结构的指针。
返回状态码(0 表示成功,负数表示存在错误)
举例:
static int globalvar_open(struct inode *inode, struct file *filp)
struct file_operations globalvar_fops =
{
read: globalvar_read,
write: globalvar_write,
open: globalvar_open,
release: globalvar_release,
};
release()函数 当最后一个打开设备的用户进程执行 close ()系统调用时,内核将调用驱
动程序的 release () 函数: void (*release) (struct inode * ,struct file *) ;
release 函数的主要任务是清理未结束的输入/输出操作、释放资源、用户自定义排他标
志的复位等。
举例:
static int globalvar_release(struct inode *inode, struct file *filp)
{
globalvar_count--;
return 0;
}
read()函数 当对设备特殊文件进行 read() 系统调用时,将调用驱动程序 read() 函数:
ssize_t (*read) (struct file *, char *, size_t, loff_t *);
举例:
static ssize_t globalvar_read(struct file *filp, char *b