简体   繁体   English

如何在保留虚拟地址范围的同时释放内存?

[英]How to release memory while preserving virtual address range?

I'm working on a device that has very tight memory size and virtual address space constraint. 我正在使用内存大小和虚拟地址空间受限的设备。

I'm trying to solve this problem by reclaiming memory more frequently while reclaiming virtual address less frequently, eg reserving virtual address early but committing memory late, while reclaiming memory early and releasing virtual address late. 我正在尝试通过更频繁地回收内存而又不那么频繁地回收虚拟地址来解决此问题,例如,较早地保留虚拟地址,但较晚地提交内存,而较早地回收内存,并较晚地释放虚拟地址。

Particularly there is a very large allocation that suffers a lot from address space fragmentation and I'm trying to solve it by reserving address space for it up front. 特别是有一个非常大的分配,它遭受地址空间碎片的困扰,我正试图通过为其预先保留地址空间来解决它。

This question solves the first problem: use mmap with PROT_NONE to acquire virtual address range, and use mprotect with PROT_READ|PROT_WRITE before use, and then pages would be faulted in when used. 这个问题解决了第一个问题:使用mmapPROT_NONE来获取虚拟地址范围,并在使用前将mprotectPROT_READ|PROT_WRITE使用,然后在使用时页面会出错。

However, I couldn't find a way to do the reverse: mprotect with PROT_NONE doesn't seem to release the pages, while calling munmap loses the virtual address range. 但是,我无法找到一种方法做反向: mprotectPROT_NONE似乎并没有释放的页面,同时调用munmap失去了虚拟地址范围。

Is there to unmap/detach pages while preserving virtual address? 是否可以在保留虚拟地址的同时取消映射/分离页面?

带有MAP_FIXED mmap将替换指定地址范围内的任何现有映射,并在不再引用该内存时释放其内存。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM