驅動程序我看着有__devexit在函數聲明中的含義是什麼?
static void __devexit rtsx_remove(struct pci_dev *pci)
是什麼意思__devexit
在函數定義的範圍內?我見過的其他函數最多有static
和返回類型。
驅動程序我看着有__devexit在函數聲明中的含義是什麼?
static void __devexit rtsx_remove(struct pci_dev *pci)
是什麼意思__devexit
在函數定義的範圍內?我見過的其他函數最多有static
和返回類型。
龍十歲上下簡而言之:
這是擴展到一組的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。
非常感謝,你是一位紳士和學者。 – Kenkron
「......這是最有可能只是一個註解......」 --barak馬諾斯
尤里卡!事實證明,這個神祕元素可能被稱爲annotation,它增加了關於函數的額外信息。這些額外的信息可以由編譯器檢查,以發現可能會被忽視的錯誤。
編輯:@MattMcNabb說這不是一個註釋。增加不確定性
這些屬性在Linux內核中用於某些驅動程序功能和數據聲明,將它們放在一個單獨的部分中,在某些情況下可能會丟棄它們。
但是,它們不再使用(或定義)從3.10.x開始。參見:https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=54b956b903607
這是在這個問題上的兩個嘗試。看起來第一次嘗試被無關的細節蒙上了一層陰影,以至於沒有得到答覆。我想刪除這個問題,但是堆棧溢出警告說它被壓低了,我覺得編輯會使以前的回答看起來不相關。如果有人建議選擇編輯/刪除,請告訴我。 – Kenkron
爲什麼不右鍵單擊'__devexit'符號,進入其定義,並確切地看到它是什麼意思?它很可能只是一個註釋,用於通過外部工具生成預定義的警告,該工具會檢查編碼的正確性等。 –
這是Unix內核中的一些宏:http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/include/linux/init.h – SomethingSomething