2015-06-20 54 views
9

驅動程序我看着有__devexit在函數聲明中的含義是什麼?

static void __devexit rtsx_remove(struct pci_dev *pci) 

是什麼意思__devexit在函數定義的範圍內?我見過的其他函數最多有static和返回類型。

+0

這是在這個問題上的兩個嘗試。看起來第一次嘗試被無關的細節蒙上了一層陰影,以至於沒有得到答覆。我想刪除這個問題,但是堆棧溢出警告說它被壓低了,我覺得編輯會使以前的回答看起來不相關。如果有人建議選擇編輯/刪除,請告訴我。 – Kenkron

+7

爲什麼不右鍵單擊'__devexit'符號,進入其定義,並確切地看到它是什麼意思?它很可能只是一個註釋,用於通過外部工具生成預定義的警告,該工具會檢查編碼的正確性等。 –

+2

這是Unix內核中的一些宏:http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/init.h – SomethingSomething

回答

2

龍十歲上下簡而言之:

這是擴展到一組的gcc 屬性宏。它們是向編譯器提供有關代碼中各種東西的特殊信息的一種方式,例如,在這種情況下,它是一種函數。

爲此目的,不同的編譯器有不同的語法結構,它沒有被標準化。例如,gcc使用屬性,但其他編譯器使用不同的結構。

龍十歲上下的故事長上下的:

所以,我沒有Linux內核專家,而是由源代碼來看,這個宏用於Hotplug。我相信它意味着函數應該用一個特定的設備退出。

例如,您提供的功能似乎來自用於與Realtek PCI-Express讀卡器驅動程序配合使用的一組Hotplug功能。

該宏實際上做了什麼?好吧,讓我們來仔細看看宏的定義:

#define __devexit  __section(.devexit.text) __exitused __cold 

第一部分是__section(.devexit.text)

# define __section(S) __attribute__ ((__section__(#S))) 

正如你所看到的,這與部分名稱爲".devexit.text"創建__attribute__(__section__())。這意味着gcc將使用該屬性將函數的彙編代碼編譯爲名稱爲.devexit.text(而不是缺省部分)的編譯後二進制文件中的命名段。

第二部分__exitused(定義的東西只有在MODULE宏定義):

#define __exitused __used 

而且__used是,根據不同的gcc版本,定義要麼是這樣的:

# define __used     __attribute__((__used__)) 

或者像這樣:

# define __used     __attribute__((__unused__)) 

前者確保具有此屬性的函數即使未在任何位置引用也會被編譯。後者在相同情況下抑制編譯器警告,儘管它不會以任何方式影響編譯。

最後,__cold

#define __cold     __attribute__((__cold__)) 

這是通知具有這種屬性的功能不會被通常稱爲,以便它可以相應地優化編譯器的屬性。

Sooo,我們到底有什麼?看起來像__devexit標記的函數是只是不經常調用的函數(如果完全調用),並填充到命名部分。

所有的源代碼取自here。它看起來像宏現在實際上是removed from the Linux Kernel

+1

非常感謝,你是一位紳士和學者。 – Kenkron

1

「......這是最有可能只是一個註解......」 --barak馬諾斯

尤里卡!事實證明,這個神祕元素可能被稱爲annotation,它增加了關於函數的額外信息。這些額外的信息可以由編譯器檢查,以發現可能會被忽視的錯誤。

編輯:@MattMcNabb說這不是一個註釋。增加不確定性

+0

這可能是很多事情,因爲它很可能是一個宏。 – Olaf

+1

如果它是[Linux內核__devexit](http://lxr.free-electrons.com/ident?v = 2.6.33; i = _devexit),那麼它肯定不是一個「註釋」。 –

+0

好的,它是什麼? – Kenkron

相關問題