在linux/init.h中定义如下:
#define __init __section(.init.text) __cold notrace
有些版本的内核是这样定义的:
#define __init __attribute__ ((__section__ (".init.text"))) __cold
__attribute__ 是什么?
linux内核代码使用了大量的GNU C扩展,以致于使GNU C成为唯一能够编译内核的编译器,
GNU C这些扩展对代码的优化、目标代码布局和安全检查提供了支持。
__attribute__ 就是这些扩展中的一个,它主要用来声明一些特殊的属性,这些属性指示
编译器进行特定的优化和更仔细的代码检查。
GNU C支持十几个属性,section是其中一个。
通常编译器将函数放在.text节,变量放在.data字节或.bss节,
使用section属性,可以指定编译器将函数和变量放在特定节,
那么_init的修饰或者用_init定义的作用就是将它修饰的代码放在.init.text节中。
链接器可以将相同节的函数或数据放在一起,比如_init修饰的代码放在.init.text节里,
初始化后可以释放部分内存。
简单来说是指示gcc把标记的数据或者函数放到指定sector。
linux中把一些启动及初始化时候用的数据用__init标识,然后在适当的时候把它们释放,回收内存。
好像这里引出了更多的疑问,
__attribute__
是什么
?Linux
内核代码使用了大量的
GNU
C
扩展,以至于
GNU C
成为能够编译内核的唯一编译器,
GNU C
的这些扩展对代码优化、目标
代码布局、
安全检查等方面也提供了很强的支持。
而
__attribute__
就是这些扩展中的一个,
它主要被用来声明一些特殊的属性,
这些属性主要被用来指示编译器进行特定方面的优化和
更仔细的代码检查。
GNU C
支持十几个属性,
section
是其中的一个,我们查看
GCC
的手册
可以看到下面的描述
好像这里引出了更多的疑问,
__attribute__
是什么
?Linux
内核代码使用了大量的
GNU
C
扩展,以至于
GNU C
成为能够编译内核的唯一编译器,
GNU C
的这些扩展对代码优化、目标
代码布局、
安全检查等方面也提供了很强的支持。
而
__attribute__
就是这些扩展中的一个,
它主要被用来声明一些特殊的属性,
这些属性主要被用来指示编译器进行特定方面的优化和
更仔细的代码检查。
GNU C
支持十几个属性,
section
是其中的一个,我们查看
GCC
的手册
可以看到下面的描述
参考:
http://wenku.baidu.com/view/36e7bb24ccbff121dd368344.html
好像这里引出了更多的疑问,
__attribute__
是什么
?Linux
内核代码使用了大量的
GNU
C
扩展,以至于
GNU C
成为能够编译内核的唯一编译器,
GNU C
的这些扩展对代码优化、目标
代码布局、
安全检查等方面也提供了很强的支持。
而
__attribute__
就是这些扩展中的一个,
它主要被用来声明一些特殊的属性,
这些属性主要被用来指示编译器进行特定方面的优化和
更仔细的代码检查。
GNU C
支持十几个属性,
section
是其中的一个,我们查看
GCC
的手册
可以看到下面的描述