Как вызвать перегрузку TLB с помощью пользовательского процесса?

#architecture #x86-64 #tlb

#архитектура #x86-64 #tlb

Вопрос:

Моя текущая работа должна генерировать указанное количество пропусков TLB на процессоре серии Intel Core, пока все идет не так хорошо. Я перепробовал много методов, но все они имеют очень высокий процент попадания в TLB. Кто-нибудь знает какую-нибудь полезную информацию о том, как работает TLB x86, или какой-нибудь метод генерации большого количества пропусков TLB в пользовательском процессе?

Ответ №1:

TLB — это кэш, используемый центральным процессором для запоминания физического адреса, связанного с виртуальным адресом. Виртуальное адресное пространство разделено на страницы, обычно по 4 КБ каждая. В TLB есть пространство для каждой возможной виртуальной страницы, которое содержит адрес связанной с ней физической страницы. Ошибка TLB возникает при попытке получить доступ к странице, физический адрес которой еще не был загружен. Следовательно, чтобы максимизировать пропуски, вам нужно максимизировать количество обращений к различным страницам.

К сожалению, это не так просто. Простой сбой TLB приведет к считыванию записей из иерархии таблицы страниц, чтобы найти правильный физический адрес. Но это происходит только в том случае, если вы обращаетесь к странице, у которой есть физический адрес. ОС определит, какие виртуальные адреса имеют какие физические адреса, и если вы попытаетесь прочитать с любых других, вы вызовете сбой страницы. Обработчик ошибок страницы либо завершит работу вашей программы за незаконный доступ к этой странице, либо переместит данные, чтобы поместить физическую страницу по этому виртуальному адресу.

Лучший способ вызвать как можно больше пропусков TLB — это:

  1. Выделите столько памяти, сколько вам позволит ОС. Вы должны чередовать выделение больших и маленьких фрагментов, освобождая маленькие фрагменты после выделения другого большого. Мы надеемся, что это позволит максимально увеличить фрагментацию, распределив вашу память на как можно большее количество страниц.
  2. Создайте список с одним адресом из каждой отдельной страницы, используемой в выделенной вами памяти. Вы также можете добавить другие страницы, которые, как вы знаете, доступны для чтения, например страницы, содержащие ваш код.
  3. Пройдите по этому списку, считывая данные с каждой страницы. Поскольку ОС необходимо освободить физические страницы для размещения ваших виртуальных страниц, она (будем надеяться) будет использовать физические страницы, ранее связанные с другими страницами в вашем цикле, что приведет к максимальному количеству пропусков TLB.

Количество пропусков будет возрастать по мере того, как доступная оперативная память становится низкой, потому что ОС придется перемещать больше физических страниц, чтобы удовлетворить потребности вашей программы, поэтому полезно иметь другие процессы, требующие много памяти, запущенные одновременно.

Комментарии:

1. Спасибо за ответ. Я знаю, как работает TLB, мне нужна подробная информация о дизайне Intel, например, сколько записей кэширует каждый tlb и какой алгоритм замены он использует. Обычно считается, что запись TLB будет охватывать диапазон физической памяти 4 КБ, однако, похоже, это не так, как для Core Duo P8400 и многих других типов. Интересно, может ли tlb enry охватывать диапазон физической памяти размером более 4 КБ.