您的位置:首页 > 其它

关于__init、__initdata和__exit、__exitdata的学习笔记

2015-04-17 17:31 309 查看
__initdata用法例子:

static struct init_tags {

struct tag_header hdr1;

struct tag_core core;

struct tag_header hdr2;

struct tag_mem32 mem;

struct tag_header hdr3;

} init_tags __initdata = {

{ tag_size(tag_core), ATAG_CORE },

{ 1, PAGE_SIZE, 0xff },

{ tag_size(tag_mem32), ATAG_MEM },

{ MEM_SIZE, PHYS_OFFSET },

{ 0, ATAG_NONE }

};

上面“init_tags __initdata = ”中的__initdata是一个宏(定义在include/linux/init.h中):

#define __initdata
__attribute__ ((__section__ (".init.data")))

在一个函数中有如下语句:

struct tag *tags = (struct tag *)&init_tags;

******************************************************************************************************

由于4年前对于C语言和Linux的知识贫乏,所以当时对于模块中的函数定义没有细看。这次在温习《LDD3》的时候,重新看了一下关于__init、__initdata和__exit、__exitdata的知识,记录如下:

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

比如:如果函数的定义中带有__init,那么这个函数的所有代码会被放入.init.text的section中。

如果函数的定义中带有__initdata,那么这个函数的所有代码会被放入.init.data的section中。

之所以要使用这个宏定义,其中一个原因是标记为初始化的函数和数据,表明该函数和数据仅在初始化期间使用。在模块装载之后,模块装载就会将初始化函数扔掉。这样可以将该函数占用的内存释放出来。

这种释放根据是否编译进内核是有区别的:

(1)模块编译进内核:所有的初始化数据和函数都是在系统启动的最后阶段,在所有模块都初始化完成以后被内核统一释放的。所有你一般可以在内核启动信息的后面看到:

PHY: 0:01 - Link is Up - 100/Full

VFS: Mounted root (nfs filesystem) on device 0:14.

devtmpfs: mounted

Freeing init memory: 196K

INIT: version 2.86 booting

(2)独立的模块:模块是通过module-init-tool中的insmod的程序利用系统调用来挂载的,而所有的初始化数据和函数都是被这个系统调用所使用的,在模块挂载完成并初始化过后,由系统调用来完成对初始化数据和函数所占空间的释放。

所以对于将内核驱动代码中的函数和数据定义为“初始化”时需要注意:不要将驱动定义的文件方法(如 open、read、write、close)或者驱动在实际工作中需要使用的函数和数据定义为“初始化”属性,因为在驱动初始化后这些东东就已经被释放了,如果使用了就会Oops。

有些网上的文章中写到:

__init宏使内建模块中的init函数在执行完成后释放掉,不过可装载的模块不受影响。

这个是错误的,这些“初始化”宏同样影响可装载模块。从模块装载的系统调用源码中你可以找到释放的地方,他释放的是整个“初始化”section。具体的情况请参考《深入Linux内核构架》的《第七章
模块》

从代码上可以证明“初始化”宏同样影响可装载模块,从实验中同样可以,实验步骤:

(1)在一个简单的字符驱动中定义一个“初始化”字符串,并在模块初始化时打印出来。在驱动的其他方法中也试图打印这个字符串,如果这个方法被系统调用执行了,那么你就得到了一个Oops。

(2)去掉这个字符串定义时的“初始化”宏,再做一边实验,字符串依然可以被打印出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐