linux kernel是如何做到释放仅在启动时使用的内存的?
来源:互联网 发布:花千骨天羽进阶数据 编辑:程序博客网 时间:2024/06/04 23:25
你在哪里
走遍千山万水,终于找到了你。
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()有没有点眼熟呢?
我相信你会发现的:)
好了,今天就到这里,希望对你有帮助~
- linux kernel是如何做到释放仅在启动时使用的内存的?
- Linux进程使用内存的基本流程---Linux用户进程是如何释放内存的
- Linux用户进程是如何释放内存的[zt]
- Linux用户进程是如何释放内存的
- 如何手动释放Linux内存的方法
- 如何手动释放Linux内存的方法
- 如何手动释放Linux内存的方法
- 如何释放linux cache占用的内存
- 释放linux的内存
- Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文
- Kernel启动时 驱动是如何加载的module_init,加载的次序如何
- Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文
- linux 是如何启动的
- Linux的用户进程是如何使用内存的
- linux的highmem高端内存是如何被使用的
- Linux的用户进程是如何使用内存的
- Linux的用户进程是如何使用内存的
- Linux Kernel之flush_cache_all在ARM平台下是如何实现的
- 面向对象编程OOP的优点
- JAVA面试题集(2)
- bzoj3436(差分约束系统)
- 文章标题
- Ibatis如何调用存储过程?
- linux kernel是如何做到释放仅在启动时使用的内存的?
- 修改.srt格式字幕文件
- Java方向软件笔试题
- angular初学者福利啦(列表增、删、改)
- BeetlSQL 实现 ORMapping
- leetcode-java-326. Power of Three
- C++11中的move与forward
- 该如何设置数据连接池的初始大小
- java 基础学习之线程--多线程并发及线程锁