在我们阅读内核代码时,经常会看到有的函数名称前面会带有“_ _”的双下划线,而有些又没有,这个有什么用呢?
原来内核API函数具有这种名称的,通常都是一些接口的底层函数,应该谨慎使用。实质上,这里的双下划线就是要告诉程序员:谨慎调用,后则后果自负。举个例子,在内核模块的初始函数时,实际的定义如下:
static int _ _init initializition_function(void)
{
/*具体的初始化代码*/
}
module_init(initialization_function);
还有清除函数:
static void _ _exit cleanup_function(void)
{
/*具体的清除代码*/
}
module_exit(cleanup_function);
因为清除函数没有返回值,所以会被声明为void。_ _exit 修饰词标记该代码仅用于模块卸载(编译器将把该函数放在特殊的ELF段中),如果在编译时被编译进内核,而不是以模块化编译,则这个函数将会被忽略丢掉,它只能在模块被卸载或者是关闭系统的时候被调用,其他的任务时间的调用都是错误的。
这里面就用到了_ _init 和_ _exit有双下划线函数,虽然这个函数看起来的点不一般,它对内核来说是一种暗示,表明这个函数是在模块初始化的时候使用。但是当模块被卸载后,模块装载器就会把这个函数给丢弃掉,将这个模块占用的系统资源释放。
所以当我们在写程序代码或者是修改内核代码时,如果希望在初始化结束后仍然使用这个函数或者是数据结构,就千万不要加上双下划线,否则会带来意想不到的严重后果。