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

一.文件映射的定义

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

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

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

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

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

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

方法一:使用pmap工具

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

$ pmap -X 12345#查看指定PID的文件映射信息12345: ./example0000555555554000100K r-x-- example00005555556730004K r---- example00005555556740004K rw--- example00007ffff7de0000 1360K r-x-- libc-2.31.so...mapped: 1448Kwriteable/private: 8Kshared: 0K

登录后复制每行代表一个内存映射区域。地址范围、权限、映射类型、文件路径等信息。“mapped” 表示映射的总大小,”writeable/private” 表示可写和私有的大小,”shared” 表示共享的大小。

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

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

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

address perms offsetdev inodepathname00400000-0040b000 r-xp 00000000 08:01 1167685/usr/bin/cat0060a000-0060b000 r--p 0000a000 08:01 1167685/usr/bin/cat0060b000-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 regionvoid *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 descriptorclose(fd);return 0;}

登录后复制

编译执行:

$ lsexample.c$ gcc example.c -o example$ ./examplePress Enter to exit...

登录后复制

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

$ ps aux|grep examplecodersong 15245420.00.0 27761152 pts/0S+ 19:23 0:00 ./examplecodersong 15245470.00.0121882432 pts/2S+ 19:23 0:00 grep --color=auto example$ pmap -X 15245421524542: ./example地址 Perm 偏移量 设备 Inode SizeRss Pss Pss_Dirty Referenced Anonymous LazyFree ShmemPmdMapped FilePmdMapped Shared_Hugetlb Private_Hugetlb Swap SwapPss Locked THPeligible Mapping557b482c3000 r--p0000000008:03 712405144 4 04 000 00 00 00 0 example557b482c4000 r-xp0000100008:03 712405144 4 04 000 00 00 00 0 example557b482c5000 r--p0000200008:03 712405144 4 04 000 00 00 00 0 example557b482c6000 r--p0000200008:03 712405144 4 44 400 00 00 00 0 example557b482c7000 rw-p0000300008:03 712405144 4 44 400 00 00 00 0 example557b48e9e000 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.67f8fe5628000 r-xp0002800008:03264612 162078824 0788 000 00 00 00 0 libc.so.67f8fe57bd000 r--p001bd00008:03264612352 64 1 0 64 000 00 00 00 0 libc.so.67f8fe5815000 r--p0021400008:03264612 16 161616 161600 00 00 00 0 libc.so.67f8fe5819000 rw-p0021800008:0326461288 8 88 800 00 00 00 0 libc.so.67f8fe581b000 rw-p0000000000:00 0 52 202020 202000 00 00 00 07f8fe58f6000 rw-p0000000000:00 0 128 8 88 800 00 00 00 07f8fe5908000 rw-p0000000000:00 084 4 44 400 00 00 00 07f8fe590a000 r--p0000000008:0326460088 0 08 000 00 00 00 0 ld-linux-x86-64.so.27f8fe590c000 r-xp0000200008:03264600168168 7 0168 000 00 00 00 0 ld-linux-x86-64.so.27f8fe5936000 r--p0002c00008:03264600 44 40 1 0 40 000 00 00 00 0 ld-linux-x86-64.so.27f8fe5941000 rw-s0000000008:03 712405244 4 04 000 00 00 00 0 example.txt7f8fe5942000 r--p0003700008:0326460088 8 88 800 00 00 00 0 ld-linux-x86-64.so.27f8fe5944000 rw-p0003900008:0326460088 8 88 800 00 00 00 0 ld-linux-x86-64.so.27ffef93f2000 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/maps557b482c3000-557b482c4000 r--p 00000000 08:03 7124051/home/codersong/zhengshihong/example557b482c4000-557b482c5000 r-xp 00001000 08:03 7124051/home/codersong/zhengshihong/example557b482c5000-557b482c6000 r--p 00002000 08:03 7124051/home/codersong/zhengshihong/example557b482c6000-557b482c7000 r--p 00002000 08:03 7124051/home/codersong/zhengshihong/example557b482c7000-557b482c8000 rw-p 00003000 08:03 7124051/home/codersong/zhengshihong/example557b48e9e000-557b48ebf000 rw-p 00000000 00:00 0[heap]7f8fe5600000-7f8fe5628000 r--p 00000000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.67f8fe5628000-7f8fe57bd000 r-xp 00028000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.67f8fe57bd000-7f8fe5815000 r--p 001bd000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.67f8fe5815000-7f8fe5819000 r--p 00214000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.67f8fe5819000-7f8fe581b000 rw-p 00218000 08:03 264612 /usr/lib/x86_64-linux-gnu/libc.so.67f8fe581b000-7f8fe5828000 rw-p 00000000 00:00 07f8fe58f6000-7f8fe58f9000 rw-p 00000000 00:00 07f8fe5908000-7f8fe590a000 rw-p 00000000 00:00 07f8fe590a000-7f8fe590c000 r--p 00000000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.27f8fe590c000-7f8fe5936000 r-xp 00002000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.27f8fe5936000-7f8fe5941000 r--p 0002c000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.27f8fe5941000-7f8fe5942000 rw-s 00000000 08:03 7124052/home/byzoro/zhengshihong/example.txt7f8fe5942000-7f8fe5944000 r--p 00037000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.27f8fe5944000-7f8fe5946000 rw-p 00039000 08:03 264600 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.27ffef93f2000-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.txtHello, Memory Mapping!

登录后复制

以上就是Linux文件映射的查看方法有哪些的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2291261.html

(0)
上一篇 2025年2月28日 00:53:36
下一篇 2025年2月22日 03:49:44

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python实现批量获取指定文件夹下的所有文件的厂商信息

    本文实例讲述了python实现批量获取指定文件夹下的所有文件的厂商信息的方法。分享给大家供大家参考。具体如下: 功能代码如下: import os, string, shutil,re import pefile import codecs…

    编程技术 2025年2月28日
    200
  • 打印机内存不足,无法打印页面Excel或PowerPoint错误

    如果在打印excel工作表或powerpoint演示文稿时遇到打印机内存不足的问题,这篇文章可能对您有所帮助。您可能收到类似的错误消息,指出打印机内存不足,无法打印页面。不过,您可以遵循一些建议来解决这个问题。 为什么打印时打印机内存不可用…

    2025年2月28日
    200
  • 如何一次将所有OneDrive文件下载到PC

    本文将教您如何一次性将所有onedrive文件下载到您的pc。onedrive是一个强大的云存储平台,方便用户随时随地访问其文件。有时,用户可能需要在本地备份文件或离线访问。继续阅读以了解如何轻松完成这一操作。 如何一次将所有OneDriv…

    2025年2月28日
    200
  • 在Windows 11/10中,准备删除要花费很长时间

    在本文中,我们将介绍如何解决在windows系统中删除文件或文件夹时出现“准备删除”提示的问题。这个提示意味着系统正在进行一些后台操作,如检查文件权限、验证文件是否被其他程序占用、计算要删除项目的大小等。我们将为您提供一些解决方法,以确保您…

    2025年2月28日 互联网
    200
  • Linux常用命令

    命令1:pwd pwd显示当前的工作路径,查看位置所在。 [root@bunian ~]# pwd/root 登录后复制 命令2:ls ls命令十分常用,ls指的是list,查看文件或者目录的命令。添加参数后常用为: ls :查看目录中全部…

    2025年2月28日
    100
  • Linux中的文件权限:你是否掌握了读、写和执行三种类型?

    在Linux系统中,文件权限扮演着关键角色,决定了用户对文件的访问权限和可执行操作。本文将深入探讨Linux文件权限的概念、不同类型的权限、如何修改权限以及常见问题。适合有一定Linux基础的读者阅读。 文件权限的概念 在Linux系统中,…

    2025年2月28日
    200
  • 如何在Windows PC上打开RBF文件?

    您是否收到rbf文件,但无法打开它?如果您以前没有使用过这样的文件扩展名,那么这是一个常见的问题。rbf格式代表回滚文件,主要由windows installer使用。这些文件是windows installer在安装失败时创建的备份文件,…

    2025年2月28日
    200
  • Linux中创建文件常用的八种方法

    在Linux系统中,一切皆文件。相比Windows的右键新建,Linux需要通过命令来创建文件。高效创建文件对节省工作时间至关重要。熟练掌握Linux系统下创建文件的8种常用方法,对提高工作效率至关重要。 第一种:重定向符号> 重定向…

    2025年2月28日
    200
  • Windows输入遇到挂起或内存使用率高的问题[修复]

    windows的输入体验是一个关键的系统服务,负责处理来自各种人机接口设备的用户输入。它在系统启动时自动启动,在后台运行。然而,有时候这个服务可能会出现自动挂起或占用过多内存的情况,导致系统性能下降。因此,及时监控和管理这个进程是至关重要的…

    2025年2月28日
    200
  • Linux系统命令大全。

    以下是常见的Linux系统命令大全(按字母顺序排列): alias:设置命令别名awk:文本处理工具,用于提取和操作文本数据cat:连接文件并打印到标准输出cd:改变当前工作目录chmod:修改文件或目录的权限chown:修改文件或目录的所…

    2025年2月28日
    200

发表回复

登录后才能评论