Linux驅動開發雜記(0x01)
阿新 • • 發佈:2018-12-20
核心使用了大量不同的巨集來標記具有不同作用的函式和資料結構。如巨集__init 、__devinit 等。這些巨集在include/linux/init.h 標頭檔案中定義。編譯器通過這些巨集可以把程式碼優化放到合適的記憶體位置,以減少記憶體佔用和提高核心效率。
下面是一些常用的巨集:
__init
標記核心啟動時使用的初始化程式碼,核心啟動完成後不再需要。以此標記的程式碼位於.init.text 記憶體區域。
__exit
標記退出程式碼,對於非模組無效。
__initdata
標記核心啟動時使用的初始化資料結構,核心啟動完成後不再需要。以此標記的程式碼位於.init.data 記憶體區域。
__devinit
標記裝置初始化使用的程式碼。
__devinitdata
標記初始化裝置資料結構的函式。
__devexit
標記移除裝置時使用的程式碼。
xxx_initcall
一系列的初始化程式碼,按降序優先順序排列。
初始化程式碼的特點是:在系統啟動執行,且一旦執行後馬上退出記憶體,不再佔用記憶體。
對於驅動程式模組來說,這些優化標記使用的情況如下:
- 通過module_init() 和module_exit() 函式呼叫的函式就需要使用__init 和__exit 巨集來標記。
- pci_driver 資料結構不需標記。
- probe() 和remove() 函式應該使用__devinit 和__devexit 標記,且只能標記probe() 和remove()
- 如果remove() 使用__devexit 標記,則在pci_driver 結構中要用__devexit_p(remove) 來引用remove() 函式。
- 如果你不確定需不需要新增優化巨集則不要新增。