【问题标题】:what does __init_refok keyword means in linux kernel code?__init_refok 关键字在 linux 内核代码中的含义是什么?
【发布时间】:2013-04-26 06:07:47
【问题描述】:

在浏览内核代码时,我遇到了一个在多个内核初始化函数中使用的关键字__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 关键字,该行为与正常行为有何不同?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 亲爱的@Dipto,我注意到如果我们需要在内核初始化结束时清除一段代码,那么我们使用 __init 关键字。否则,代码将不会被删除。上面提到的示例函数中,只用到了__init_refok,没有__init关键字,所以这些代码在初始化后不会被清除。如果我们参考非初始化部分的代码,那应该没问题。那么,这是否意味着 __init_refok 仅用于抑制 modpost 警告,或者还通过使用 __init_ref 关键字执行其他操作?
    • 用_init_refok 标记的函数不会被删除,因为这些不是初始化代码。这些函数可能正在使用一些带有_init 标记的代码或数据,这些代码或数据将在执行后被删除。所以引用它们会产生运行时错误,这就是 modpost 抛出警告的原因。但是如果初始化代码仍然有效(由于任何原因),这些代码或数据仍然可以被访问。所以,如果你知道初始化代码或数据在访问期间是有效的,那么你就不需要警告了。
    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2012-06-12
    • 2018-01-14
    • 1970-01-01
    • 2019-12-03
    相关资源
    最近更新 更多