0

在編寫內核模塊/驅動程序,大多數時候一些結構被初始化爲指向某個特定的功能。作爲初學者,有人可以解釋這一點的重要性。使用結構設置功能

只見struct file_operations一邊寫字符設備驅動程序

而且我發現,eventhough的函數聲明他們並不總是執行。任何人都可以提供幫助。例如,在內核源代碼:kernel/dma.c中,儘管如此,仍然需要

static const struct file_operations proc_dma_operations = { 
    .open  = proc_dma_open, 
    .read  = seq_read, 
    .llseek  = seq_lseek, 
    .release = single_release, 
}; 

被定義,只有proc_dma_open被實現。

+3

否,其他功能(seq_read,seq_lseek和single_release)被簡單地別處實現。 – fge 2011-12-27 17:10:57

+0

@fge我無法在內核源代碼的dma.c,dma.h或seq_file.h中找到'seq_read','single_release','seq_lseek'。 '' – user567879 2011-12-27 17:36:04

+0

這個例子有點「奇怪」。通常,填充這些結構時,可以用指向你的函數的指針來填充它們。在這裏,您使用一些「標準」函數(seq_xxx,在fs/seq_file.c中實現)和您自己的函數(proc_dma_open)。 – ugoren 2011-12-27 19:48:16

回答

1

功能seq_readseq_lseeksingle_release內核源文件linux-3.1.6/include/linux/seq_file.h中被聲明和內核源文件linux-3.1.6/fs/seq_file.c中所定義。它們可能在許多文件操作中很常見。

1

如果你曾經與C++等面向對象的語言發揮,認爲file_operations作爲基類,你的功能作爲其虛擬方法的實現。

0

函數指針是C語言,允許的函數調用實時重定向一個非常強大的工具。如果不是所有操作系統都有類似的機制,就像在舊的MS-DOS,允許TSR程序存在例如臭名昭​​著的INT 21函數25/35。

在C中,可以將指針分配給一個功能給一個變量,然後調用通過該變量該功能。該函數可以在基於某些參數的init時間或基於某些行爲的運行時進行更改。

下面是一個例子:

int fn(int a) 
{ 
    ... 
    return a; 
} 

... 

int (*dynamic_fn)(int); 
... 
dynanic_fn = &fn; 
... 
int i = dynamic_fn(0); 

當指針「生活」在這樣的結構,可以被傳遞到系統調用,這是一個非常強大的功能,允許鉤到系統功能。

在面向對象的語言中,通過使用反射動態實例化類,可以實現同樣的行爲。