免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6527 | 回复: 6
打印 上一主题 下一主题

const struct file_operations *f_op 的初始化问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-19 11:53 |只看该作者 |倒序浏览
30可用积分
请教一个问题:
struct file结构体中有一个结构
const struct file_operations        *f_op;
每个文件对应的file结构中的这个属性是什么时候初始化的?

是在建立文件系统的时候先初始化根的file
然后在这个文件系统中 新建文件的时候从根的file复制过来的?

最佳答案

查看完整内容

内核态应该有各种类型的文件。很多应该是系统启动,模块加载的时候初始化的。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2010-01-19 11:53 |只看该作者
内核态应该有各种类型的文件。很多应该是系统启动,模块加载的时候初始化的。

论坛徽章:
0
3 [报告]
发表于 2010-01-19 12:02 |只看该作者
原帖由 Godbach 于 2010-1-19 11:56 发表
内核态应该有各种类型的文件。很多应该是系统启动,模块加载的时候初始化的。


你说的这个初始化 应该是指初始化该文件系统的根的file结构?
但是在系统启动的时候 会给根建立file结构吗?为什么要建立,好象没有需求吧?
还是在运行的时候临时初始化的?

请指教

论坛徽章:
0
4 [报告]
发表于 2010-01-19 12:24 |只看该作者
原帖由 Godbach 于 2010-1-19 11:56 发表
内核态应该有各种类型的文件。很多应该是系统启动,模块加载的时候初始化的。


你是不是这个意思:
各个文件系统的模块的file_operations操作是在加载到内核的时候初始化的

那一个文件的struct file 中的file_operations字段应该是对应的文件系统的模块中获取这些字段吧
那是什么时候获取的呢?
应该是在创建的时候获取的吧 但是没找到对应的源代码

论坛徽章:
0
5 [报告]
发表于 2010-01-19 12:25 |只看该作者
原帖由 eclipse_2 于 2010-1-19 11:53 发表
请教一个问题:
struct file结构体中有一个结构
const struct file_operations        *f_op;
每个文件对应的file结构中的这个属性是什么时候初始化的?

是在建立文件系统的时候先初始化根的file
然后在这个文件 ...


在open这个文件的时候从inode->i_fops得到的,sys_open->do_sys_open->do_filp_open->nameidata_to_filp->__dentry_open
f->f_op = fops_get(inode->i_fop)

至于inode->i_fops的初始化,一般是在parse path的时候,在dentry cache lookup的时候,文件系统赋值的。

论坛徽章:
0
6 [报告]
发表于 2010-01-19 12:25 |只看该作者
看一个我以前写的简单的字符设备的程序的部分代码

  1. static int hello_open (struct inode *inode, struct file *filp)
  2. {
  3.     return 0;
  4. }

  5. static int hello_release (struct inode *inode, struct file *filp)
  6. {
  7.     return 0;
  8. }

  9. static ssize_t hello_read (struct file *filp, char __user *buf,
  10.                            size_t count, loff_t *pos)
  11. {
  12.     int size = count < MAXBUF ? count : MAXBUF;
  13.     printk("hello: Read Hello World !\n");
  14.     if (copy_to_user(buf, hello_buf, size))
  15.         return -ENOMEM;
  16.     return size;
  17. }
  18. static ssize_t hello_write (struct file *filp, const char __user *buf,
  19.                             size_t count, loff_t *pos)
  20. {
  21.     int size = count < MAXBUF ? count : MAXBUF;
  22.     printk("hello: Write Hello World !\n");
  23.     memset(hello_buf, 0, sizeof(hello_buf));
  24.     if (copy_from_user(hello_buf, buf, size))
  25.         return -ENOMEM;
  26.     return size;
  27. }

  28. static struct file_operations hello_fops = {
  29.         .read = hello_read,
  30.         .write = hello_write,
  31.         .open = hello_open,
  32.         .release = hello_release,
  33. };

  34. static struct cdev *hello_cdev;
  35. static int __init hello_init(void)
  36. {
  37.     dev_t dev;
  38.     int error;

  39.     error = alloc_chrdev_region(&dev, 0, 2, "hello");
  40.     if (error)
  41.     {
  42.         printk("hello: alloc_chardev_region failed!\n");
  43.         return error;
  44.     }
  45.     hello_cdev = cdev_alloc();
  46.     if (hello_cdev == NULL)
  47.     {
  48.         printk("hello: alloc cdev failed!\n");
  49.         unregister_chrdev_region(hello_cdev->dev, 2);
  50.         return -ENOMEM;
  51.     }

  52.     hello_cdev->ops = &hello_fops;
  53.     hello_cdev->owner = THIS_MODULE;

  54.   }

复制代码

这里就初始化了一个file_operations,其实类似系统启动的时候也必须初始化一个关于文件的open write read lseek(这些)等的底层到底是怎么完成的
也就是上面的
static struct file_operations hello_fops = {
        .read = hello_read,
        .write = hello_write,
        .open = hello_open,
        .release = hello_release,
};

因为对于linux任何东西都是文件,所以不管是文件系统  还是字符设备 块设备等都要初始话这么一个file_operations

论坛徽章:
0
7 [报告]
发表于 2010-01-19 12:30 |只看该作者
在si的内核源码中 搜索struct file_operations 可以看到很多啊...
不过大体上都有字符设备那个类似
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP