2016-03-16 92 views
1

這是一個新手的內核模塊的問題...我有mymodule.c的一個功能:Linux內核模塊如何知道它的文件何時被打開?

static int mymodule_open(struct inode *inode, struct file *filp) 
{ 
    //printk(KERN_INFO "open called\n"); 
    /* Success */ 
    return 0; 
} 

和用戶級程序,其中變量初始化後的第一行是:

FILE *pFile = fopen("/dev/mymodule", "r+"); 

當我運行用戶級程序這fopen莫名其妙地調用mymodule.c的的mymodule_open命令(編譯mymodule.ko)。它如何知道這樣做?關於mymodule_open()如何知道當fopen打開/dev/mymodule時,我無法連接點。

+1

您聯繫'mymodule_open'以'file_operations'結構,對不對?從那裏連接點... – nneonneo

+2

閱讀非常好的[Linux設備驅動程序](http://shop.oreilly.com/product/9780596000080.do)。具體來說,請參閱[主要和次要數字]一節(http://www.xml.com/ldd/chapter/book/ch03.html#t2) – kaylum

+1

需要注意的事項:內核維護一個打開的「refcount 「爲每個設備。如果你做'xf1 = fopen(「/ dev/mymodule」,...); xf2 = fopen(「/ dev/mymodule」,...);'然後'fclose(xf2); fclose(xf1)',你的'mymodule_open'將只爲'xf1'調用,'mymodule_close'只爲'xf1'調用。也就是說,無論有多少嵌套打開完成,驅動程序只在第一個回調中獲得一個回調,並且只在最後一次關閉時才接近關閉。 –

回答

2

有在內核中的模塊登記機構,用於設備驅動程序或內核模塊。

/dev/module將與您的模塊鏈接。

該設備的操作和文件操作結構被映射在與設備文件。

struct file_operations fops = { 
open : my_module_open, 
release : my_module_release, 
ioctl : my_module_ioctl, 
}; 

設備文件將確定並打開與設備文件的主要和次要number.First幫助的模塊,然後文件操作結構。

還應考慮device registrationdevice file operations

1

當下用戶空間打的fopen調用,它就會被髮送到打開「系統調用」,並從那裏到相應/註冊駕駛FOPS開通話通過識別主要:設備文件的次要號碼

每個設備文件都有一個「主要:次要」元組屬於一個特定的驅動程序,相應的fops結構將支持聲明/定義的操作。

的fopen(的/ dev/MyModule的) - > library_function(打開,file_arguments) - > 系統調用(打開,file_arguments) - > filesystem_driver(inode的,開放的, more_arguments) - > filesystem_driver(主要:次要的,開放, more_arguments) - > fops_structure(開,more_arguments)

注:上面的名字都是從FOPEN到mymodule_open,除此之外,河道水流的解釋,名字都沒有絕對的函數名,即, library_function,systemcall,filesystem_driver ...

司機知道在/ dev/mymodule中打開文件,因爲它是作爲以上述方式所提到的,從的fopen一個觸發事件,功能各級別開始觸發函數調用的一個新的水平,直至達到mymodule_open的最終功能內部驅動