0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux驱动file_operations结构体函数的作用

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-20 11:08 次阅读

写过 Linux 驱动的小伙伴,一定对 file_operations 结构体不陌生,我们常常实现其中的 open、read、write、poll 等函数,今天为大家讲解其中每个函数的作用。

1、struct module *owner;

这不是一个操作,它是一个指向拥有这个结构的模块的指针。用来在它的操作还在被使用时阻止模块被卸载。一般情况下, 它被简单初始化为 THIS_MODULE, 一个在《linux/module.h》 中定义的宏。

2、loff_t (*llseek)

llseek 方法用作改变文件中的当前【读/写】位置, 并且新位置作为(正的)返回值。错误返回负值。

3、ssize_t (*read)

从设备中同步读取数据,也就是读节点。读取成功返回读取的字节数。

4、ssize_t (*write)

向设备同步发送数据,也就是写节点。

5、ssize_t (*read_iter)

初始化一个异步读。可能在函数返回前不结束的读操作。如果这个方法是 NULL,所有的操作会由 read 代替进行(同步)。

6、ssize_t (*write_iter)

初始化一个异步写。

7、int (*iterate)

迭代

8、int (*iterate_shared)

共享迭代

9、unsigned int (*poll)

poll 方法是 3 个系统调用的后端:poll, epoll, 和 select, 都用作查询对一个或多个文件描述符的读或写是否会阻塞。poll 方法应当返回一个位掩码指示是否非阻塞的读或写是可能的,并且提供给内核信息用来使调用进程睡眠直到可以进行读写。如果一个驱动的 poll 方法为 NULL,设备假定为不阻塞地可读可写。

10、long (*unlocked_ioctl)

kernel-2.6 以前,使用的是 ioctl;kernel-2.6 以后,使用 unlocked_ioctl。

11、long (*compat_ioctl)

兼容性的 ioctl,为了让 32-bit 的 process 可以在 64-bit 上的 system 来执行 ioctl()

12、int (*mmap)

用来请求将设备内存映射到进程的地址空间。一般涉及到图像方面,会使用此函数,比如 framebuffer。如果这个方法是 NULL,mmap 系统调用返回 -ENODEV。

13、int (*open)

打开文件,尽管这常常是对设备文件进行的第一个操作,不要求驱动声明一个对应的方法。如果这个项是 NULL,设备打开一直成功,但是你的驱动不会得到通知。

14、int (*flush)

flush 操作在进程关闭它的设备文件描述符的拷贝时调用; 它应当执行(并且等待)设备的任何未完成的操作。我们很少使用 flush,SCSI 磁带驱动使用它,为确保所有写的数据在设备关闭前写到磁带上。如果 flush 为 NULL,内核简单地忽略用户应用程序的请求。

15、int (*release)

在文件结构被释放时引用这个操作。

16、int (*fsync)

这个方法是 fsync 系统调用的后端, 用户调用来刷新任何挂着的数据。 如果这个指针是 NULL, 系统调用返回 -EINVAL.

17、int (*fasync)

通知设备 FASYNC 标志发生变化,如果设备不支持异步通知,该字段可以为NULL

18、int (*lock)

lock 方法用来实现文件加锁; 加锁对常规文件是必不可少的特性, 但是设备驱动几乎从不实现它。

19、ssize_t (*sendpage)

它由内核调用来发送数据, 一次一页,到对应的文件。设备驱动实际上不实现 sendpage。

20、unsigned long (*get_unmapped_area)

这个方法的目的是在进程的地址空间找一个合适的位置来映射在底层设备上的内存段中。 这个任务通常由内存管理代码进行; 这个方法存在为了使驱动能强制特殊设备可能有的任何的对齐请求。 大部分驱动可以置这个方法为 NULL。

21、int (*check_flags)

这个方法允许模块检查传递给 fnctl(F_SETFL.。.) 调用的标志。

22、int (*flock)

为解决多进程对同一文件的读写冲突,在 Linux 系统中,提供了 flock 这一系统调用,用来实现对文件的读写保护,即文件锁的功能。

23、ssize_t (*splice_write)

类似于 write,splice 用于在两个文件描述符之间移动数据,是一种重要零拷贝技术。

24、ssize_t (*splice_read)

类似于 read,splice 用于在两个文件描述符之间移动数据,是一种重要零拷贝技术。

25、int (*setlease)

设置租约?

26、long (*fallocate)

快速创建文件。

27、void (*show_fdinfo)

展示 fd 文件描述符的信息。

28、unsigned (*mmap_capabilities)

mmap 的权限限制信息。

29、ssize_t (*copy_file_range)

Copy a range of data from one file to another.

30、int (*clone_file_range)

将一系列的数据从一个文件复制到另一个文件,希望在这一过程中能以比较优化的方式来完成。

31、ssize_t (*dedupe_file_range)

用于将文件一定范围内的重复数据消除。

一般情况下,大家只需要实现最常见几个就可以,比如 llseek、open、read、write、poll 、unlocked_ioctl、mmap、flush 等。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1825

    浏览量

    85178
  • Linux
    +关注

    关注

    87

    文章

    11225

    浏览量

    208920
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62429
收藏 人收藏

    评论

    相关推荐

    ArmSoM系列板卡 嵌入式Linux驱动开发实战指南 之 字符设备驱动

    的抽象,字符设备设计思路; 字符设备相关的概念以及数据结构,了解设备号等基本概念以及file_operationsfile、inode相关数据结构; 字符字符设备
    的头像 发表于 04-10 09:53 1005次阅读
    ArmSoM系列板卡 嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>驱动</b>开发实战指南 之 字符设备<b class='flag-5'>驱动</b>

    嵌入式Linux字符驱动LED灯设计

    );MODULE_LICENSE("GPL");2)Linux字符IO驱动设计步骤如下:1.定义描述字符IO设备的结构Linux中,每个
    发表于 02-03 14:28

    编译字符设备驱动file_operations结构问题?

    file_operations tdd_fops = {read:read_test,open:open_test,release:release_test,};int init_module(void) { int
    发表于 03-31 09:13

    编译字符设备驱动file_operations结构问题?

    file_operations tdd_fops = {read:read_test,openpen_test,release:release_test,};int init_module(void
    发表于 03-31 09:30

    linux驱动-Input输入子系统

    file_operations结构中的函数。在Input子系统中,这些步骤会分布到不同的层中,最后三个层通过一些联系构成了一个完整的驱动
    发表于 05-21 00:05

    十一天学会Linux驱动编程(第十天)

    。如上图所示红框中的函数“void cdev_init(struct cdev *, const struct file_operations *)”和结构“cdev”。cdev_i
    发表于 01-22 22:24

    芯灵思Sinlinx A33实现linux led驱动

    驱动(和块设备驱动),注意这里并不是驱动文件设备节点!4) Linux使用file_operations
    发表于 12-25 12:10

    带大家走进嵌入式Linux-arm驱动开发

    一、本文将会以最简单的LED驱动程序带大家走进嵌入式Linux-arm驱动开发,首先,来了解一下最简单的驱动框架。1.首先struct file_o
    发表于 12-15 07:59

    file_operations函数详解

    struct file_operations,struct module *owner; // 指向拥有该结构的模块的指针,避免正在操作时被卸载,一般为初始化为THIS_MODULES
    发表于 06-16 11:30 4904次阅读

    LCD的ARM编程方式,LCD Linux程序如何写入?

    目前还没有讨论的 file_operations 方法是 ioctl ()。用户应用程序使用 ioctrl 系统调用操作 LCD 硬件。fb_ops 结构中定义的方法为这些操作提供支 持。注意
    发表于 05-25 14:48 1646次阅读
    LCD的ARM编程方式,LCD <b class='flag-5'>Linux</b>程序如何写入?

    用户与内核空间数据交换的方式之一seq_file

    要想使用seq_file功能,开发者需要包含头文件linux/seq_file.h,并定义与设置一个seq_operations结构(类似于
    发表于 05-14 15:34 1494次阅读

    深入剖析Linux文件系统的架构

    函数都必须由底层派生出的实例实现,使用成员函数 file_operations。在linux里面的文件操作,底层都要实现file_operatio
    发表于 05-16 09:15 1030次阅读
    深入剖析<b class='flag-5'>Linux</b>文件系统的架构

    Linux内核如何使用结构函数指针?

    我将结合具体的Linux内核驱动框架代码来展示Linux内核如何使用结构函数指针。
    的头像 发表于 09-06 14:17 994次阅读
    <b class='flag-5'>Linux</b>内核如何使用<b class='flag-5'>结构</b><b class='flag-5'>体</b>和<b class='flag-5'>函数</b>指针?

    Linux驱动函数接口说明

    *parent, void *data, const struct file_operations *fops); name :要创建的 /sys/kernel/debug 下的目录名 parent
    的头像 发表于 09-27 11:20 441次阅读

    怎么编写Framebuffer驱动程序

    Framebuffer 驱动程序框架 分为上下两层: fbmem.c:承上启下 实现、注册 file_operations 结构 把 APP 的调用向下转发到
    的头像 发表于 03-22 09:13 517次阅读
    怎么编写Framebuffer<b class='flag-5'>驱动</b>程序