Обработка промахов TLB - PullRequest
       68

Обработка промахов TLB

4 голосов
/ 23 сентября 2011

Я хочу посмотреть, к каким страницам обращается моя программа. Теперь одним из способов является использование mprotect с обработчиком SIGSEGV для записи страниц, к которым осуществляется доступ. Тем не менее, это связано с дополнительными затратами на установку битов защиты для всех страниц памяти, которые меня интересуют.

Второй способ, который приходит на ум, состоит в том, чтобы вначале аннулировать буфер быстрого перевода (TLB) и затем записать пропуски. При каждом промахе я записываю адресную страницу памяти и, следовательно, записываю ее. Теперь вопрос заключается в том, как обрабатывать пропуски TLB в пользовательском пространстве для программы linux.

И если вы знаете даже более быстрый метод, чем пропускает TLB или mprotect , чтобы записывать страницы с грязной памятью, пожалуйста, дайте мне знать. Кроме того, я хочу решение только для x86.

Ответы [ 3 ]

7 голосов
/ 24 сентября 2011

Я хочу посмотреть, к каким страницам обращается моя программа.

Вы можете смоделировать процессор и получить эти данные.Варианты:

  • 1) valgrind - динамический переводчик двоичных файлов пользовательского пространства с хорошей поддержкой инструментария.Попробуйте инструмент cachegrind - он будет эмулировать даже кэши L1 / L2;также вы можете попробовать создать новый инструмент для регистрации всех обращений к памяти (например, с детализацией страницы)
  • 2) qemu - динамический транслятор, как для общесистемного, так и для общесистемного режимов.Никаких инструментов в оригинальном qemu, как я знаю
  • 3) bochs - общесистемный эмулятор процессора (очень медленный).Вы можете легко взломать код «доступа к памяти», чтобы получить журнал памяти.
  • 4) PTLsim - www.ptlsim.org/papers/PTLsim-ISPASS-2007.pdf

Однако это связано с накладными расходами установки битов защиты для всех страниц памяти

Не слишком ли велики эти издержки?

Теперь вопрос заключается в том, как обрабатывать пропуски TLB в пространстве пользователя для программы linux.

Вы не можете обрабатывать пропуски, ни в пространстве пользователя, ни в пространстве ядра(на x86 и многих других популярных платформах).Это связано с тем, что большинство платформ управляет пропусками TLB в hardware : .MMU (часть CPU / chipset) будет выполнять обход таблиц страниц и прозрачно получать физический адрес.Только если установлены некоторые биты или когда область адреса не отображена, прерывание сбоя страницы генерируется и доставляется в ядро.

Кроме того, кажется, что в современных процессорах нет способа вывести TLB (, но 386DX)смог к этому )

Вы можете попытаться обнаружить промах TLB по введенной задержке.Но эту задержку можно скрыть из-за неправильного запуска поиска TLB.

Кроме того, большинство аппаратных событий (доступ к памяти, доступ к tlb, попадания по tlb, пропуски по tlb) подсчитываются с помощью мониторинга производительности оборудования (эта частьЦП используется Vtune, CodeAnalyst и oprofile).К сожалению, это только глобальные счетчики для событий, и вы не можете активировать более 2-4 событий одновременно.Хорошей новостью является то, что вы можете установить счетчик perfmon для прерывания при достижении некоторого количества.Затем вы получите (через прерывание) адрес инструкции ($ eip), где был достигнут счет.Таким образом, вы можете найти «горячую точку» TLB-miss-spot с этим оборудованием (оно есть в каждом современном процессоре x86; как в Intel, так и в AMD).

6 голосов
/ 23 сентября 2011

TLB прозрачен для программы пользовательского пространства, самое большее, вы можете посчитать пропуски TLB по некоторому счетчику производительности (без адресов).

0 голосов
/ 10 октября 2012

Посмотрите файл / proc / PID / maps для вашего процесса.Согласно документации в http://www.kernel.org/doc/Documentation/filesystems/proc.txt, / proc / PID / maps указывается карта памяти для каждого процесса.Эта карта скажет вам, "какие страницы доступны моей программе".Тем не менее, похоже, вы хотите знать, какие из этих страниц грязные.Хотя я не уверен, как найти точный список грязных страниц , можно найти , сколько страниц загрязнено, просмотрев грязные частные и общие грязные поля в / proc/ PID / smaps и деление его на размер страницы.Обратите внимание, что этот метод довольно быстрый.Я полагаю, что приблизительное представление о , какие страницы являются грязными, может быть получено путем периодического опроса / proc / PID / maps.

...