crash命令 —— kmem


參考:
https://crash-utility.github.io/help_pages/kmem.html

常用方法:

  • 查看page flags的定義
kmem -g
  • 將指定的數字翻譯為page的flags
kmem -g 0x201
  • 查看指定page的信息
kmem -p <page *>
  • 查看所有page的信息
    kmem -p

  • 查看page中某些成員的值
    kmem -m flags,lru,lru.next

  • 查看memory node的信息,比如node中每個zone的mem_map以及起始物理地址

kmem -n
  • 查看每個zone內存的使用統計信息
kmem -z
  • 查看slab的信息
kmem -s 或者 kmem -S
- 如果`-s`后面跟的是一個地址,那么會顯示這個地址所屬的slub以及object信息
  • 查看內存的使用統計信息,類似cat /proc/meminfo
    kmem -i

  • 查看vmalloc分配的內存的區域的信息
    kmem -v

  • 查看內核中的三張內存使用統計信息的表的內容vm_zone_stat/vm_node_stat/vm_numa_stat
    kmem -V

  • 查看巨型頁信息
    kmem -h

  • 如果kmem后面使用的地址都是物理地址
    kmem -P

  • 查看指定的物理地址對應的page的信息
    kmem -p <物理地址>

  • 查看某個物理地址對應的slab以及page的信息
    kmem <物理地址>

  • 獲取per-cpu變量在每個cpu上的基地址

crash> kmem -o
PER-CPU OFFSET VALUES:
  CPU 0: ffff9f99e8e00000
  CPU 1: ffff9f99e8e80000
  CPU 2: ffff9f99e8f00000
  CPU 3: ffff9f99e8f80000
  CPU 4: ffff9f99e9000000
  CPU 5: ffff9f99e9080000
  CPU 6: ffff9f99e9100000
  CPU 7: ffff9f99e9180000

怎么用呢? 比如kmem_cache結構體的第一個成員是struct kmem_cache_cpu __percpu *cpu_slab是一個percpu變量,如果用struct來查看這個一個kmem_cache變量的信息,會得到如下內容:

crash> struct kmem_cache ffff9f96c0042d00 -x
struct kmem_cache {
  cpu_slab = 0x3a1a0,
  flags = 0x40000000,
  min_partial = 0x6,
  size = 0x1000,
  object_size = 0x1000,

可以看到cpu_slab的值是0x3a1a0,這並不是一個合法的內核地址。實際上這里記錄的是一個偏移量,需要加上一個cpu的基地址,就可以得到這個percpu變量在那個cpu上的實際虛擬地址,比如想知道cpu_slab在cpu7上的虛擬地址:ffff9f99e9180000 + 0x3a1a0 = ffff9f99e91ba1a0,可以用kmem -S驗證一下:

crash> kmem -S kmalloc-4k
CACHE             OBJSIZE  ALLOCATED     TOTAL  SLABS  SSIZE  NAME
ffff9f96c0042d00     4096       1772      1872    234    32k  kmalloc-4k
CPU 0 KMEM_CACHE_CPU:
  ffff9f99e8e3a1a0
CPU 0 SLAB:
  SLAB              MEMORY            NODE  TOTAL  ALLOCATED  FREE
  fffff41dc4e46200  ffff9f96f9188000     0      8          2     6
...
CPU 7 KMEM_CACHE_CPU:
  ffff9f99e91ba1a0  <<<======================
CPU 7 SLAB:
  SLAB              MEMORY            NODE  TOTAL  ALLOCATED  FREE
  fffff41dc49b0200  ffff9f96e6c08000     0      8          3     5
  FREE / [ALLOCATED]
  [ffff9f96e6c08000]
  [ffff9f96e6c09000]
   ffff9f96e6c0a000  (cpu 7 cache)

要獲取percpu的內核虛擬地址,crash提供了專門的命令ptov,參考:ptov,此外如果percpu變量是一個全局的,比如cpu_quarantine,那么可以用p cpu_quarantine來查看在每個cpu上的地址。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM