0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Linux驅(qū)動file_operations結(jié)構(gòu)體函數(shù)的作用

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-20 11:08 ? 次閱讀

寫過 Linux 驅(qū)動的小伙伴,一定對 file_operations 結(jié)構(gòu)體不陌生,我們常常實現(xiàn)其中的 open、read、write、poll 等函數(shù),今天為大家講解其中每個函數(shù)的作用。

1、struct module *owner;

這不是一個操作,它是一個指向擁有這個結(jié)構(gòu)的模塊的指針。用來在它的操作還在被使用時阻止模塊被卸載。一般情況下, 它被簡單初始化為 THIS_MODULE, 一個在《linux/module.h》 中定義的宏。

2、loff_t (*llseek)

llseek 方法用作改變文件中的當(dāng)前【讀/寫】位置, 并且新位置作為(正的)返回值。錯誤返回負值。

3、ssize_t (*read)

從設(shè)備中同步讀取數(shù)據(jù),也就是讀節(jié)點。讀取成功返回讀取的字節(jié)數(shù)。

4、ssize_t (*write)

向設(shè)備同步發(fā)送數(shù)據(jù),也就是寫節(jié)點。

5、ssize_t (*read_iter)

初始化一個異步讀。可能在函數(shù)返回前不結(jié)束的讀操作。如果這個方法是 NULL,所有的操作會由 read 代替進行(同步)。

6、ssize_t (*write_iter)

初始化一個異步寫。

7、int (*iterate)

迭代

8、int (*iterate_shared)

共享迭代

9、unsigned int (*poll)

poll 方法是 3 個系統(tǒng)調(diào)用的后端:poll, epoll, 和 select, 都用作查詢對一個或多個文件描述符的讀或?qū)懯欠駮枞oll 方法應(yīng)當(dāng)返回一個位掩碼指示是否非阻塞的讀或?qū)懯强赡艿?,并且提供給內(nèi)核信息用來使調(diào)用進程睡眠直到可以進行讀寫。如果一個驅(qū)動的 poll 方法為 NULL,設(shè)備假定為不阻塞地可讀可寫。

10、long (*unlocked_ioctl)

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

11、long (*compat_ioctl)

兼容性的 ioctl,為了讓 32-bit 的 process 可以在 64-bit 上的 system 來執(zhí)行 ioctl()

12、int (*mmap)

用來請求將設(shè)備內(nèi)存映射到進程的地址空間。一般涉及到圖像方面,會使用此函數(shù),比如 framebuffer。如果這個方法是 NULL,mmap 系統(tǒng)調(diào)用返回 -ENODEV。

13、int (*open)

打開文件,盡管這常常是對設(shè)備文件進行的第一個操作,不要求驅(qū)動聲明一個對應(yīng)的方法。如果這個項是 NULL,設(shè)備打開一直成功,但是你的驅(qū)動不會得到通知。

14、int (*flush)

flush 操作在進程關(guān)閉它的設(shè)備文件描述符的拷貝時調(diào)用; 它應(yīng)當(dāng)執(zhí)行(并且等待)設(shè)備的任何未完成的操作。我們很少使用 flush,SCSI 磁帶驅(qū)動使用它,為確保所有寫的數(shù)據(jù)在設(shè)備關(guān)閉前寫到磁帶上。如果 flush 為 NULL,內(nèi)核簡單地忽略用戶應(yīng)用程序的請求。

15、int (*release)

在文件結(jié)構(gòu)被釋放時引用這個操作。

16、int (*fsync)

這個方法是 fsync 系統(tǒng)調(diào)用的后端, 用戶調(diào)用來刷新任何掛著的數(shù)據(jù)。 如果這個指針是 NULL, 系統(tǒng)調(diào)用返回 -EINVAL.

17、int (*fasync)

通知設(shè)備 FASYNC 標(biāo)志發(fā)生變化,如果設(shè)備不支持異步通知,該字段可以為NULL

18、int (*lock)

lock 方法用來實現(xiàn)文件加鎖; 加鎖對常規(guī)文件是必不可少的特性, 但是設(shè)備驅(qū)動幾乎從不實現(xiàn)它。

19、ssize_t (*sendpage)

它由內(nèi)核調(diào)用來發(fā)送數(shù)據(jù), 一次一頁,到對應(yīng)的文件。設(shè)備驅(qū)動實際上不實現(xiàn) sendpage。

20、unsigned long (*get_unmapped_area)

這個方法的目的是在進程的地址空間找一個合適的位置來映射在底層設(shè)備上的內(nèi)存段中。 這個任務(wù)通常由內(nèi)存管理代碼進行; 這個方法存在為了使驅(qū)動能強制特殊設(shè)備可能有的任何的對齊請求。 大部分驅(qū)動可以置這個方法為 NULL。

21、int (*check_flags)

這個方法允許模塊檢查傳遞給 fnctl(F_SETFL.。.) 調(diào)用的標(biāo)志。

22、int (*flock)

為解決多進程對同一文件的讀寫沖突,在 Linux 系統(tǒng)中,提供了 flock 這一系統(tǒng)調(diào)用,用來實現(xiàn)對文件的讀寫保護,即文件鎖的功能。

23、ssize_t (*splice_write)

類似于 write,splice 用于在兩個文件描述符之間移動數(shù)據(jù),是一種重要零拷貝技術(shù)。

24、ssize_t (*splice_read)

類似于 read,splice 用于在兩個文件描述符之間移動數(shù)據(jù),是一種重要零拷貝技術(shù)。

25、int (*setlease)

設(shè)置租約?

26、long (*fallocate)

快速創(chuàng)建文件。

27、void (*show_fdinfo)

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

28、unsigned (*mmap_capabilities)

mmap 的權(quán)限限制信息。

29、ssize_t (*copy_file_range)

Copy a range of data from one file to another.

30、int (*clone_file_range)

將一系列的數(shù)據(jù)從一個文件復(fù)制到另一個文件,希望在這一過程中能以比較優(yōu)化的方式來完成。

31、ssize_t (*dedupe_file_range)

用于將文件一定范圍內(nèi)的重復(fù)數(shù)據(jù)消除。

一般情況下,大家只需要實現(xiàn)最常見幾個就可以,比如 llseek、open、read、write、poll 、unlocked_ioctl、mmap、flush 等。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 驅(qū)動
    +關(guān)注

    關(guān)注

    12

    文章

    1790

    瀏覽量

    84906
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11123

    瀏覽量

    207905
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61965
收藏 人收藏

    評論

    相關(guān)推薦

    ArmSoM系列板卡 嵌入式Linux驅(qū)動開發(fā)實戰(zhàn)指南 之 字符設(shè)備驅(qū)動

    的抽象,字符設(shè)備設(shè)計思路; 字符設(shè)備相關(guān)的概念以及數(shù)據(jù)結(jié)構(gòu),了解設(shè)備號等基本概念以及file_operations、file、inode相關(guān)數(shù)據(jù)結(jié)構(gòu); 字符字符設(shè)備
    的頭像 發(fā)表于 04-10 09:53 ?886次閱讀
    ArmSoM系列板卡 嵌入式<b class='flag-5'>Linux</b><b class='flag-5'>驅(qū)動</b>開發(fā)實戰(zhàn)指南 之 字符設(shè)備<b class='flag-5'>驅(qū)動</b>

    嵌入式Linux字符驅(qū)動LED燈設(shè)計

    );MODULE_LICENSE("GPL");2)Linux字符IO驅(qū)動設(shè)計步驟如下:1.定義描述字符IO設(shè)備的結(jié)構(gòu)Linux中,每個
    發(fā)表于 02-03 14:28

    編譯字符設(shè)備驅(qū)動file_operations結(jié)構(gòu)問題?

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

    編譯字符設(shè)備驅(qū)動file_operations結(jié)構(gòu)問題?

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

    linux驅(qū)動-Input輸入子系統(tǒng)

    file_operations結(jié)構(gòu)中的函數(shù)。在Input子系統(tǒng)中,這些步驟會分布到不同的層中,最后三個層通過一些聯(lián)系構(gòu)成了一個完整的驅(qū)動
    發(fā)表于 05-21 00:05

    十一天學(xué)會Linux驅(qū)動編程(第十天)

    。如上圖所示紅框中的函數(shù)“void cdev_init(struct cdev *, const struct file_operations *)”和結(jié)構(gòu)“cdev”。cdev_i
    發(fā)表于 01-22 22:24

    芯靈思Sinlinx A33實現(xiàn)linux led驅(qū)動

    驅(qū)動(和塊設(shè)備驅(qū)動),注意這里并不是驅(qū)動文件設(shè)備節(jié)點!4) Linux使用file_operations
    發(fā)表于 12-25 12:10

    帶大家走進嵌入式Linux-arm驅(qū)動開發(fā)

    一、本文將會以最簡單的LED驅(qū)動程序帶大家走進嵌入式Linux-arm驅(qū)動開發(fā),首先,來了解一下最簡單的驅(qū)動框架。1.首先struct file_o
    發(fā)表于 12-15 07:59

    file_operations函數(shù)詳解

    struct file_operations,struct module *owner; // 指向擁有該結(jié)構(gòu)的模塊的指針,避免正在操作時被卸載,一般為初始化為THIS_MODULES
    發(fā)表于 06-16 11:30 ?4866次閱讀

    LCD的ARM編程方式,LCD Linux程序如何寫入?

    目前還沒有討論的 file_operations 方法是 ioctl ()。用戶應(yīng)用程序使用 ioctrl 系統(tǒng)調(diào)用操作 LCD 硬件。fb_ops 結(jié)構(gòu)中定義的方法為這些操作提供支 持。注意
    發(fā)表于 05-25 14:48 ?1620次閱讀
    LCD的ARM編程方式,LCD <b class='flag-5'>Linux</b>程序如何寫入?

    用戶與內(nèi)核空間數(shù)據(jù)交換的方式之一seq_file

    要想使用seq_file功能,開發(fā)者需要包含頭文件linux/seq_file.h,并定義與設(shè)置一個seq_operations結(jié)構(gòu)(類似于
    發(fā)表于 05-14 15:34 ?1452次閱讀

    深入剖析Linux文件系統(tǒng)的架構(gòu)

    函數(shù)都必須由底層派生出的實例實現(xiàn),使用成員函數(shù) file_operations。在linux里面的文件操作,底層都要實現(xiàn)file_operatio
    發(fā)表于 05-16 09:15 ?981次閱讀
    深入剖析<b class='flag-5'>Linux</b>文件系統(tǒng)的架構(gòu)

    Linux內(nèi)核如何使用結(jié)構(gòu)函數(shù)指針?

    我將結(jié)合具體的Linux內(nèi)核驅(qū)動框架代碼來展示Linux內(nèi)核如何使用結(jié)構(gòu)函數(shù)指針。
    的頭像 發(fā)表于 09-06 14:17 ?833次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核如何使用<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>和<b class='flag-5'>函數(shù)</b>指針?

    Linux驅(qū)動函數(shù)接口說明

    *parent, void *data, const struct file_operations *fops); name :要創(chuàng)建的 /sys/kernel/debug 下的目錄名 parent
    的頭像 發(fā)表于 09-27 11:20 ?376次閱讀

    怎么編寫Framebuffer驅(qū)動程序

    Framebuffer 驅(qū)動程序框架 分為上下兩層: fbmem.c:承上啟下 實現(xiàn)、注冊 file_operations 結(jié)構(gòu) 把 APP 的調(diào)用向下轉(zhuǎn)發(fā)到
    的頭像 發(fā)表于 03-22 09:13 ?414次閱讀
    怎么編寫Framebuffer<b class='flag-5'>驅(qū)動</b>程序