寫過 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ū)懯欠駮枞?。poll 方法應(yīng)當(dāng)返回一個位掩碼指示是否非阻塞的讀或?qū)懯强赡艿模⑶姨峁┙o內(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 標志發(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)用的標志。
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 等。
-
驅(qū)動
+關(guān)注
關(guān)注
12文章
1844瀏覽量
85353 -
Linux
+關(guān)注
關(guān)注
87文章
11319瀏覽量
209828 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4338瀏覽量
62738
發(fā)布評論請先 登錄
相關(guān)推薦
評論