pt-visualizer

0

Описание

Языки

  • C++97,3%
  • CMake1,7%
  • Shell1%
README.md

pt-visualizer

Визуализация дерева таблиц страниц для пользовательского процесса Linux (x86_64). Парсит /proc//maps + /proc//pagemap, строит дерево PGD → PUD → PMD → PTE и рисует его в терминале. P4D не выводится — при 48-bit VA он тривиален.

Сборка

или через скрипт

Нужен компилятор с поддержкой C++17 и cmake.

Запуск

Для чтения

/proc/<pid>/pagemap
нужен root, иначе PFN не будут показаны. Примеры:

Рендер DOT → PNG:

Что показывает

  1. Список VMA (Virtual Memory Areas) процесса из maps
  2. Статистику: сколько страниц present/swapped/не выделено
  3. Дерево таблиц страниц с группировкой смежных PTE
  4. Для каждой записи: виртуальный адрес, права (rwxp), маппинг, PFN, soft_dirty

Как работает?

Разбор адреса (48-bit VA, 4-level)

bits 47:39 → PGD index (9 бит, 512 записей) bits 38:30 → PUD index bits 29:21 → PMD index bits 20:12 → PTE index bits 11:0 → offset (4KB страница)

Программа для каждой страницы из maps проверяет через pagemap, находится ли она в RAM (present) или в свопе, и если да, то вставляет в дерево по этим индексам. С флагом

--all
вставляются все страницы, включая не-present. Непрерывные PTE с одинаковыми правами, маппингом и состоянием группируются для читаемости.

vsyscall (0xffffffffff600000) пропускается — это ядерный адрес, pagemap его не обслуживает Определение huge pages через smaps приблизительное — мы знаем что в VMA есть AnonHugePages, но не знаем точные адреса; для точного определения нужен kpageflags