file结构中的private_data
来源:互联网 发布:莎莎源码的解压密码 编辑:程序博客网 时间:2024/06/11 19:50
这个是Linux下连接VFS文件系统框架和不同文件/文件系统底层实现之间的一个核心数据结构,虽然它只是一个指针,但是一个指针可以解决所有问题。我们回想一下用户态线程的创建结构,函数的入口同样是一个void*指针,而千言万语汇成一根指针,诗可以兴、可以观、可以群、可以怨,可以解决所有问题。
因为file是VFS框架的一个基本概念,它要支持文件操作结构,例如open/read/write/release之类的接口,甚至还有poll等,只有有了这些结构,它们才能被纳入VFS这个大家庭。但是对于不同的设备文件来说,它们只是披着文件外衣的设备,所以他要有自己特有的结构来和设备交流,而这private_data就是这个连接的纽带。这样说可能还是比较抽象,最后是多看一些代码感受可能会深一些。
ldd3中说到open应完成以下工作:
1.检查设备特定的错误(注入设备未就绪或类似的硬件问题)。
2.如果设备是首次打开,则对其进行初始化。
3.如有必要,更新f_op指针。
4.分配并填写置于filp->private_data里的数据结构。
宋宝华的linux设备驱动开发详解,93页写到私有数据指针private_data在设备驱动中背广泛使用,大多数指向设备驱动自定义用于描述设备的结构体。
下面是之前我遇到过的一些使用private_data的一些文件:
1、tty设备
static ssize_t tty_read(struct file * file, char __user * buf, size_t count,
loff_t *ppos)
{
int i;
struct tty_struct * tty;
struct inode *inode;
struct tty_ldisc *ld;
tty = (struct tty_struct *)file->private_data;
2、tun/tap设备
static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv,
unsigned long count, loff_t pos)
{
struct file *file = iocb->ki_filp;
struct tun_struct *tun = file->private_data;
3、套接口文件
static ssize_t do_sock_read(struct msghdr *msg, struct kiocb *iocb,
struct file *file, const struct iovec *iov,
unsigned long nr_segs)
{
struct socket *sock = file->private_data;
size_t size = 0;
4、epoll文件
static int ep_eventpoll_close(struct inode *inode, struct file *file)
{
struct eventpoll *ep = file->private_data;
5、shm文件
long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr)
{
……
file->private_data = sfd;
打开设备:
open 方法提供给驱动来做任何的初始化来准备后续的操作. open 方法的原型是:
int (*open)(struct inode *inode, struct file *filp);
inode 参数有我们需要的信息,以它的 i_cdev 成员的形式, 里面包含我们之前建立的cdev 结构. 唯一的问题是通常我们不想要 cdev 结构本身, 我们需要的是包含 cdev 结构的 device_private 结构.
static int device_open(struct inode *inode, struct file *filp){ struct device_private *private; private= container_of(inode->i_cdev, struct device_private, my_cdev); filp->private_data = private; private->open_flag++; try_module_get(THIS_MODULE); ... return 0;}
释放设备:
Reference
[1].http://blog.csdn.NET/ywh147/article/details/8684486
- file结构中的private_data
- file结构中的private_data
- file结构中的private_data
- kernel struct file结构中的private_data
- file结构体中private_data指针的疑惑
- 关于struct file 结构下 private_data 数据结构z作用
- GPIO ,ioctl,file->private_data
- linux 笔记 关于struct file 结构下 private_data 数据结构的思考
- linux 笔记 关于struct file 结构下 private_data 数据结构的思考
- private_data
- file*中神秘的private_data指针
- linux驱动开发--字符设备:通过cdd_cdev结构中的led变量区分是哪个节点,private_data使用
- epoll实现:回调、红黑树及file中万能的private_data
- file结构体中的重要字段
- Linux中的file结构体解析
- C语言中的FILE结构体
- 通过miscdevice获得驱动私有数据结构体时file->private_data为空的解决方法
- file结构
- 记android学习之路----Activity(4)----Activity之间的跳转与数据传递
- PIC单片机精通_A/D转换&异步串口通讯实例与详解
- web分布式方案
- codeforces 738D Sea Battle 思维+构造
- Java——>IO
- file结构中的private_data
- 自定义View(一):初认识自定义Veiw
- Laravel timestamps 设置为unix时间戳
- 项目管理进阶--软件开发项目中的团队组成
- 阿里云CentOS配置Java,Tomcat,MySQL
- 数据结构学习笔记(一):数组及查找算法
- Exception in thread "main" java.lang.NoClassDefFoundError解决了
- 最长递增子序列 动态规划基础
- Codeforces Round #380 (Div. 2) D. Sea Battle