Память ядра (записи виртуальных адресов) в TLB? - PullRequest
8 голосов
/ 12 декабря 2011

Linux - это ОС, а ARM - процессор, упомянутый в этом контексте.

Содержит ли TLB виртуальные адреса как ядра, так и пространства пользователя?Память ядра начинается с 0xc000_0000 и продолжается до 0xFFFF_FFFF, где первые 3 ГБ принадлежат пользовательскому пространству.Между переключением контекста между процессами TLB сбрасывается.

Содержит ли TLB виртуальные адреса как ядра, так и пространства пользователя?

Память ядра (виртуальная) напрямую соответствует физической памяти (просто компенсируется с помощью 0xC000_0000 даст нам физический адрес).Нужно ли иметь память ядра (виртуальную) в TLB (если вы говорите, что она присутствует в TLB)?Должен присутствовать только адрес пространства пользователя.

Ответы [ 2 ]

10 голосов
/ 12 декабря 2011

Основная причина, по которой мы используем преобразование виртуальных адресов в современные ЦП, заключается в более эффективном и более контролируемом использовании памяти, что позволяет нам:

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

И таблицы страниц делают все это возможным.

Вы хотите иметь возможность отображать и отменять отображение физической памяти в виртуальном адресном пространстве в ядре, и обычно этот механизм перевода работает во всей системе. Конечно, перевод идет по цене, так как теперь вам нужно консультироваться и поддерживать таблицы страниц, что влечет за собой снижение производительности. Но еще не все потеряно:

  1. TLBs в определенной степени облегчают эту проблему. Они кешируют переводы.
  2. Большие страницы (например, ARMv7-A large pages и sections) помогают больше, так как им требуется меньше записей TLB на единицу переведенной памяти.
  3. Есть также такие вещи, как global pages. Когда вы переключаетесь между приложениями и хотите сбросить текущий TLB, вы можете избежать аннулирования глобальных страниц из TLB, выполнив Invalidate TLB entries by ASID match с приложением ASID. Если вы помечаете страницы ядра как глобальные, вы не отменяете их переводы, и само ядро ​​не страдает от ненужных недействительных TLB.

См., Например, «Справочное руководство по архитектуре ARM®, редакция ARM®v7-A и ARM®v7-R» для получения подробной информации о ARM Virtual Memory System Architecture (VMSA), таблицах страниц, TLB и т. Д.

6 голосов
/ 12 декабря 2011

Существует два типа виртуальных адресов, которые использует ядро ​​Linux:

  1. То, что вы уже упомянули в строке «Память ядра (виртуальная), напрямую соответствует физической памяти (просто смещение с 0xC000_0000 дастнам физический адрес)Это сопоставляется с непрерывными физическими адресами.
  2. Использование vmalloc.

Первый выполняется с использованием MACRO:

include/asm-x86/page_32.h

#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))

_pa (x) делает виртуальныйк физическому переводу.Обратите внимание, что этот перевод происходит во встроенном во время компиляции.Перевод таблицы страниц не происходит.Это последнее предложение очень важно.

С другой стороны, используя второй метод, вы можете выделить память, которая является непрерывной в виртуальной памяти, но не может быть таковой в физической памяти.Теперь в этом случае требуется полный перевод таблицы страниц при первом обращении к виртуальному адресу.Вопрос в том, кто это делает?

В случае машин CISC (например, x86) MMU (аппаратное обеспечение) делает это в случае пропуска TLB (первый доступ к виртуальному адресу) и обновляет таблицу страниц.Для виртуальных адресов ядра (полученных через vmalloc) они хранятся в виде записей TLB.Они называются глобальными записями, и когда происходит переключение контекста процесса, они в основном игнорируются и не сбрасываются, как остальные записи пространства процесса-адреса.Однако, когда вы делаете vfree для освобождения связанной виртуальной памяти, эти записи удаляются.

В случае RISC-машины (например, MIPS) перевод страницы обрабатывается программным обеспечением.После пропуска TLB, оборудование вызывает исключение.Дескриптор ловушки выполняется в режиме ядра, чтобы выполнить перевод и обновляет TLB, используя специальные инструкции.После возврата из обработчика ловушек запускается та же строка кода и происходит TLB.

Пожалуйста, обратитесь к: http://pages.cs.wisc.edu/~remzi/OSFEP/vm-tlbs.pdf

Суть в том, что не все адреса ядра отображаютсякак вы описали.В вашем случае физические адреса генерируются во время компиляции.Итак, зачем добавлять запись TLB.Для адресов из vmalloc присутствуют записи TLB.Когда происходит переключение контекста между процессами, нет необходимости сбрасывать весь TLB, и глобальные записи, сделанные ядром vmalloc, могут быть сохранены.Когда вы используете vfree, соответствующие глобальные записи сбрасываются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...