美文网首页编程语言爱好者程序员
如何将文件映射到内存

如何将文件映射到内存

作者: SmallRookie | 来源:发表于2017-08-20 02:50 被阅读77次
实际案例
  1. 在访问某些二进制文件时,希望能把文件映射到内存中,可以实现随机访问(如 framebuffer设备文件);
  2. 某些嵌入式设备,寄存器被编址到内存地址空间,我们可以映射/dev/mem某范围,去访问这些寄存器;
  3. 如果多个进程映射同一个文件,还能实现进程通信的目的。

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

注:本案例在Linux系统下实验。

在shell下,我们通过dd命令创建了一个数据全为0且大小为1M的二进制文件,通过od -x命令以十六进制的方式查看该文件。

rookie@rookie ~/Desktop $ dd if=/dev/zero of=demo.bin bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.007549 s, 139 MB/s

rookie@rookie ~/Desktop $ od -x demo.bin 
0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
4000000

我们在shell中键入如下命令将二进制文件映射到内存:

>>> f = open('demo.bin', 'r+b')
>>> import mmap
>>> m = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE)
>>> type(m)
<type 'mmap.mmap'>
>>> m[0]
'\x00'
>>> m[10:20]
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> m[0] = '\x88'

rookie@rookie ~/Desktop $ od -x demo.bin 
0000000 0088 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
*
4000000

上述命令中,我们使用Python内置的open()函数来得到文件描述符,并使用f.fileno()来获取文件描述符。除此之外,我们也可使用os模块下的open()函数来得到文件描述符。mmap()函数的第二个参数0表示将整个文件映射到内存,第三个参数mmap.ACCESS_WRITE表示获取写权限。

通过调用mmap()函数,我们可以得到mmap的对象m。我们可以利用这个对象m进行类似列表一样的操作。

注:在mmap()函数中还有一个offset参数,其表示指定映射文件的某个区域,但其必须是内存页大小的整数倍。

>>> m = mmap.mmap(f.fileno(), mmap.PAGESIZE*8, access=mmap.ACCESS_WRITE, offset=mmap.PAGESIZE*4)
>>> m[:0x1000] = '\xaa' * 0x1000

rookie@rookie ~/Desktop $ od -x demo.bin 
0000000 0088 0000 0000 0000 0000 0000 0000 0000
0000020 0000 0000 0000 0000 0000 0000 0000 0000
*
0040000 aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
*
0050000 0000 0000 0000 0000 0000 0000 0000 0000
*
4000000

通过上述操作,我们在内存中修改数据的同时也将文件的数据给修改了。因此,我们达到了将文件映射到内存的目的。

注:本部分内容本人也是有点囫囵吞枣,希望路过的大佬能够指点迷津,谢谢!

相关文章

  • python高级编程技巧(8)

    一. 如何将文件映射到内存? 实际案例: 在访问某些二进制文件时。希望能把文件映射到内存中,可以实现随机访问。(f...

  • 如何将文件映射到内存

    实际案例 在访问某些二进制文件时,希望能把文件映射到内存中,可以实现随机访问(如 framebuffer设备文件)...

  • 25用户态内存映射

    mmap 将虚拟地址空间映射到物理内存 匿名映射,即虚拟内存和物理内存直接映射文件映射,将文件映射到虚拟内存ima...

  • 5-4 如何将文件映射到内存

    实际案例: 在访问某些二进制文件时,希望能把文件映射到内存中,可以实现随机访问.(framebuffer设备文件)...

  • java nio学习笔记(2)之内存映射文件

    概念 内存映射文件是将文件(部分)内容映射到内存中,读写操作都在内存中完成,最后再写回文件 示例 该程序是将文件整...

  • mmap 一定比普通读写快吗?

    原理 : 文件磁盘地址映射到内存中 ,是文件地址映射。不是文件内容映射。通过缺页中断将文件内容加载到内存中。缺页中...

  • mmap原理

    即memory map(内存映射)。内存映射减少了文件从内核空间copy到用户空间,但是增加了文件映射到用户空间的...

  • APP优化 —— MMAP内存映射

    mmap 一种内存映射文件的方法 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不...

  • 获取数据减少内存占用

    NSDataReadingMappedIfSafe 提示显示文件应该映射到虚拟内存,如果可能和安全 NSDataR...

  • 通过webstorm创建的React项目渲染页面

    在上一节讲了如何将React项目映射到index.html文件上 今天给大家分享下如何通过index.js文件渲染...

网友评论

    本文标题:如何将文件映射到内存

    本文链接:https://www.haomeiwen.com/subject/mmdxrxtx.html