跳至內容

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

更新時間
快连VPN:速度和安全性最佳的VPN服务
快连VPN:速度和安全性最佳的VPN服务

一.文件映射的定義

文件映射是一種將磁盤上的文件映射到進程的虛擬內存空間的機制。

通過這種方式,進程可以直接通過內存地址來讀寫文件,而不必通過常規的 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下使用文件映射

現在我們通過一個例子演示瞭如何使用文件映射將文件映射到內存中,然後通過修改內存中的內容,最後通過解除內存映射來進行演示。

example.c文件

#include <stdio.h>#include <stdlib.h>#include <sys>#include <sys>#include <sys>#include <fcntl.h>#include <unistd.h>#include <string.h>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;}</string.h></unistd.h></fcntl.h></sys></sys></sys></stdlib.h></stdio.h>
登錄後複製

編譯執行:

$ 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文件映射的查看方法有哪些的詳細內容,更多請關注本站其它相關文章!

更新時間

發表留言

請注意,留言須先通過審核才能發佈。