未加星标

Linux Kernel是如何做到释放仅在启动时使用的内存的?

字体大小 | |
[系统(linux) 所属分类 系统(linux) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏
你在哪里

走遍千山万水,终于找到了你。

void free_initmem(void)
{
free_init_pages("unused kernel",(unsigned long)(&__init_begin),(unsigned long)(&__init_end));
}

啥也不说了,看这个函数名大家就知道是释放启动过程中使用的内存空间的。

只是因为在代码中多看了你一眼 static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;

在看内存管理的代码中,说memblock使用的内存在启动后会又内核回收,继续作为内核可以使用的内存。引发了我一点点的好奇心。 话说内核也是像我们贫下中农一样,挺省吃俭用的嘛。

从代码上看,和普通变量定义时的差异就是这个后缀修饰,__initdata_memblock。

#ifdef CONFIG_ARCH_DISCARD_MEMBLOCK
#define __init_memblock __meminit
#define __initdata_memblock __meminitdata
#else
#define __init_memblock
#define __initdata_memblock
#endif

看来这个还得在内核配置上有所配置才能做到省吃俭用。感觉和人生一样,有的娃出生的时候含着金钥匙,完全不在乎那么点内存;而有的就要默默执行hard模式咯。

作为穷苦的孩子,咱还是学习学习hard模式是怎么个玩儿的哈

#define __meminitdata __section(.meminit.data)

ok,原来就是把这个数据结构定义在了一个叫 .meminit.data的区域。

区域(section)这个高级货大家请自行搜索 elf section哈,因为我也不大记得了。还是不要误导了大家。

幸福像花儿一样

此处略过若干字,在include/asm-generic/vmlinux.lds.h文件中,有如下定义

#if defined(CONFIG_MEMORY_HOTPLUG)
#define MEM_KEEP(sec) *(.mem##sec)
#define MEM_DISCARD(sec)
#else
#define MEM_KEEP(sec)
#define MEM_DISCARD(sec) *(.mem##sec)
#endif
/* init and exit section handling */
#define INIT_DATA \
*(.init.data) \
MEM_DISCARD(init.data) \
KERNEL_CTORS() \
...
#define INIT_DATA_SECTION(initsetup_align) \
.init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { \
INIT_DATA \
INIT_SETUP(initsetup_align) \
INIT_CALLS \
CON_INITCALL \
SECURITY_INITCALL \
INIT_RAM_FS \
}

我猜你已经看出点什么来了,如果没用猜出来那再看上述代码一百遍。。。

哦,忘了说了,这里有个东西叫 “gcc链接脚本”,大家请先自行搜之 -_-!

踏破铁鞋无觅处

高兴得太早了,刚才一路顺溜得找到了INIT_DATA_SECTION(),然后,就不知道然后了。。。

关键时候注释起到了不可忽视的作用。所以说,写代码注释很重要。

* SECTIONS
* {
* . = START;
* __init_begin = .;
* HEAD_TEXT_SECTION
* INIT_TEXT_SECTION(PAGE_SIZE)
* INIT_DATA_SECTION(...)
* PERCPU_SECTION(CACHELINE_SIZE)
* __init_end = .;
*
* ...
* }

原来启动阶段可以释放的内存不仅仅是内存初始化相关的部分,还包括了其他好多东西。嗯,又那么深入了一点点~

好了,你看这里和最开始的free_initmem()有没有点眼熟呢?

我相信你会发现的:)

好了,今天就到这里,希望对你有帮助~

本文地址 : http://www.codesec.net/Linux/2016-10/135907.htm

本文系统(linux)相关术语:linux系统 鸟哥的linux私房菜 linux命令大全 linux操作系统

主题: Linux数据结构CPUTICTIKEE数据CURY变量
分页:12
转载请注明
本文标题:Linux Kernel是如何做到释放仅在启动时使用的内存的?
本站链接:http://www.codesec.net/view/481314.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 系统(linux) | 评论(0) | 阅读(30)