在写内核驱动或分析驱动时总是从module_init和module_exit开始的,一直都知道这是个驱动程序初始化的函数,也没去多想它,今天分析了下驱动究竟是何时加载到内核中的呢?结果发现还是得从这个函数入手
首先函数定义 include/linux/init.h
#ifndef MODULE
...
#define module_init(x) __initcall(x);
...
else
...
#define module_init(initfn) \
static inline initcall_t __inittest(void) \
{ return initfn; } \
int init_module(void) __attribute__((alias(#initfn)));
...
#endif
驱动有两种加载方式,一种是编译到内核中,另一种是以模块的形式出现(insmod加载,rmmod卸载),上面就是两种形式的分别定义,这里只分析下编译到内核的情况