在linux内核代码中,我已经看到很多时间__initdata
和__init
宏来构建这样的函数和静态结构作为初始化时间所需的数据。
在init进程内核后,它自己释放了这样的内存。
那么我们如何在运行c程序的用户空间中实现这些东西?
看到我在某个程序中有大的静态数据结构,我需要在启动一些程序之后我不需要那个内存所以我怎么能释放它?
我知道静态成员的生命周期是在程序终止之前所以如何编程免费这样的东西?
这个东西是否用于任何用户空间c程序?
答案 0 :(得分:3)
__init
是include/linux/init.h
中的一个宏
__attribute__ ((__section__(".init.text")))
__initdata
变为__attribute__ ((__section__(".init.data")))
如果您希望模拟与上述宏类似的行为,那么您应该使用__attribute__
关键字以及要放置变量的二进制文件的__section__
。
您必须知道二进制文件的组织方式,二进制文件中的各个部分。然后参考: https://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes 找到你可以做的,以达到你想要的效果。
其他指示:
https://gcc.gnu.org/onlinedocs/gccint/Initialization.html https://unix.stackexchange.com/questions/134418/how-many-sections-can-i-create-in-object-file
应该可以帮助您了解可执行文件中的section
。
答案 1 :(得分:2)
用户空间在虚拟内存中运行,因此无法从这些方法中获得任何东西。
当内存变紧时,内存管理将逐出程序页面。访问它们时,它们将再次从磁盘加载。如果不再访问它们,它们将不再使用RAM。所有这些都是自动发生的,无需链接器恶作剧。
无论如何,你想要这样做的唯一原因是你的虚拟内存不足,这在64位程序中是不会发生的。