linux中的_init应用,含有__attribute__ 和section的意义和作用

在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

的手册

可以看到下面的描述

 





你可能感兴趣的:(linux)