pmap,linux工具pmap原理?

Linux命令簡明手冊 (wker.com)

pmap

顯示進程的內存映像


語法格式

pmap [-x|-d] [-q] pids
pmap -V

命令簡介

pmap命令主要用於顯示指定進程的內存映像(或稱地址空間)。其中,pids是一個或一組進程的PID。

除了指定進程,如果不加任何選項,pmap命令將會顯示指定進程每個內存映像的起始地址、虛擬內存的大小、進程訪問地址空間的權限,以及內存映射文件等。

命令選項

-x  增加一個標題行,同時顯示每個內存映像實際使用的物理內存大小,以及內容已修改但尚未寫到磁盤的頁面數量等附加進程信息。

-d  增加一個標題行,同時顯示內存映射文件的偏移值,以及存儲設備的主次設備號等附加進程信息。

-q  採用安靜方式,禁止顯示彙總信息行。

-V  顯示命令的版本信息,然後退出。

命令輸出

Address:  內存映像的起始地址。

Kbytes:  內存映像的虛擬內存空間大小(單位爲KB)。

RSS:  內存映像實際駐留物理內存的空間大小(單位爲KB)。

Dirty:  內容已修改但尚未寫到磁盤的頁面空間大小(單位爲KB),包括共享與專用的頁面。

Mode:  訪問內存映像的權限:r(讀)、w(寫)、x(執行)、s(共享)與p(專用)。

Mapping:  內存映射文件、分配的內存(其標誌爲“[ anon ]”)或程序棧(其標誌爲“[ stack ]”)。

Offset:  內存映射文件的偏移值。

Device:  存儲設備的主次設備號。

應用實例

1. 顯示bash的地址空間,查詢每個內存映像的概況。

$ pmap 2775

2. 顯示bash的地址空間,瞭解更多的信息。

linux工具pmap原理?

1. 概述

DMA(Direct Memory Access):直接存儲器訪問;

先看問題的引入:

  • Non-DMA:CPU直接與設備進行數據交互,CPU的負載會隨着數據的讀寫而增加;
  • DMA:CPU不參與數據的直接傳輸,DMA Controller負責Device與Memory之間的數據搬運,並以中斷信號的形式通知CPU;
  • 可以看出,使用DMA的最大優點是可以提高CPU的使用率;

2. address mapping

DMA涉及三種地址空間:

  • CPU虛擬地址:CPU使用的地址空間;
  • CPU物理地址:CPU使用的虛擬地址通過MMU轉換成物理地址;
  • 總線地址:設備使用的地址空間;

CPU與Device看待地址的空間不一樣,看幾個示例:

  1. A:Host bridge負責將Bus address映射到CPU的物理地址空間,可以通過ioremap 來使用,比如PCI/PCIe;
  2. B:設備使用的總線地址,可以通過IOMMU訪問到CPU的物理地址空間,由IOMMU來負責映射;
  3. C:設備使用的總線地址與CPU的物理地址相同,不需要使用IOMMU進行地址轉換;

2.1 cache coherence

DMA的操作,通常與cache相關,先了解一下cache coherence

  • cache coherence設備:設備之間的讀寫不需要關心cache的一致性問題,硬件將確保數據一致,比如連接在ARM CCI端口上的設備就是cache coherence設備;
  • non-coherence設備:需要額外的軟件操作(flush/invalidate)等操作來確保數據一致;

3. DMA mappings

Linux內核中提供了兩種dma mapping的接口:Consistent mapping和Stream mapping。

3.1 Consistent DMA mappings

  • consistent mapping:對應於cache-coherence設備,硬件確保device和CPU都能並行訪問數據,並能看到彼此的更新,而不需要軟件的flush操作;
  • 通常在驅動init時進行map操作,而在deinit時進行unmap操作;

通常在使用consistent dma mapping時,首先需要通過dma_alloc_coherent接口來分配一段區域:

  • dma_alloc_coherent用於分配coherent內存,並返回對應的虛擬地址;
  • 進行內存分配時,存在三種方式:1)優先從設備專用的dma池開始分配;2)無專用dma池,如果是dma-direct訪問,通過dma_direct_alloc分配,而底層是依賴於CMA來分配;3)使用IOMMU的設備,則通過iommu的操作函數集來分配;

3.1 device reserved

通常,可以爲設備指定專用的dma coherent的區域,有以下的方式:

  1. 通過在設備樹中添加對應的屬性值,驅動中可以調用of_reserved_mem_device_init最終完成dma區域的註冊;
  2. 直接通過接口dma_decleare_coherent_memory調用來進行註冊;

3.2 dma pool

驅動中經常面臨buffer的管理,可以使用dma pool機制來處理,大概的原理如下:

  • dma-pool以頁爲單位來進行管理分配,可以通過添加多個dma池來使用;
  • dma-pool子系統的細節描述,需要另起一篇文章了;

3.2 Streaming DMA mappings

  • streaming mapping:對應於non-coherence設備;
  • 通常在單次DMA傳輸時進行map,在傳輸完成後進行unmap(除非調用了dma_sync_XXX()函數);
  • non-coherence設備,由於buffer不與其他數據共享cache line,通常會work better;

先看一下數據一致性問題:

  • dma to device時,需要將cache中的數據flush到memory中;
  • dma from device時,需要先將cache中的數據invalidate掉,避免CPU讀取的是原來的數據;

dma_map_single函數如下:

  • map操作時存在兩種方式,直接映射或使用iommu來完成映射;

dma_unmap_single是逆操作:

從上述函數中可以看到,最終都會調用到arch相關的cache操作,這個與體系結構是強相關的,以arm64爲例:

  • 最終的代碼將調用到彙編中,操作也較簡單,不再贅述了;

Linux kernel 已經通過 /proc/$PID/maps 和 smaps 將進程 PID 的內存信息暴露出來了,pmap 只要讀取和解析這些文件就可以了。具體你可以直接看 pmap 的源碼:

pmap.c · master · procps-ng / procps · GitLab

pmap命令詳解

簡介:
pmap - report memory map of a process(查看進程的內存映像信息)pmap命令用於報告進程的內存映射關係,是Linux調試及運維一個很好的工具。
用法
pmap [ -x | -d ] [ -q ] pids…
pmap -V
選項含義
-x extended Show the extended format. 顯示擴展格式
-XX show everything the kernel provides 顯示內核提供的一切信息
-d device Show the device format. 顯示設備格式
-q quiet Do not display some header/footer lines. 不顯示頭尾行
-V show version Displays version of program. 顯示版本
擴展格式和設備格式域:
Address: start address of map 映像起始地址
Kbytes: size of map in kilobytes 映像大小
RSS: resident set size in kilobytes 駐留集大小
Dirty: dirty pages (both shared and private) in kilobytes 髒頁大小
Mode: permissions on map 映像權限: r=read, w=write, x=execute, s=shared, p=private (copy on write)
Mapping: file backing the map , or ‘[ anon ]’ for allocated memory, or ‘[ stack ]’ for the program stack. 映像支持文件,[anon]爲已分配內存 [stack]爲程序堆棧
Offset: offset into the file 文件偏移
Device: device name (major:minor) 設備名

  1. 查看進程1 的地址
[root@master ~]# pmap -d 1
1:   /usr/lib/systemd/systemd --switched-root --system --deserialize 22
Address           Kbytes Mode  Offset           Device    Mapping
00007fd5d7abc000      16 r-x-- 0000000000000000 0fd:00000 libuuid.so.1.3.0
00007fd5d7ac0000    2044 ----- 0000000000004000 0fd:00000 libuuid.so.1.3.0
00007fd5d7cbf000       4 r---- 0000000000003000 0fd:00000 libuuid.so.1.3.0
00007fd5d7cc0000       4 rw--- 0000000000004000 0fd:00000 libuuid.so.1.3.0
00007fd5d7cc1000     224 r-x-- 0000000000000000 0fd:00000 libblkid.so.1.1.0
00007fd5d7cf9000    2048 ----- 0000000000038000 0fd:00000 libblkid.so.1.1.0
00007fd5d7ef9000      12 r---- 0000000000038000 0fd:00000 libblkid.so.1.1.0
00007fd5d7efc000       4 rw--- 000000000003b000 0fd:00000 libblkid.so.1.1.0
00007fd5d7efd000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007fd5d7efe000      84 r-x-- 0000000000000000 0fd:00000 libz.so.1.2.7
00007fd5d7f13000    2044 ----- 0000000000015000 0fd:00000 libz.so.1.2.7
00007fd5d8112000       4 r---- 0000000000014000 0fd:00000 libz.so.1.2.7
00007fd5d8113000       4 rw--- 0000000000015000 0fd:00000 libz.so.1.2.7
00007fd5d8114000     144 r-x-- 0000000000000000 0fd:00000 liblzma.so.5.0.99
00007fd5d8138000    2044 ----- 0000000000024000 0fd:00000 liblzma.so.5.0.99
00007fd5d8337000       4 r---- 0000000000023000 0fd:00000 liblzma.so.5.0.99
00007fd5d8338000       4 rw--- 0000000000024000 0fd:00000 liblzma.so.5.0.99
00007fd5d8339000      16 r-x-- 0000000000000000 0fd:00000 libcap-ng.so.0.0.0
00007fd5d833d000    2048 ----- 0000000000004000 0fd:00000 libcap-ng.so.0.0.0
00007fd5d853d000       4 r---- 0000000000004000 0fd:00000 libcap-ng.so.0.0.0
00007fd5d853e000       4 rw--- 0000000000005000 0fd:00000 libcap-ng.so.0.0.0
00007fd5d853f000      16 r-x-- 0000000000000000 0fd:00000 libattr.so.1.1.0
00007fd5d8543000    2044 ----- 0000000000004000 0fd:00000 libattr.so.1.1.0
00007fd5d8742000       4 r---- 0000000000003000 0fd:00000 libattr.so.1.1.0
00007fd5d8743000       4 rw--- 0000000000004000 0fd:00000 libattr.so.1.1.0
00007fd5d8744000       8 r-x-- 0000000000000000 0fd:00000 libdl-2.17.so
00007fd5d8746000    2048 ----- 0000000000002000 0fd:00000 libdl-2.17.so
00007fd5d8946000       4 r---- 0000000000002000 0fd:00000 libdl-2.17.so
00007fd5d8947000       4 rw--- 0000000000003000 0fd:00000 libdl-2.17.so
00007fd5d8948000     384 r-x-- 0000000000000000 0fd:00000 libpcre.so.1.2.0
00007fd5d89a8000    2044 ----- 0000000000060000 0fd:00000 libpcre.so.1.2.0
00007fd5d8ba7000       4 r---- 000000000005f000 0fd:00000 libpcre.so.1.2.0
00007fd5d8ba8000       4 rw--- 0000000000060000 0fd:00000 libpcre.so.1.2.0
00007fd5d8ba9000    1800 r-x-- 0000000000000000 0fd:00000 libc-2.17.so
00007fd5d8d6b000    2048 ----- 00000000001c2000 0fd:00000 libc-2.17.so
00007fd5d8f6b000      16 r---- 00000000001c2000 0fd:00000 libc-2.17.so
00007fd5d8f6f000       8 rw--- 00000000001c6000 0fd:00000 libc-2.17.so
00007fd5d8f71000      20 rw--- 0000000000000000 000:00000   [ anon ]
00007fd5d8f76000      92 r-x-- 0000000000000000 0fd:00000 libpthread-2.17.so
00007fd5d8f8d000    2044 ----- 0000000000017000 0fd:00000 libpthread-2.17.so
00007fd5d918c000       4 r---- 0000000000016000 0fd:00000 libpthread-2.17.so
00007fd5d918d000       4 rw--- 0000000000017000 0fd:00000 libpthread-2.17.so
00007fd5d918e000      16 rw--- 0000000000000000 000:00000   [ anon ]
00007fd5d9192000      84 r-x-- 0000000000000000 0fd:00000 libgcc_s-4.8.5-20150702.so.1
00007fd5d91a7000    2044 ----- 0000000000015000 0fd:00000 libgcc_s-4.8.5-20150702.so.1
00007fd5d93a6000       4 r---- 0000000000014000 0fd:00000 libgcc_s-4.8.5-20150702.so.1
00007fd5d93a7000       4 rw--- 0000000000015000 0fd:00000 libgcc_s-4.8.5-20150702.so.1
00007fd5d93a8000      28 r-x-- 0000000000000000 0fd:00000 librt-2.17.so
00007fd5d93af000    2044 ----- 0000000000007000 0fd:00000 librt-2.17.so
00007fd5d95ae000       4 r---- 0000000000006000 0fd:00000 librt-2.17.so
00007fd5d95af000       4 rw--- 0000000000007000 0fd:00000 librt-2.17.so
00007fd5d95b0000     244 r-x-- 0000000000000000 0fd:00000 libmount.so.1.1.0
00007fd5d95ed000    2044 ----- 000000000003d000 0fd:00000 libmount.so.1.1.0
00007fd5d97ec000       4 r---- 000000000003c000 0fd:00000 libmount.so.1.1.0
00007fd5d97ed000       4 rw--- 000000000003d000 0fd:00000 libmount.so.1.1.0
00007fd5d97ee000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007fd5d97ef000      84 r-x-- 0000000000000000 0fd:00000 libkmod.so.2.2.10
00007fd5d9804000    2044 ----- 0000000000015000 0fd:00000 libkmod.so.2.2.10
00007fd5d9a03000       4 r---- 0000000000014000 0fd:00000 libkmod.so.2.2.10
00007fd5d9a04000       4 rw--- 0000000000015000 0fd:00000 libkmod.so.2.2.10
00007fd5d9a05000     120 r-x-- 0000000000000000 0fd:00000 libaudit.so.1.0.0
00007fd5d9a23000    2044 ----- 000000000001e000 0fd:00000 libaudit.so.1.0.0
00007fd5d9c22000       4 r---- 000000000001d000 0fd:00000 libaudit.so.1.0.0
00007fd5d9c23000       4 rw--- 000000000001e000 0fd:00000 libaudit.so.1.0.0
00007fd5d9c24000      40 rw--- 0000000000000000 000:00000   [ anon ]
00007fd5d9c2e000      52 r-x-- 0000000000000000 0fd:00000 libpam.so.0.83.1
00007fd5d9c3b000    2048 ----- 000000000000d000 0fd:00000 libpam.so.0.83.1
00007fd5d9e3b000       4 r---- 000000000000d000 0fd:00000 libpam.so.0.83.1
00007fd5d9e3c000       4 rw--- 000000000000e000 0fd:00000 libpam.so.0.83.1
00007fd5d9e3d000      16 r-x-- 0000000000000000 0fd:00000 libcap.so.2.22
00007fd5d9e41000    2044 ----- 0000000000004000 0fd:00000 libcap.so.2.22
00007fd5da040000       4 r---- 0000000000003000 0fd:00000 libcap.so.2.22
00007fd5da041000       4 rw--- 0000000000004000 0fd:00000 libcap.so.2.22
00007fd5da042000     144 r-x-- 0000000000000000 0fd:00000 libselinux.so.1
00007fd5da066000    2044 ----- 0000000000024000 0fd:00000 libselinux.so.1
00007fd5da265000       4 r---- 0000000000023000 0fd:00000 libselinux.so.1
00007fd5da266000       4 rw--- 0000000000024000 0fd:00000 libselinux.so.1
00007fd5da267000       8 rw--- 0000000000000000 000:00000   [ anon ]
00007fd5da269000     136 r-x-- 0000000000000000 0fd:00000 ld-2.17.so
00007fd5da479000      40 rw--- 0000000000000000 000:00000   [ anon ]
00007fd5da488000       8 rw--- 0000000000000000 000:00000   [ anon ]
00007fd5da48a000       4 r---- 0000000000021000 0fd:00000 ld-2.17.so
00007fd5da48b000       4 rw--- 0000000000022000 0fd:00000 ld-2.17.so
00007fd5da48c000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007fd5da48d000    1420 r-x-- 0000000000000000 0fd:00000 systemd
00007fd5da7ef000     140 r---- 0000000000162000 0fd:00000 systemd
00007fd5da812000       4 rw--- 0000000000185000 0fd:00000 systemd
00007fd5db8ff000     892 rw--- 0000000000000000 000:00000   [ anon ]
00007ffea366a000     132 rw--- 0000000000000000 000:00000   [ stack ]
00007ffea36b3000       8 r-x-- 0000000000000000 000:00000   [ anon ]
ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 43424K    writeable/private: 1252K    shared: 0K

mapped 表示該進程映射的虛擬地址空間大小,也就是該進程預先分配的虛擬內存大小,即ps出的vsz

writeable/private 表示進程所佔用的私有地址空間大小,也就是該進程實際使用的內存大小

shared 表示進程和其他進程共享的內存大小

  1. 查看進程1的擴展地址
[root@master ~]# pmap -x 1
1:   /usr/lib/systemd/systemd --switched-root --system --deserialize 22
Address           Kbytes     RSS   Dirty Mode  Mapping
00007fd5d7abc000      16       8       0 r-x-- libuuid.so.1.3.0
00007fd5d7ac0000    2044       0       0 ----- libuuid.so.1.3.0
00007fd5d7cbf000       4       4       4 r---- libuuid.so.1.3.0
00007fd5d7cc0000       4       4       4 rw--- libuuid.so.1.3.0
00007fd5d7cc1000     224      36       0 r-x-- libblkid.so.1.1.0
00007fd5d7cf9000    2048       0       0 ----- libblkid.so.1.1.0
00007fd5d7ef9000      12      12      12 r---- libblkid.so.1.1.0
00007fd5d7efc000       4       4       4 rw--- libblkid.so.1.1.0
00007fd5d7efd000       4       0       0 rw---   [ anon ]
00007fd5d7efe000      84      12       0 r-x-- libz.so.1.2.7
00007fd5d7f13000    2044       0       0 ----- libz.so.1.2.7
00007fd5d8112000       4       4       4 r---- libz.so.1.2.7
00007fd5d8113000       4       4       4 rw--- libz.so.1.2.7
00007fd5d8114000     144      16       0 r-x-- liblzma.so.5.0.99
00007fd5d8138000    2044       0       0 ----- liblzma.so.5.0.99
00007fd5d8337000       4       4       4 r---- liblzma.so.5.0.99
00007fd5d8338000       4       4       4 rw--- liblzma.so.5.0.99
00007fd5d8339000      16       8       0 r-x-- libcap-ng.so.0.0.0
00007fd5d833d000    2048       0       0 ----- libcap-ng.so.0.0.0
00007fd5d853d000       4       4       4 r---- libcap-ng.so.0.0.0
00007fd5d853e000       4       4       4 rw--- libcap-ng.so.0.0.0
00007fd5d853f000      16       8       0 r-x-- libattr.so.1.1.0
00007fd5d8543000    2044       0       0 ----- libattr.so.1.1.0
00007fd5d8742000       4       4       4 r---- libattr.so.1.1.0
00007fd5d8743000       4       4       4 rw--- libattr.so.1.1.0
00007fd5d8744000       8       8       0 r-x-- libdl-2.17.so
00007fd5d8746000    2048       0       0 ----- libdl-2.17.so
00007fd5d8946000       4       4       4 r---- libdl-2.17.so
00007fd5d8947000       4       4       4 rw--- libdl-2.17.so
00007fd5d8948000     384       8       0 r-x-- libpcre.so.1.2.0
00007fd5d89a8000    2044       0       0 ----- libpcre.so.1.2.0
00007fd5d8ba7000       4       4       4 r---- libpcre.so.1.2.0
00007fd5d8ba8000       4       4       4 rw--- libpcre.so.1.2.0
00007fd5d8ba9000    1800     716       0 r-x-- libc-2.17.so
00007fd5d8d6b000    2048       0       0 ----- libc-2.17.so
00007fd5d8f6b000      16      16      16 r---- libc-2.17.so
00007fd5d8f6f000       8       8       8 rw--- libc-2.17.so
00007fd5d8f71000      20      12      12 rw---   [ anon ]
00007fd5d8f76000      92      60       0 r-x-- libpthread-2.17.so
00007fd5d8f8d000    2044       0       0 ----- libpthread-2.17.so
00007fd5d918c000       4       4       4 r---- libpthread-2.17.so
00007fd5d918d000       4       4       4 rw--- libpthread-2.17.so
00007fd5d918e000      16       4       4 rw---   [ anon ]
00007fd5d9192000      84      12       0 r-x-- libgcc_s-4.8.5-20150702.so.1
00007fd5d91a7000    2044       0       0 ----- libgcc_s-4.8.5-20150702.so.1
00007fd5d93a6000       4       4       4 r---- libgcc_s-4.8.5-20150702.so.1
00007fd5d93a7000       4       4       4 rw--- libgcc_s-4.8.5-20150702.so.1
00007fd5d93a8000      28      16       0 r-x-- librt-2.17.so
00007fd5d93af000    2044       0       0 ----- librt-2.17.so
00007fd5d95ae000       4       4       4 r---- librt-2.17.so
00007fd5d95af000       4       4       4 rw--- librt-2.17.so
00007fd5d95b0000     244     112       0 r-x-- libmount.so.1.1.0
00007fd5d95ed000    2044       0       0 ----- libmount.so.1.1.0
00007fd5d97ec000       4       4       4 r---- libmount.so.1.1.0
00007fd5d97ed000       4       4       4 rw--- libmount.so.1.1.0
00007fd5d97ee000       4       4       4 rw---   [ anon ]
00007fd5d97ef000      84      68       0 r-x-- libkmod.so.2.2.10
00007fd5d9804000    2044       0       0 ----- libkmod.so.2.2.10
00007fd5d9a03000       4       4       4 r---- libkmod.so.2.2.10
00007fd5d9a04000       4       4       4 rw--- libkmod.so.2.2.10
00007fd5d9a05000     120      40       0 r-x-- libaudit.so.1.0.0
00007fd5d9a23000    2044       0       0 ----- libaudit.so.1.0.0
00007fd5d9c22000       4       4       4 r---- libaudit.so.1.0.0
00007fd5d9c23000       4       4       4 rw--- libaudit.so.1.0.0
00007fd5d9c24000      40       4       4 rw---   [ anon ]
00007fd5d9c2e000      52      12       0 r-x-- libpam.so.0.83.1
00007fd5d9c3b000    2048       0       0 ----- libpam.so.0.83.1
00007fd5d9e3b000       4       4       4 r---- libpam.so.0.83.1
00007fd5d9e3c000       4       4       4 rw--- libpam.so.0.83.1
00007fd5d9e3d000      16       8       0 r-x-- libcap.so.2.22
00007fd5d9e41000    2044       0       0 ----- libcap.so.2.22
00007fd5da040000       4       4       4 r---- libcap.so.2.22
00007fd5da041000       4       4       4 rw--- libcap.so.2.22
00007fd5da042000     144      68       0 r-x-- libselinux.so.1
00007fd5da066000    2044       0       0 ----- libselinux.so.1
00007fd5da265000       4       4       4 r---- libselinux.so.1
00007fd5da266000       4       4       4 rw--- libselinux.so.1
00007fd5da267000       8       8       8 rw---   [ anon ]
00007fd5da269000     136     112       0 r-x-- ld-2.17.so
00007fd5da479000      40      40      40 rw---   [ anon ]
00007fd5da488000       8       8       8 rw---   [ anon ]
00007fd5da48a000       4       4       4 r---- ld-2.17.so
00007fd5da48b000       4       4       4 rw--- ld-2.17.so
00007fd5da48c000       4       4       4 rw---   [ anon ]
00007fd5da48d000    1420    1196       0 r-x-- systemd
00007fd5da7ef000     140     132     132 r---- systemd
00007fd5da812000       4       4       4 rw--- systemd
00007fd5db8ff000     892     844     844 rw---   [ anon ]
00007ffea366a000     132      52      52 rw---   [ stack ]
00007ffea36b3000       8       4       0 r-x--   [ anon ]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB           43424    3820    1292
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章