码迷,mamicode.com
首页 > 其他好文 > 详细

如何将文件映射到内存?

时间:2020-07-15 01:29:45      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:区域   offset   alt   set   type   进制   地址   buffer   png   

需求:
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‘\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00‘
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

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

如何将文件映射到内存?

标签:区域   offset   alt   set   type   进制   地址   buffer   png   

原文地址:https://www.cnblogs.com/Richardo-M-Q/p/13303038.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!