mmap映射writecombine区域到用户空间的RAM区域特殊处理问题
针对RAM区域导出用户空间需额外调整内存属性的原因
这个问题本质和x86架构的内存属性一致性规则、内核地址空间的默认映射特性有关:
- 首先,系统RAM默认在内核地址空间有全局的线性映射,默认缓存属性为写回(WB),这是兼顾性能和数据一致性的默认配置。如果直接用
io_remap_pfn_range()/remap_pfn_range()等API,给用户空间映射为非缓存(UC)、写合并(WC)属性,会导致同一块物理内存同时存在两个不同缓存属性的地址别名,这种情况在x86架构下属于未定义行为,会触发缓存一致性错误,轻则出现读写数据不一致,重则导致系统宕机。 set_memory_uc()、set_memory_wc()的作用是先修改内核线性映射中对应RAM页的页表缓存属性,保证全系统范围内所有对这块物理内存的映射缓存属性统一,从根源上避免属性冲突的别名问题。- 而IO(非RAM)区域不存在内核默认的WB属性映射,因此直接用
pgprot_noncached()配合映射API即可,不会出现属性冲突。 - 页面释放回内存池前必须调用
set_memory_wb(),是因为系统内存池的RAM默认要求是WB属性,若不恢复就归还,后续其他内核模块或进程拿到这页内存时,会因为缓存属性不符合预期出现性能异常、数据错误等问题。
内容的提问来源于stack exchange,提问作者Very Confused
相关产品推荐
相关产品推荐

