本文的copyright归yuweixian4230@163.com 所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:yuweixian4230@163.com
博客:yuweixian4230.blog.chinaunix.net
该函数创造一个新的文件对象 struct file * filp,并将他和相应的索引节点*inodep,对象关联起来。由系统调用open()调用它。
1. 如果设备是第一次打开,则对其进行初始化。
2. 如果必要,更新 *flip指针。
3. 分配并填写置于flip->private_data里的数据结构。
函数原型:
-
int (*open) (struct inode *, struct file *);
-
简单介绍
-
struct inode{
-
dev_t i_dev;
-
struct cdev *i_dev;
-
};
-
-
struct file{
-
const struct file_operations *f_op;
-
void *private_data;
-
fmode_t fmode;//00666 在open系统调用时,会获取这些属性
-
unsigned int flags;//只读
-
};
将设备结构体指针赋值给文件私有数据指针
原型如下:
-
src/include/linux/kernle.h 2.6.35
-
-
715/**
-
716 * container_of - cast a member of a structure out to the containing structure
-
717 * @ptr: the pointer to the member.
-
718 * @type: the type of the container struct this is embedded in.
-
719 * @member: the name of the member within the struct.
-
720 *
-
721 */
-
722 #define container_of(ptr, type, member) ({ \
-
723 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
-
724 (type *)( (char *)__mptr - offsetof(type,member) );})
在ldd3 p62中这么使用,
-
struct scull_dev{
-
struct cdev cdev;
-
int qset;
-
};
-
open函数中: 通过inode结构体,返回 struct scull_dev 结构体指针
-
struct scull_dev *dev;
-
dev = container_of(inode->i_cdev,struct scull_dev,cdev);
-
flip->private_data = dev;
在linux设备驱动详解 p131
-
struct globalmem_dev *globalmem_devp;
-
-
int globalmem_open(struct inode *inode,struct file *flip)
-
{
-
//将设备结构体指针赋值给问价私有数据指针
-
flip->private_data = globalmem_devmp;
-
return 0;
-
}
其实,不提倡用上述直接调用全局变量 struct globalmem_dev *globalmem_devp;
这样会导致混乱,使用 contain_of 函数,如下使用
在linux设备驱动详解2 p135
-
int globalmem_open(struct inode *inode,struct file *flip)
-
{
-
struct globalmem_dev *dev;
-
dev = conainer_of(inode->cdev,struct globalmem_dev,cdev);
-
flip->private_data = dev;
-
return 0;
-
}
在内核源码中的一些例子
============================
-
src/drivers/char/efirtc.c
-
-
264static int efi_rtc_open(struct inode *inode, struct file *file)
-
265{
-
266 /*
-
267 * nothing special to do here
-
268 * We do accept multiple open files at the same time as we
-
269 * synchronize on the per call operation.
-
270 */
-
271 return 0;
-
272}
-
在同一个时刻,每次系统调用时,我们允许打开多个文件
============================================
我是这么认为:
系统调用open("test.txt",O_RDWR,00700);打开一个文件时,file结构体在内核中产生一个文件对象,系统调用open则返回一个文件描述符。file结构体则获得了该文件操作的属性 O_RDWR,00700等。
当有两个open系统调用时,第一次系统调用,open驱动程序产生struct inode结构体和struct file 结构体file1,当第二次系统调用时,open驱动程序再次产生struct file结构体file1。而且这两个file结构体对象都指向索引inode。为了能在内核中分开操作file,我们需要在内核open函数中,将设备结构体指针赋值给文件私有数据指针
-
struct globalmem_dev *dev;
-
dev = conainer_of(inode->cdev,struct globalmem_dev,cdev);
-
flip->private_data = dev;
linux设备驱动开发及应用 p127
linux内核可支持多进程。多个进程可同时使用一个设备驱动程序。因此,设计设备驱动程序时要考虑到这一点。由于要分别管理使用同一个设备驱动程序的多个进程,因此,按进程分类方法分配和初始化内存。通常,在文件结构体的flip的private_data上注册、管理和使用按进程分类管的内存。
flip->private_data =vmalloc(1024);
阅读(6577) | 评论(0) | 转发(0) |