1

在浏览内核代码时,我遇到了一个在几个内核初始化函数中使用的关键字,__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 help 将初始化代码放在单独的内存位置以便在 init 进程完成后清除一样。]

提前致谢。

编辑

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

4

1 回答 1

0

据我了解,include/linux/init.h清楚地记录了__init_refok. 正如你所提到的

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

当我们使用来自 的数据或代码时,编译器会生成警告,separate memory因为它们可能会在执行引用它们的特定代码时被删除。

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

该文件还记录了尽管警告被禁止,但程序员有责任编写引用 init 节数据或代码的此类代码。

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

在您的示例中,这些函数free_initmem(void)可能是指一些带有 . 标记的数据或代码_init

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

于 2013-04-26T09:28:46.863 回答