linux - 文件如何映射到进程地址空间?

标签 linux fwrite mmap

如何将内存映射文件映射到进程地址空间?通常文件存储在辅助存储设备中,如 NAND、SD 卡等(嵌入式环境),不提供逐字节访问?当我们更新映射到文件的内存时,我需要管道如何在辅助存储中更新文件?还有为什么与 write() 系统调用或 fwrite() 库调用相比 mmap 更快?

最佳答案

您映射的所有内容都可能被复制到内部内存中。因此,如果您从 SD 卡或其他任何东西访问您的 prog 文件的某个地址,数据的副本将加载到内部 ram 中。范围究竟有多大,只有操作系统知道。即使您为整个文件保留位置,如果需要也只会读取一小部分。如果 cpu 有一个 mmu,它可以简单地通过导致重新加载的页面错误来实现。

如果您不直接存储到底层物理设备,访问只会更快。所以更改只会在 ram 中完成,它很快,稍后会立即写入较慢的设备,如串行闪存或其他设备。

可以通过 msync http://man7.org/linux/man-pages/man2/msync.2.html 完成从已更改的映射虚拟内存到底层文件的同步。

如果您需要一些基本信息(虚拟)ram 是如何寻址的以及 mmap 如何映射到虚拟 ram,您可以阅读:https://www.xml.com/ldd/chapter/book/ch13.html

关于linux - 文件如何映射到进程地址空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51102399/

相关文章:

c - 再次使用 mmap() ,重新使用以前的 mmap() 结果失败 - 使原始 ptr 无效?

c++ - 为什么在代码流中没有 delete 或 free 时在 stdc++ 库中调用 delete?

linux - 在Linux上开发需要学习哪些工具

reactjs - 如何使用 yarn 而不是 npm 创建 react 应用程序?

c - 在 C 代码中将管道写入电子邮件

linux - 用户进程的有效地址空间是什么? (OS X 和 Linux)

c++ - 我正在尝试重新学习 GCC C 或 C++ 编译,请帮忙

c - 将链表写入二进制文件(C)

c - 使用 fread() 从二进制文件读取显示附加字符

java - 随机访问中的 FileChannel 与 MappedByteBuffer?