1. 程式人生 > >Linux驅動開發雜記(0x01)

Linux驅動開發雜記(0x01)

核心使用了大量不同的巨集來標記具有不同作用的函式和資料結構。如巨集__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() 函式。
  • 如果你不確定需不需要新增優化巨集則不要新增。