Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 在linux内核代码中uuu init_refok关键字意味着什么?_Linux Kernel_Kernel_Keyword_Embedded Linux_C Preprocessor - Fatal编程技术网

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