snifer

【原创】Linux系统file_opration结构分析

0
阅读(1878)

file_opration操作在linux系统中非常多,今天给大家分析一下这个程序的原理。


file_operations 在内核中定义linux/fs.h

 

  struct file_operations {

  struct module *owner;

  loff_t (*llseek) (struct file *, loff_t, int);

        ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

  ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

  unsigned int (*poll) (struct file *, struct poll_table_struct *);

  int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);

  int (*mmap) (struct file *, struct vm_area_struct *);

  int (*open) (struct inode *, struct file *);

  int (*release) (struct inode *, struct file *);

  int (*fsync) (struct file *, struct dentry *, int datasync);

  ……

  };

其中每个函数的结构及功能如下:

int(*open)(struct inode*,struct file *)
增加使用计数,检查错误
如果未初始化,则调用初始化
识别次设备号,如果必要,更新f_op指针
分配并填写被置于filp->private_data的数据结构
int(*realse)(struct inode*,struct file*)

open逆操作

ssize_t (*read)(struct file*,char *,size_t,loff_t*)
用户空间和内核空间数据交互
用户空间指针和内核指针
驱动调用copy_to_user()将数据返回给用户
ssize_t(*write)(struct file*,const char*,size_t,loff_t*)
驱动调用copy_from_user()将用户数据读到本地buffer
int(*ioctl)(struct inode*,struct file*,unsigned int cmd,unsigned long arg)
驱动程序一般需支持通过Ioctl实现各种控制与参数设置,如串口可设置波特率等多参数
cmd变量存放命令,驱动代码根据cmd里面的值进行switch-cas处理分支
arg存放参数,如为整数,可直接使用。如为指针,驱动程序首先要检查指针的合法性
int access_ok(int type, const void *addr, unsigned long size); 检查通过后可以使用
驱动程序还可通过int capable(int capability)函数来确定调用进程是否有权执行操作
说明与结构是一一对应的。

我们自己写的时候按照相关功能调用即可。