在浏览内核代码时,我遇到了几个内核初始化函数__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
关键字的正常行为有何不同?
答案 0 :(得分:0)
据我了解,include/linux/init.h清楚地记录了__init_refok
的目的。如你所说
当我们使用使用__init有助于将初始化代码放在单独的内存中 初始化过程完成后要清除的位置。
separate memory
中的数据或代码时,编译器会生成警告,因为它们可能会在执行引用它们的特定代码时被删除。
__init_refok
是一种告诉编译器您知道并有意识地引用初始化代码或数据的方法。这意味着参考为您提供确认部分确定。因此编译器不会生成任何警告。
该文件还记录了,虽然警告被禁止,但程序员有责任编写引用init部分数据或代码的代码。
当然,没有警告并不意味着代码是正确的,所以最佳 记录为什么需要__ref以及为什么没关系
在您的示例中,函数free_initmem(void)
可能指的是使用_init
标记的某些数据或代码。
_init_refok
标记不会删除既不重定位的代码。该代码被视为普通代码,除非它包含对init代码或数据的任何引用,否则将禁止警告。