当前位置:

首页 > 如何查看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!
本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
内存
相关文章 更多
英伟达推出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财年推向市场。

AE基础教程:如何创建合成并制作关键帧动画
AE基础教程:如何创建合成并制作关键帧动画

本文指导After Effects新手完成从打开软件到制作简单动画的完整流程。内容涵盖新建合成、导入素材、添加关键帧及预览验证,适用于AE基础学习。读者可依据步骤快速完成首个可播放的动效项目。

电影剪辑实战:镜头组织、节奏控制与声音衔接技巧
电影剪辑实战:镜头组织、节奏控制与声音衔接技巧

本文详解电影剪辑核心流程,从素材整理、镜头空间组织到叙事节奏压缩,再到J-cut/L-cut声音衔接技巧。通过粗剪保逻辑、精剪压停顿、反应镜头缓冲及电平统一检查,帮助创作者打造空间清晰、情绪连贯且听感自然的成片。

转场剪辑实战指南:硬切、遮挡与运镜的精准选择与操作技巧
转场剪辑实战指南:硬切、遮挡与运镜的精准选择与操作技巧

本文详解硬切、遮挡转场和运镜转场的适用场景与操作逻辑。通过对比三种转场的核心区别,提供基于素材条件和叙事目的的判断标准,帮助剪辑师避免滥用特效,掌握自然衔接画面的实战技巧。

GitLab新手创建项目并推送第一次提交的操作指南
GitLab新手创建项目并推送第一次提交的操作指南

本文指导GitLab新手完成创建项目并推送第一次提交的最小闭环。涵盖远程项目创建、本地仓库初始化、添加远程地址及执行git push。重点说明HTTPS与SSH认证差异、分支名(master/main)核对及提交验证标准,确保远程仓库真正建立。

抖音拍摄剪辑教程:从竖屏运镜到卡点成片
抖音拍摄剪辑教程:从竖屏运镜到卡点成片

本教程针对抖音竖屏视频制作,涵盖拍摄前构思、稳定运镜、粗剪筛选、音乐卡点及导出检查全流程。重点在于拍摄时预留字幕空间、利用动作节点辅助剪辑,以及通过鼓点对齐画面。适用于新手快速完成第一条完整成片,强调素材质量与节奏自然,避免过度特效与版权风险。

饭圈舞台照修图:降噪、调色与人物突出技巧
饭圈舞台照修图:降噪、调色与人物突出技巧

针对饭圈舞台照光线乱、噪点多、背景抢眼的痛点,本文提供“保脸、控光、突出主体”的修图方案。核心步骤包括:利用Lightroom降噪面板处理高ISO颗粒,控制曝光避免高光死白或脸部死黑;通过压低背景色彩、提升人物亮度与对比度来修正舞台灯光导致的肤色偏差;最后通过裁剪去除杂乱元素,确保人物主体清晰且肤色自然。

Photoshop安装失败或启动异常:系统要求、安装流程与故障排查指南
Photoshop安装失败或启动异常:系统要求、安装流程与故障排查指南

本文提供Photoshop完整安装指南,涵盖Windows/macOS系统要求、Creative Cloud客户端部署及常见启动故障排查。通过安装前磁盘与账号检查、安装中网络监控、安装后功能测试三步法,解决安装中断、登录失败及启动卡顿问题,确保软件稳定可用。

创维电视通过U盘安装第三方软件完整教程:权限设置与故障排查
创维电视通过U盘安装第三方软件完整教程:权限设置与故障排查

本文提供创维电视通过U盘安装第三方APK的完整操作指南。核心步骤包括:准备格式化的U盘与正规APK文件,在酷开系统“应用管理”中找到安装入口,临时开启“允许安装未知来源应用”权限,以及安装后的功能测试与权限关闭。适用于解决电视无法识别U盘、提示解析失败或权限受限等问题,确保安装安全且不影响系统稳定。

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

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

Windows
Windows

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

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。