当前位置:

首页 > 软件教程 > 如何查看Linux文件映射

如何查看Linux文件映射

一.文件映射的定义文件映射是一种将磁盘上的文件映射到进程的虚拟内存空间的机制。通过这种方式,进程可以直接通过内存地址来读写文件,而不必通过常规的read和write等系统调用。在文件映射中,我们通过Linux的机制将文件和进程的虚拟内存联系起来,使得进程可以直接在内存中读写文件数据,而无需直接访问磁盘。这种机制提供了更高效的文件访问方式,同时也简化了文件操作的流程。文件映射通常被称为内存映射,这两者通常是一样的,内存映射涵盖了将文件映射到内存和将匿名内存映射到进程地址空间的操作。文件映射是内存映射的一种特

本文目录

    一.文件映射的定义

    文件映射是一种将磁盘上的文件映射到进程的虚拟内存空间的机制。

    通过这种方式,进程可以直接通过内存地址来读写文件,而不必通过常规的 read 和 write 等系统调用。

    在文件映射中,我们通过Linux的机制将文件和进程的虚拟内存联系起来,使得进程可以直接在内存中读写文件数据,而无需直接访问磁盘。这种机制提供了更高效的文件访问方式,同时也简化了文件操作的流程。

    文件映射通常被称为内存映射,这两者通常是一样的,内存映射涵盖了将文件映射到内存和将匿名内存映射到进程地址空间的操作。

    文件映射是内存映射的一种特例。

    二.文件映射的查看方法【两种方法】

    方法一:使用pmap工具

    查看对应进程的文件映射信息

    $ pmap -X 12345#查看指定PID的文件映射信息
    12345: ./example
    0000555555554000100K r-x-- example
    00005555556730004K r---- example
    00005555556740004K rw--- example
    00007ffff7de0000 1360K r-x-- libc-2.31.so
    ...
    mapped: 1448Kwriteable/private: 8Kshared: 0K
    • 每行代表一个内存映射区域。
    • 地址范围、权限、映射类型、文件路径等信息。
    • “mapped” 表示映射的总大小,”writeable/private” 表示可写和私有的大小,”shared” 表示共享的大小。

    方法二:cat查看文件映射文件

    使用 cat /proc/PID/maps 命令可以查看进程的内存映射情况。

    每一行都表示一个内存映射区域,格式如下:

    address perms offsetdev inodepathname
    00400000-0040b000 r-xp 00000000 08:01 1167685/usr/bin/cat
    0060a000-0060b000 r--p 0000a000 08:01 1167685/usr/bin/cat
    0060b000-0060c000 rw-p 0000b000 08:01 1167685/usr/bin/cat
    • address: 映射的虚拟内存地址范围。
    • perms: 权限,包括读(r)、写(w)、执行(x)等。
    • offset: 文件中映射区域的偏移量。
    • dev: 设备号。
    • inode: 文件在文件系统中的节点号。
    • pathname: 映射的文件路径或匿名映射。

    三. 如何在Linux下使用文件映射

    现在我们通过一个例子演示了如何使用文件映射将文件映射到内存中,然后通过修改内存中的内容,最后通过解除内存映射来进行演示。

    Linux文件映射的查看方法有哪些

    example.c文件

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main() {
    const char *file_path = "example.txt";
    const size_t file_size = 4096;
    
    int fd = open(file_path, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
    if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
    }
    
    if (ftruncate(fd, file_size) == -1) {
    perror("ftruncate");
    close(fd);
    exit(EXIT_FAILURE);
    }
    
    // Create a memory-mapped region
    void *addr = mmap(NULL, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    if (addr == MAP_FAILED) {
    perror("mmap");
    close(fd);
    exit(EXIT_FAILURE);
    }
    
    // Now 'addr' points to the beginning of the file in memory
    // 现在addr表示文件在进程的内存空间代表区域的起始位置
    // Write a message to the memory-mapped file
    // 向映射文件写入一句消息。
    const char *message = "Hello, Memory Mapping!n";
    strncpy(addr, message, strlen(message));
    
    printf("Press Enter to exit...n");
    getchar();// Wait for user to press Enter
    
    // Unmap the memory region解除文件和内存区域的映射关系
    if (munmap(addr, file_size) == -1) {
    perror("munmap");
    close(fd);
    exit(EXIT_FAILURE);
    }
    
    // Close the file descriptor
    close(fd);
    
    return 0;
    }

    编译执行:

    $ ls
    example.c
    $ gcc example.c -o example
    $ ./example
    Press Enter to exit...

    查看进程的文件映射信息:

    $ ps aux|grep example
    codersong 15245420.00.0 27761152 pts/0S+ 19:23 0:00 ./example
    codersong 15245470.00.0121882432 pts/2S+ 19:23 0:00 grep --color=auto example
    $ pmap -X 1524542
    1524542: ./example
    地址 Perm 偏移量 设备 Inode SizeRss Pss Pss_Dirty Referenced Anonymous LazyFree ShmemPmdMapped FilePmdMapped Shared_Hugetlb Private_Hugetlb Swap SwapPss Locked THPeligible Mapping
    557b482c3000 r--p0000000008:03 712405144 4 04 000 00 00 00 0 example
    557b482c4000 r-xp0000100008:03 712405144 4 04 000 00 00 00 0 example
    557b482c5000 r--p0000200008:03 712405144 4 04 000 00 00 00 0 example
    557b482c6000 r--p0000200008:03 712405144 4 44 400 00 00 00 0 example
    557b482c7000 rw-p0000300008:03 712405144 4 44 400 00 00 00 0 example
    557b48e9e000 rw-p0000000000:00 01324 4 44 400 00 00 00 0 [heap]
    7f8fe5600000 r--p0000000008:03264612160160 7 0160 000 00 00 00 0 libc.so.6
    7f8fe5628000 r-xp0002800008:03264612 162078824 0788 000 00 00 00 0 libc.so.6
    7f8fe57bd000 r--p001bd00008:03264612352 64 1 0 64 000 00 00 00 0 libc.so.6
    7f8fe5815000 r--p0021400008:03264612 16 161616 161600 00 00 00 0 libc.so.6
    7f8fe5819000 rw-p0021800008:0326461288 8 88 800 00 00 00 0 libc.so.6
    7f8fe581b000 rw-p0000000000:00 0 52 202020 202000 00 00 00 0
    7f8fe58f6000 rw-p0000000000:00 0 128 8 88 800 00 00 00 0
    7f8fe5908000 rw-p0000000000:00 084 4 44 400 00 00 00 0
    7f8fe590a000 r--p0000000008:0326460088 0 08 000 00 00 00 0 ld-linux-x86-64.so.2
    7f8fe590c000 r-xp0000200008:03264600168168 7 0168 000 00 00 00 0 ld-linux-x86-64.so.2
    7f8fe5936000 r--p0002c00008:03264600 44 40 1 0 40 000 00 00 00 0 ld-linux-x86-64.so.2
    7f8fe5941000 rw-s0000000008:03 712405244 4 04 000 00 00 00 0 example.txt
    7f8fe5942000 r--p0003700008:0326460088 8 88 800 00 00 00 0 ld-linux-x86-64.so.2
    7f8fe5944000 rw-p0003900008:0326460088 8 88 800 00 00 00 0 ld-linux-x86-64.so.2
    7ffef93f2000 rw-p0000000000:00 0132 121212 121200 00 00 00 0 [stack]
    7ffef9485000 r--p0000000000:00 0 160 0 00 000 00 00 00 0 [vvar]
    7ffef9489000 r-xp0000000000:00 084 0 04 000 00 00 00 0 [vdso]
    ffffffffff600000 --xp0000000000:00 040 0 00 000 00 00 00 0 [vsyscall]
     ==== ==== === ========= ========== ========= ======== ============== ============= ============== =============== ==== ======= ====== ===========
     2780 1344 15296 13449600 00 00 00 0 KB
    $
    $
    $ cat /proc/1524542/maps
    557b482c3000-557b482c4000 r--p 00000000 08:03 7124051/home/codersong/zhengshihong/example
    557b482c4000-557b482c5000 r-xp 00001000 08:03 7124051/home/codersong/zhengshihong/example
    557b482c5000-557b482c6000 r--p 00002000 08:03 7124051/home/codersong/zhengshihong/example
    557b482c6000-557b482c7000 r--p 00002000 08:03 7124051/home/codersong/zhengshihong/example
    557b482c7000-557b482c8000 rw-p 00003000 08:03 7124051/home/codersong/zhengshihong/example
    557b48e9e000-557b48ebf000 rw-p 00000000 00:00 0[heap]
    7f8fe5600000-7f8fe5628000 r--p 00000000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.6
    7f8fe5628000-7f8fe57bd000 r-xp 00028000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.6
    7f8fe57bd000-7f8fe5815000 r--p 001bd000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.6
    7f8fe5815000-7f8fe5819000 r--p 00214000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.6
    7f8fe5819000-7f8fe581b000 rw-p 00218000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.6
    7f8fe581b000-7f8fe5828000 rw-p 00000000 00:00 0
    7f8fe58f6000-7f8fe58f9000 rw-p 00000000 00:00 0
    7f8fe5908000-7f8fe590a000 rw-p 00000000 00:00 0
    7f8fe590a000-7f8fe590c000 r--p 00000000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    7f8fe590c000-7f8fe5936000 r-xp 00002000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    7f8fe5936000-7f8fe5941000 r--p 0002c000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    7f8fe5941000-7f8fe5942000 rw-s 00000000 08:03 7124052/home/byzoro/zhengshihong/example.txt
    7f8fe5942000-7f8fe5944000 r--p 00037000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    7f8fe5944000-7f8fe5946000 rw-p 00039000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
    7ffef93f2000-7ffef9413000 rw-p 00000000 00:00 0[stack]
    7ffef9485000-7ffef9489000 r--p 00000000 00:00 0[vvar]
    7ffef9489000-7ffef948b000 r-xp 00000000 00:00 0[vdso]
    ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0[vsyscall]

    现在按ctrl+C退出example程序,查看example.txt文件的内容:

    $ cat example.txt
    Hello, Memory Mapping!
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    软件教程 内存
    相关文章 更多
    3dmax渲染吃什么配置?主要看CPU 显卡还是内存性能
    3dmax渲染吃什么配置?主要看CPU 显卡还是内存性能

    了解3ds Max渲染过程中CPU、显卡和内存各自承担的角色。针对V-Ray、Corona等主流渲染器,提供清晰的硬件选型逻辑,避免配置浪费或瓶颈。

    3dmax安装需要多大内存?空间与电脑配置要求
    3dmax安装需要多大内存?空间与电脑配置要求

    想知道3ds Max安装需要多大内存和硬盘空间?本文列出官方最低与推荐配置,解析不同工作流下的硬件需求,助你避开性能瓶颈。

    电脑显示内存与实际不符怎么回事原因及解决方法
    电脑显示内存与实际不符怎么回事原因及解决方法

    电脑安装了16GB内存却只显示15.8GB或更少?本文详解硬件保留、核显占用及系统设置导致的内存显示差异,提供从任务管理器到BIOS的完整排查方法。

    英伟达推出NVHBM:定制HBM带宽提升30%并扩展NVLink Fusion生态
    英伟达推出NVHBM:定制HBM带宽提升30%并扩展NVLink Fusion生态

    英伟达发布定制HBM技术NVHBM,通过集成内存控制器至HBM基础裸片,实现带宽较HBM4E提升30%、功耗降低15%,并释放主芯片25%空间。亚马逊Annapurna Labs为首个合作伙伴,该技术旨在通过标准化方案加速定制AI芯片开发,而非取代通用HBM。

    Arm AGI CPU详解:136核Neoverse V3,3nm双芯粒架构与AI数据中心部署
    Arm AGI CPU详解:136核Neoverse V3,3nm双芯粒架构与AI数据中心部署

    Arm在Hot Chips 2026发布首款AI专用数据中心CPU“Arm AGI CPU”,由Meta联合开发。该芯片采用台积电3nm工艺,双芯粒设计,每芯粒70个Neoverse V3核心(屏蔽4个后单芯片136核),TDP 300W,支持DDR5-8800及PCIe 6.0。旨在解决x86在AI算力与能效上的瓶颈,预计2027-2028财年推向市场。

    AMD因用户强烈反弹将为Ryzen处理器恢复TSME内存加密功能
    AMD因用户强烈反弹将为Ryzen处理器恢复TSME内存加密功能

    AMD因用户强烈反弹,将为消费级Ryzen处理器恢复TSME内存加密功能。此前该功能被AGESA微码悄然关闭,仅保留在PRO等高端产品线,而英特尔竞品仍开放类似功能。AMD将通过UEFI固件更新,自2026年7月起由主板厂商发布BIOS恢复该选项。

    TrendForce:消费级内存紧缺态势延伸DDR2产品
    TrendForce:消费级内存紧缺态势延伸DDR2产品

    消费级DRAM供给紧缩,三大原厂优先HBM与服务器内存,DDR4投片缩减。需求转向DDR2/DDR3,DDR2合约价二季度涨55%-60%,三季度再涨35%-40%。品牌厂与ODM厂降级使用,缺货压力向下传导。

    杰富瑞投行研报:2026Q3 全球存储芯片价格预估环比上涨 50% 降价恐要等到 2028 年
    杰富瑞投行研报:2026Q3 全球存储芯片价格预估环比上涨 50% 降价恐要等到 2028 年

    杰富瑞研报预测,2026年Q3全球存储芯片价格环比涨40%-50%,Q4涨30%-40%,2027全年均价同比涨约40%-45%,降价或始于2028年,届时跌幅15%-20%。

    100多元就能买到DDR5 16GB内存 拆开一看惊呆了
    100多元就能买到DDR5 16GB内存 拆开一看惊呆了

    二手交易平台出现大量低价假DDR5内存,号称SK海力士16GB仅售179元。拆解发现颗粒内部为空壳,无硅芯片,仅靠胶水与焊锡伪装。上机无法通过自检,可能损坏其他硬件。提醒存储芯片涨价期间,切勿贪图便宜。

    央视:电脑城内存条2天暴涨300元 装机成本飙升!
    央视:电脑城内存条2天暴涨300元 装机成本飙升!

    央视报道,深圳华强北内存条价格近期暴涨,DDR5单条两天内涨约300元,DDR4涨幅温和。存储成本占整机物料已从15%升至30%以上,高端机型超35%,行业利润逻辑面临调整。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。