在內核裏經常可以看到__init, __devinit這樣的語句,這都是在init.h中定義的宏,gcc在編譯時會將被修飾的內容放到這些宏所代表的section。
- #define __init __section(.init.text) __cold notrace
- #define __initdata __section(.init.data)
- #define __initconst __section(.init.rodata)
- #define __exitdata __section(.exit.data)
- #define __exit_call __used __section(.exitcall.exit)
- __init,標記內核啓動時所用的初始化代碼,內核啓動完成後就不再使用。其所修飾的內容被放到.init.text section中。
- __exit,標記模塊退出代碼,對非模塊無效
- __initdata,標記內核啓動時所用的初始化數據結構,內核啓動完成後不再使用。其所修飾的內容被放到.init.data section中。
- __devinit,標記設備初始化所用的代碼
- __devinitdata,標記設備初始化所用的數據結構
- __devexit,標記設備移除時所用的代碼
- xxx_initcall,7個級別的初始化函數
- module_init, module_exit函數所調用的函數,需要分別用__init和__exit來標記
- pci_driver數據結構不需要標記
- probe和remove函數用__devinit和__devexit來標記
- 如果remove使用__devexit標記,則在pci_drvier結構中要用__devexit_p(remove)來引用remove函數
- 如果不確定需不需要添加宏,則不要添加