[内存管理] Linux Reserved Memory 用法

本文探讨了在Linux中如何通过预留内存技术,解决kmalloc无法分配大空间的问题,介绍了devicetree中reserved-memory的配置,并提供了使用ioremap验证预留内存的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Linux 中如果需要申请大的连续的空间,可能无法分配到,故采用预留内存的方式。

  • 1.kmalloc 不能分配那么大。
  • 2.alloc_pages MAX_ORDER 为 11,也就是最大分配 2 的 11 次方的页。

reserverd memory 在最开始时候分配好,这块内存不会再分配给kernel用。主要更改 devicetree。

memory {
    device_type = "memory";
    reg = <0x0 0x40000000>; //512m DDR
};
reserved-memory {
    #address-cells = <1>;
    #size-cells = <1>;
    ranges;
    test_reserved: test@1c000000 {
        compatible = "test,test-memory";
        reg = <0x1c000000 0x4000000>; //起始内存,内存大小
        no-map; //禁止操作系统做逻辑地址映射,开始我没加这句话,ioremap出错了。
    };
};


验证代码:

p_malloc = (char *)ioremap(0x1c000000,0x4000000); //做映射
char *p_tmp = p_malloc;
if(p_malloc == NULL) {
    printk("virtual add is error \n");
}else {
    for(i = 0; i < 1024; i++) {
        *p_tmp++ = i;
    }
    p_tmp = p_malloc;
    for(i = 0; i < 1024; i++) {
        printk("%x \n",*p_tmp++);
    }
}

 

————————————————
版权声明:本文为CSDN博主「dachunfree」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/dachunfree/article/details/82987217

<think>好的,我现在需要帮用户理解保留内存(reserved memory)在操作系统或编程中的概念和配置。首先,我得回忆一下相关的知识,确保自己理解正确。保留内存可能涉及操作系统层面的内存管理,比如虚拟内存机制,以及编程中的内存分配策略。 首先,保留内存通常指的是进程预留的地址空间,但尚未分配物理内存或存储空间。例如,在操作系统中,当程序申请内存时,系统可能会先保留一段虚拟地址空间,等到实际需要使用时再提交物理内存。这有助于高效管理内存资源,避免过早占用物理内存。参考中的虚拟内存部分提到,进程的驻留集(resident set)是实际在内存中的部分,而其他部分可能被换出。这说明保留内存可能属于不在驻留集中的部分,但被预先保留的地址空间[^1]。 接着,编程中的保留内存可能涉及特定的函数或机制。例如,在Windows API中,使用VirtualAlloc时,可以指定MEM_RESERVE来保留地址空间而不分配物理内存。保留后,再通过MEM_COMMIT提交物理内存。这种方法允许程序高效地管理大块内存,减少碎片。而像malloc这样的函数通常直接分配可用的内存,可能内部也涉及类似的机制,但具体实现取决于编译器和运行时环境。 然后,需要考虑用户可能的实际应用场景。比如,大型数据处理或游戏开发中,预先保留大块内存可以避免频繁申请释放带来的开销。此外,不同操作系统和编程语言的实现可能有差异,比如Linux的mmap系统调用也可以用来保留内存区域,但具体参数和使用方式可能与Windows不同。 用户可能还想知道如何配置保留内存,以及相关的注意事项。例如,过度保留可能导致地址空间碎片,或者保留的内存何时转换为实际可用的内存。此外,保留内存的安全性、性能影响以及错误处理也是需要考虑的方面。例如,在保留内存后,如果没有正确提交就访问,会导致访问违规的错误,如段错误。 还需要区分保留内存与其他相关概念,比如虚拟内存、物理内存、堆内存等。保留内存属于虚拟地址空间的一部分,而物理内存是实际存储数据的地方。堆内存则是动态分配的内存区域,可能涉及保留和提交的步骤,但具体细节由内存管理器处理。 最后,生成相关问题时要覆盖概念、配置方法、与提交内存的区别、应用场景、注意事项以及跨平台差异。确保问题能够引导用户深入理解保留内存的不同方面,并帮助他们解决实际开发中的问题。</think>### 保留内存(Reserved Memory)详解 #### 1. **基本概念** - **保留内存**指在虚拟地址空间中预留的一段连续区域,但尚未分配对应的物理内存或存储介质(如磁盘交换空间)。这种机制允许程序预先声明内存需求,延迟物理资源的实际分配,直到需要使用时再提交(commit)。例如,Windows API中的`VirtualAlloc`可通过`MEM_RESERVE`参数实现这一操作[^2]。 - **与物理内存的关系**:保留内存仅占用进程的虚拟地址空间,不影响物理内存使用量。物理内存的分配发生在后续的“提交”阶段。 #### 2. **操作系统中的配置** - **Windows系统**: ```c // 保留1MB的地址空间 LPVOID reservedMem = VirtualAlloc(NULL, 1024*1024, MEM_RESERVE, PAGE_READWRITE); // 后续提交部分内存(如4KB) VirtualAlloc(reservedMem, 4096, MEM_COMMIT, PAGE_READWRITE); ``` 保留后需显式调用`MEM_COMMIT`才能使用内存,否则访问会触发访问违规(Access Violation)。 - **Linux系统**: 使用`mmap`的`MAP_NORESERVE`标志可模拟类似行为,但具体行为与系统配置相关: ```c void* addr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0); ``` #### 3. **编程中的应用场景** - **动态内存池**:预先保留大块地址空间,按需分批提交,减少内存碎片(如游戏引擎管理纹理资源)。 - **稀疏数据结构**:为可能增长的大型结构(如哈希表)保留扩展空间,避免重新分配。 - **防止地址空间碎片**:长期运行的进程通过保留内存保护关键区域的地址连续性。 #### 4. **与提交内存的区别** | 特性 | 保留内存(Reserved) | 提交内存(Committed) | |--------------------|---------------------------|------------------------------| | 物理内存占用 | 无 | 立即分配 | | 地址空间占用 | 是 | 是 | | 访问安全性 | 触发异常 | 可正常读写 | | 典型API | `MEM_RESERVE`, `mmap` | `MEM_COMMIT`, `mprotect` | #### 5. **注意事项** - **过度保留的风险**:可能导致虚拟地址空间耗尽(32位进程通常有2-4GB上限)。 - **平台差异性**:Windows的保留粒度通常为64KB,Linux依赖页面大小(通常4KB)。 - **调试工具**:使用`VMMap`(Windows)或`pmap`(Linux)可查看进程的保留内存分布。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值