扫一扫
关注微信公众号

linux设备驱动笔记——字符设备驱动2
2007-08-07   中国IT实验室

一些重要的数据结构
n   文件操作file_operations
u <linux/fs.h>中定义file_operations。
u __user表明指针是一个用户空间地址,因此不能被直接引用。
u ssize_t (*aio_write)(struct kiocb *, const char _ _user *, size_t, 
loff_t *); 初始化设备上的异步写入操作。
u unsigned int (*poll) (struct file *, struct poll_table_struct *);
是poll、epoll和select这三个系统调用的后端实现。可用来查询某个或多个文件描述符
上的读取或写入是否会被阻塞。
u int (*mmap) (struct file *, struct vm_area_struct *);
用于请求将设备内存映射到进程地址空间。
u int (*fsync) (struct file *, struct dentry *, int);
用户调用它来刷新待处理的数据。
u int (*fasync) (int, struct file *, int);
用来通知设备其FASYNC标志发生了变化。
 
        file结构
u struct file是一个内核结构,不会出现在用户程序中
    inode结构
u 内核用inode结构在内部表示文件,因此它和file结构不同,后者表示打开的文件描述符。
对单个文件,可能会有许多个表示打开的文件描述符的file结构,但它们都指向单个inode
结构。
u dev_t i_rdev:对表示设备文件的inode结构,该字段包含了真正的设备编号。
u struct cdev *i_cdev;struct cdev表示字符设备的内核的内部结构。
当inode指向一个字符设备文件时,该字段包含了指向struct cdev结构的指针
u unsigned int iminor(struct inode *inode);
u unsigned int imajor(struct inode *inode);
用来从一个inode中获得主设备号和次设备号
 
※       字符设备的注册
n 内核内部使用struct cdev结构来表示字符设备。为此我们的代码应包含<linux/cdev.h>,
其中定义了这个结构以及与其相关的一些辅助函数。
 

※ The classic way to register a char device driver is with:

int register_chrdev(unsigned int major, const char *name,
struct file_operations *fops);
int unregister_chrdev(unsigned int major, const char *name);
 
※      open方法
n  在大部分驱动程序中,open完成如下工作:
u 检查设备相关错误(诸如设备未就绪或相似的硬件问题)。
u 如果是首次打开,初始化设备。
u 标别次设备号,如有必要更新f_op指针。
u 分配和填写要放在filp->private_data里的数据结构。
u 增加使用计数。
 
        container_of(pointer, container_type, container_field);

         struct scull_dev *dev; /* device information */
 
         dev = container_of(inode->i_cdev, struct scull_dev, cdev);
         filp->private_data = dev; /* for other methods */

※ release方法的作用正好与open相反。这个设备方法有时也称为close。它应该:

n 使用计数减1。

n 释放open分配在filp->private_data中的内存。

n 在最后一次关闭操作时关闭设备。

※ The scull driver introduces two core functions used to manage memory in the Linux kernel. These functions,
defined in <linux/slab.h>, are:

void *kmalloc(size_t size, int flags);

void kfree(void *ptr);

※ 在scull中,每个设备都是一个指针链表,其中每个指针都指向一个scull_qset结构。默认情况下,每一个这样的结构通过一个中间指针数组最多可引用4000000个字节。使用了一个有1000个指针的数组,每个指针指向一个4000字节的区域。

※ 量子是什么??P65 每个量子占用4000个字节

※ 使用宏和整数值同时允许在编译期间和加载阶段进行配置,这种方法和前面选择主设备号的方法类似。对于驱动程序中任何不确定的或与策略相关的数值,我们都可以使用这种技巧。

热词搜索:

上一篇:linux设备驱动笔记——字符设备驱动1
下一篇:linux设备驱动笔记——字符设备驱动3

分享到: 收藏