【linux 内存管理】 关键的全局变量

1、max_pfn:

调用栈:

setup_arch():

    max_pfn = e820__end_of_ram_pfn();

e820__end_of_ram_pfn()函数时找到e820探测的最大的物理地址区间(RAM的即usable)的物理地址所在的页帧号与该架构支持的最大帧号的最大值。如:

2、max_low_pfn

setup_arch():

     max_low_pfn=e820__end_of_low_ram_pfn();

与上面的max_pfn算法一样,不过是在e820探测中找到不大于4G内存所对应的最大帧(1UL<<(32-PAGE_SHIFT))

变量

描述

max_low_pfn

x86中,max_low_pfn变量是由find_max_low_pfn函数计算并且初始化的,它被初始化成ZONE_NORMAL的最后一个page的位置。这个位置是kernel直接访问的物理内存, 也是关系到kernel/userspace通过“PAGE_OFFSET宏”把线性地址内存空间分开的内存地址位置

min_low_pfn

系统可用的第一个pfn是min_low_pfn变量, 开始与_end标号的后面, 也就是kernel结束的地方.在文件mm/bootmem.c中对这个变量作初始化

max_pfn

系统可用的最后一个PFN是max_pfn变量, 这个变量的初始化完全依赖与硬件的体系结构.

max_possible_pfn

 

3、totalram_pages

start_kernel()->mm_init()->mem_init()->free_all_bootmem()(Nobootmem版本)

看函数注释for_each_free_mem_range在做什么,她遍历memblock管理的内存中,属于memblock.memory但不属于memblock.reserved的内存。结合这些看free_low_memory_core_early在做什么,她是将属于memblock.memory但不属于memblock.reserved的内存给释放到伙伴系统中了。对于memblock来说是伙伴系统初始化之前的内存分配的方式,将分配的内存保存在memblcok.reserve中。从这里可以得出一个结论就是memblcok在完成她的使命释放她所管理的内存的时候,那些memblcok.reserve的内存时不释放的。

这里还要注意一个地方,for_each_free_mem_range()中的reserve_bootmem_region():

她将每一个已经在memblock.reserved的页帧都打上PageResered标记,这点非常重要。

 

这里举例看下。我们公司代码中会根据不同架构来给设备预留内存,这个预留的过程是发生在setup_arch()中,这时候伙伴系统都还没初始化,这时候我们把预留的内存通过调用cmmblock_add加入到我们公司自己的一个大块内存的一个分配模块当中,同时将这块内存添加到了memblcok.reserve,表明了这段内存目前已经被占用。什么时候会释放呢?我们公司在需要预留内存的模块使用完成他们的初始化后,会将剩余的预留内存归还给伙伴系统(因为预留内存都是给相应模块使用,那时候系统都已经初始化完成,当然也包括了伙伴系统,此时将所有页帧释放到伙伴系统当中即可),在释放的过程中totalram_pages++。之前考虑过free_all_bootmem会把我们cmmblock预留的也给释放了,但是这种担心是不必要的,因为我们公司预留的内存已经保存在了memblock.reserved中,free_all_bootmem释放已经避开了这个memblock.reserved,所以说我们公司使用的这块预留内存,在使用完成后需要手动释放,并将totalram_pages++。

 

总的来说,这个totalram_pages全局变量就是当前系统刨去系统所占用内存,比如代码段、数据段、系统预留内存等,linux系统所能管理的内存页帧数(比如伙伴系统管理内存)。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值