对于__init、__initdata和__exit、__exitdata的定义位于<linux/init.h>,这些宏定义的作用是告诉编译器将这些函数或者数据放入相应的section中,而在模块加载的阶段,.ko文件中的代码和数据的加载区域是根据section来加载的。
比如:如果函数的定义中带有__init,那么这个函数的所有代码会被放入.init.text的section中。
如果函数的定义中带有__initdata,那么这个函数的所有代码会被放入.init.data的section中。