如何将文件映射到内存?

Posted richardo-m-q

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将文件映射到内存?相关的知识,希望对你有一定的参考价值。

需求:
1、在访问某些二进制文件时,希望能把文件映射到内存中去,可以实现随机访问.(framebuffer设备文件)
2、某些嵌入式设备,寄存器被编址到内存地址空间,我们可以映射/dev/mem某范围,去访问这些寄存器。
3、如果多个进程映射同一个文件,还能实现进程通信的目的

思路:
使用标准库中的mmap模块中的mmap()函数,它需要一个打开的文件描述符作为参数

测试:
1、创建一个大小为1M的二进制文件:
dd if=/dev/zero of=demo.bin bs=1024 count=1024

2、以十六进制的形式查看这个文件
od -x demo.bin
技术图片

3、对这个文件进行映射

import mmap

# mmap.mmap()方法:不同的系统下该方法略有不同
# mmap(fileno, length[, tagname[, access[, offset]]]),fileno为文件描述符,length为映射区域的长度,0代表整个文件。
# 得到文件描述符
f = open(‘demo.bin‘,‘r+b‘)
fileno = f.fileno()  # 返回文件描述符:13

# 将文件映射至内存中
m = mmap.mmap(f.fileno(),0,access=mmap.ACCESS_WRITE)  # access为访问权限,这里指定为write

# 查看m的类型
print(type(m))  # mmap.mmap

# 对内存映射的对象进行相关
print(m[0]) # 0
print(m[10:20])) # 进行切片,返回:b‘x00x00x00x00x00x00x00x00x00x00‘
m[0] = 88  # 查看文件的内容发现已被修改 
m[4:8] = # m[4:8] = b‘xff‘*4  # 对切片进行修改,注意长度要对齐

# 对内存映射中的页进行相关操作
m = mmap.mmap(f.fileno(),mmap.PAGESIZE*8,access=mmap.ACCESS_WRITE,offset=mmap.PAGESIZE*4) # 映射8个页,跳过4个页,从四个页后直接进行操作
m[:0x1000] = b‘xaa‘* 0x1000

修改后文件的内容:
技术图片










以上是关于如何将文件映射到内存?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 vector<Chunk*> 读/写为内存映射文件?

内存映射文件到 WPF 网格

如何确保内存映射文件保持内存页面可访问?

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

如何在处理 HTTP 请求之前将 csv 文件同步加载到内存中

是否可以将套接字映射到虚拟内存?