Linux kernel 在linux内核代码中uuu init_refok关键字意味着什么?
在浏览内核代码时,我遇到了一个在几个内核初始化函数中使用的关键字,Linux kernel 在linux内核代码中uuu init_refok关键字意味着什么?,linux-kernel,kernel,keyword,embedded-linux,c-preprocessor,Linux Kernel,Kernel,Keyword,Embedded Linux,C Preprocessor,在浏览内核代码时,我遇到了一个在几个内核初始化函数中使用的关键字,\uuu init\u 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 re
\uuu init\u 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
及
在那之后,我迷失了方向
如果有人能让我知道在代码中使用该关键字的目的,那将非常有帮助
[我正在寻找通过使用此关键字实现的基本功能,就像使用\uu init
帮助将初始化代码放入单独的内存位置,以便在初始化过程完成后清除。]
提前谢谢
编辑
在include/linux/init.h
中,提到了\uuuuu init\u refok
是为了抑制modpost检查中的警告,因为从普通代码到init部分代码的任何引用,但我仍然没有完全理解它。这是否意味着这些代码将放在其他地方?通过使用\uuu init\u refok
关键字,行为与正常行为的实际区别是什么?据我所知,清楚地记录了\uu init\u refok
的目的。正如你提到的
使用_init有助于将初始化代码放在单独的内存中
初始化过程完成后要清除的位置
当我们使用独立内存中的数据或代码时,编译器会生成一个警告,因为在执行引用它们的特定代码时,它们可能会被删除
\uuuu init\u refok
是一种告诉编译器您知道并有意识地引用初始化代码或数据的方法。这意味着referentinginit部分对您来说是ok。因此,编译器不会生成任何警告
该文件还记录了尽管警告被抑制,但程序员有责任编写引用init节数据或代码的代码
当然,没有警告并不意味着代码是正确的,所以最好
记录为什么需要_; ref以及为什么它可以
在您的示例中,函数free\u initmem(void)
可能引用了一些带有\u init
标记的数据或代码
\u init\u refok
标记既不删除代码也不重新定位。该代码被视为普通代码,除非它包含任何对init代码或数据的引用,否则警告将被抑制。亲爱的@Dipto,我注意到,如果我们需要一段代码,在内核初始化结束时将其清除,那么我们使用u init关键字。否则,代码将不会被删除。在上面提到的示例函数中,只使用了_init_refok,没有_init关键字,因此初始化后不会清除这些代码。如果我们参考非init部分的代码,应该可以。那么,这是否意味着使用uuu init_refok仅仅是为了抑制modpost警告,或者通过使用uuu init_ref关键字执行其他操作?标记为u init_refok
的函数不会被删除,因为它们不是初始化代码。这些函数可能正在使用带有\u init
标记的某些代码或数据,这些代码或数据将在执行后删除。所以引用它们会产生运行时错误,这就是modpost抛出警告的原因。但是如果init代码仍然有效(由于任何原因),那么仍然可以访问这些代码或数据。因此,如果您知道init代码或数据在访问期间是有效的,那么您就不需要警告了。
#define __ref __section(.ref.text) noinline