mmap与指令/数据缓存一致性:为何可复制并运行共享库?
ARM架构中代码写入后执行的缓存同步机制
在ARM架构中,向内存写入指令后,执行前需完成缓存同步操作:清理数据缓存、失效指令缓存,然后在要执行代码的CPU上执行指令同步屏障(ISB)。
无需显式缓存同步的执行流程
流程一:通过write写入文件后映射执行
- 打开文件
- 调用
write写入指令内容 - 关闭文件
- 重新打开该文件
- 通过
mmap以PROT_READ | PROT_EXEC权限映射文件 - 执行映射后的代码
流程二:通过mmap写入文件后重新映射执行
- 打开文件
- 通过
mmap以PROT_READ | PROT_WRITE和MAP_SHARED属性映射文件 - 通过常规内存写入操作写入指令内容
- 调用
munmap解除映射 - 关闭文件
- 重新打开文件
- 通过
mmap以PROT_READ | PROT_EXEC权限映射文件 - 执行代码
疑问点
- 在上述两个流程中,必要的缓存同步操作隐藏在哪个步骤里?是
munmap还是mmap?(假设无磁盘访问) - 若写入与执行之间未调用
munmap或mmap,需显式调用__clear_cache完成缓存同步,那能否通过上述两种映射方式实现同等的缓存同步效果?
内容的提问来源于stack exchange,提问作者Timothy Baldwin
相关产品推荐
相关产品推荐

