__init_refok关键字在linux内核代码中的含义是什么?

时间:2013-04-26 06:07:47

标签: linux-kernel kernel keyword embedded-linux c-preprocessor

在浏览内核代码时,我遇到了几个内核初始化函数__init_refok中使用的关键字。

我遇到的一些线路就像

void __init_refok free_initmem(void)
static void __init_refok vgacon_scrollback_startup(void)
const struct linux_logo * __init_refok fb_find_logo(int depth)
void noinline __init_refok rest_init(void)

和其他人。

我搜索了引用,从中我发现它被定义为include/linux/init.h第71行中的预处理器宏。

浏览完之后,我得到了以下代码

#define __init_refok     __ref

#define __ref            __section(.ref.text) noinline

在那之后,我正在失去轨道。

如果有人可以告诉我在代码中使用该关键字的目的是什么,那将非常有用。

[我正在寻找使用此关键字实现的基本功能,就像使用__init有助于在初始化过程完成后将初始化代码放入单独的内存位置。]

提前致谢。

修改

include/linux/init.h中,提到像__init_refok一样是为了通过modpost检查来抑制警告,因为任何参考形式都是正常的代码到init部分代码,但是,我仍然没有得到它。这是否意味着这些代码将放置在其他地方?实际行为与使用__init_refok关键字的正常行为有何不同?

1 个答案:

答案 0 :(得分:0)

据我了解,include/linux/init.h清楚地记录了__init_refok的目的。如你所说

  

使用__init有助于将初始化代码放在单独的内存中   初始化过程完成后要清除的位置。

当我们使用separate memory中的数据或代码时,

编译器会生成警告,因为它们可能会在执行引用它们的特定代码时被删除。

__init_refok是一种告诉编译器您知道并有意识地引用初始化代码或数据的方法。这意味着参考为您提供确认部分确定。因此编译器不会生成任何警告。

该文件还记录了,虽然警告被禁止,但程序员有责任编写引用init部分数据或代码的代码。

  

当然,没有警告并不意味着代码是正确的,所以最佳   记录为什么需要__ref以及为什么没关系

在您的示例中,函数free_initmem(void)可能指的是使用_init标记的某些数据或代码。

_init_refok标记不会删除既不重定位的代码。该代码被视为普通代码,除非它包含对init代码或数据的任何引用,否则将禁止警告。