寫過 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文章
1840瀏覽量
85307 -
Linux
+關注
關注
87文章
11310瀏覽量
209597 -
函數
+關注
關注
3文章
4332瀏覽量
62653
發布評論請先 登錄
相關推薦
評論