欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > linux >内容正文

linux

linux mamp 设备内存

发布时间:2025/5/22 linux 67 豆豆
生活随笔 收集整理的这篇文章主要介绍了 linux mamp 设备内存 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘Python工程师标准>>>

mamp把文件内容映射到一段内存上(准确说是虚拟内存空间上), 通过对这段内存的读取和修改, 实现对文件的读取和修改,不需要read和write了。

头文件:

  • <unistd.h>

  • <sys/mman.h>

原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);

返回值: 成功则返回映射区起始地址, 失败则返回MAP_FAILED(-1).

参数:

  • addr: 指定映射的起始地址, 通常设为NULL, 由系统指定

  • length: 将文件的多大长度映射到内存

  • prot: 映射区的保护方式, 可以是:

       PROT_EXEC: 映射区可被执行.

       PROT_READ: 映射区可被读取.

       PROT_WRITE: 映射区可被写入.

       PROT_NONE: 映射区不能存取.

  • flags: 映射区的特性, 可以是:

      MAP_SHARED: 对映射区域的写入数据会复制回文件, 且允许其他映射该文件的进程共享.

      MAP_PRIVATE: 对映射区域的写入操作会产生一个映射的复制(copy-on-write), 对此区域所做的修改不会写回原文件.

  • fd: 由open返回的文件描述符, 代表要映射的文件.

  • offset: 以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射.

int munmap(void *start, size_t lenght)关闭内存映射

start 起始地址上面函数返回的地址 lenght 长度 ;成功返回 0

映射步骤

  • 用open系统调用打开文件, 并返回描述符fd.

  • 用mmap建立内存映射, 并返回映射首地址指针start.

  • 对映射(文件)进行各种操作, 显示(printf), 修改(sprintf).

  • 用munmap(void *start, size_t lenght)关闭内存映射.

  • 用close系统调用关闭文件fd.


  • 注意:memp不能更改文件中字符的长度,当写入数据长度大于原来长度时,只保存原来长度的写入值,如果数据小于原来长度,则只替换写入的数据,原来数据大于写入数据长度的保留不变。

    如源文件值12345 如果写入 abcdefg 则只能写入abcde  如果写入 abc 则值变为 abc45

    想查看的话 地址如何分配指令

    vi /proc/2074/maps  (到/proc目录下 查看模块号 查看2074进程的地址分配情况)


    使用mmap完成页表的建立

    remap_pfn_range 一次建立所有页表

    int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot); 

    • wma:虚拟内存区域指针 系统分配

    • virt_addr:虚拟地址的起始值

    • pfn:要映射的物理地址所在的物理页帧号,可将物理地址>>PAGE_SHIFT得到

    • size:要映射的区域的大小

    • prot:vma保护属性

    例子

    VM_IO将VMA标记为一个内存映射的I/O区域

    VM_RESERVED标记内存区域不能被换出

    转载于:https://my.oschina.net/u/274829/blog/285840

    总结

    以上是生活随笔为你收集整理的linux mamp 设备内存的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。