原文:eLinux.org
翻译:@zipper1956
校订:@wengpingbo, @lzufalcon
本文包括许多嵌入式 Linux 开发者感兴趣的各种内存管理相关项目和活动。
大部分内存管理技术牵扯的面很广,但对于嵌入式领域,相对容易一些,这主要得益于嵌入式领域天生不需要和内存交换之类的东西打交道(译者:这种说法太片面了)。更简单的内存管理机制和对产品计划偏离主流设计的放纵,让供应商在内存管理和虚拟内存空间上,有着更广大的空间去试验新技术。
分析系统内存使用量和剩余量比听起来更棘手。
/libhugetlbfs
之外的工作。
引用 Todd 关于怎么用 mem=
命令来保留物理内存的邮件:
假设内存拥有一个固定的地址并且该地址已经是预留的,那么更简单的方法是在 /dev/mem
设备节点上调用 mmap()
函数,其中使用 0 作为起始地址,用保留内存的物理地址作为偏移量。标志位可以是 MAP_WRITE| MAP_READ
。这样的话函数就会返回一个指向内核在用户空间映射的内存指针。例如:
如果你的 SDRAM 基地址为 0x80000000
,内存大小为 64MB ,但是你使用命令 mem=60M
保留了内存末端的 4M 内存。这样你保留的内存地址就是 0x83c00000
,所以要做的就是:
int fd;
char *reserved_memory;
fd = open("/dev/mem",0_RDWR);
reserved_memory = (char *) mmap(0,4*1024*1024,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0x83c00000);
多种改进 OOM 处理的技术已经被开发出来并被建议在 Linux 中使用。
关于 Linux 中 OOM Killer 的信息,可以查看:http://linux-mm.org/OOM_Killer
部分 OOM 避免机制要靠内核对内存使用情况的精确检测。查看精确内存检测 可了解更多关于该领域的技术信息。
下面是我了解的几种技术(这些需要进行更好的研究和文档化):
用户 "oak" 写到 (对 mem_notify 补丁的评论):
发表于 2008.02.03 14:02 UTC (Sun),oak (guest, #2786) [Link]
...
我认为这个用户空间的补丁的目的是使上层应用可以在代码容易管理的地方做内存管理操作。如前所述,许多用户空间的代码根本不处理内存分配失败的情况。就算做了,这也很难去验证所有失败的可能都被正确处理了。如果用户空间事先得到了内存不足的通知,那么用户空间可以在代码中适当的地方释放内存从而使接下来的内存分配能够成功(可能性更高)。
这同样允许做类似于 Maemo 做的事。如果系统收到内核内存不足的通知,那么它可以杀死进入后台状态的进程(保存进程界面状态, 能够恢复进程,并且对用户不可见),我认为它同样通过 D-BUS 通知当前应用系统内存不足的情况。对于用户可见或者非后台可杀死的应用应该释放它们的缓存或者关闭高内存消耗的特性。如果内存来自于堆内存而不是映射的内存,那么可能没有什么帮助,因为堆内存碎片较多而且需要更多操作时间。
这是一套机制(由 Sony and Panasonic 在 2.4 内核中建立原型),允许内核基于用户策略,为一个程序的不同段分配不同类型的内存。
可查看基于类型的内存分配获取更多信息。
LinuxMM - 有各类子项目的链接并且扮演内存管理相关话题的讨论中心
Paul McKenney 关于 CPU 缓存怎样工作的优秀论文
分类: