pt-visualizer
pt-visualizer
Визуализация дерева таблиц страниц для пользовательского процесса Linux (x86_64). Парсит /proc//maps + /proc//pagemap, строит дерево PGD → PUD → PMD → PTE и рисует его в терминале. P4D не выводится — при 48-bit VA он тривиален.
Сборка
или через скрипт
Нужен компилятор с поддержкой C++17 и cmake.
Запуск
Для чтения нужен root, иначе PFN не будут показаны.
Примеры:
Рендер DOT → PNG:
Что показывает
- Список VMA (Virtual Memory Areas) процесса из maps
- Статистику: сколько страниц present/swapped/не выделено
- Дерево таблиц страниц с группировкой смежных PTE
- Для каждой записи: виртуальный адрес, права (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) или в свопе, и если да, то вставляет в дерево по этим индексам. С флагом вставляются все страницы, включая не-present. Непрерывные PTE с одинаковыми правами, маппингом и состоянием группируются для читаемости.
vsyscall (0xffffffffff600000) пропускается — это ядерный адрес, pagemap его не обслуживает Определение huge pages через smaps приблизительное — мы знаем что в VMA есть AnonHugePages, но не знаем точные адреса; для точного определения нужен kpageflags