В контексте ARMv7, в чем преимущество ядра Linux с отображением памяти один в один, когда mmu должен выполнять перевод таблицы страниц

Виртуальные адреса ядра Linux отображаются один-к-одному. Таким образом, вычитая PAGE_OFFSET из виртуального адреса, мы получим физический адрес. Вот как virt_to_phys и Phys_to_virt реализованы в memory.h.

Мой вопрос: в чем преимущество этого сопоставления один-к-одному на armv7 mmu, когда mmu должен выполнять перевод таблицы страниц при промахе TLB?

Является ли единственное преимущество сопоставления один-к-одному, так что ПО может напрямую получать физический адрес соответствующего виртуального адреса, просто вычитая PAGE_OFFSET, или есть еще какое-то преимущество в переводе страниц ARMV7 MMU?

Если нет преимущества отображаемой памяти 1: 1 над преобразованием таблиц страниц mmu, тогда зачем нам нужны таблицы страниц для отображаемой памяти 1: 1. Я имею в виду, что mmu может выполнять операцию аналогично virt_to_phys, вместо того, чтобы проходить все таблицы страниц.


person AnshuMan Gupta    schedule 25.10.2015    source источник
comment
Как бы вы предложили реализовать phys_to_virt() без фиксированного сопоставления 1: 1? Кроме того, предпосылка вопроса кажется немного запутанной - да, MMU выполняет преобразование сам по себе, когда ЦП просто обращается к памяти с помощью VA, но это совершенно другое дело, когда ядру требуется < i> вычислить преобразования VA / PA (например, передача адресов DMA устройствам, включение дополнительных процессоров или обновление самих таблиц страниц).   -  person Notlikethat    schedule 25.10.2015
comment
если нет связи между отображаемой памятью 1: 1 и преобразованием таблицы страниц mmu, то для отображаемой памяти 1: 1 зачем нам нужны таблицы страниц (в многоуровневой таблице страниц нам нужен множественный доступ к памяти), простое вычитание PAGE_OFFSET даст физический адрес.   -  person AnshuMan Gupta    schedule 25.10.2015
comment
Потому что ММУ всегда работает с таблицами страниц, он ничего не знает о каких-то смещениях. Отображение 1: 1 сделано для удобства.   -  person Alex Hoppus    schedule 25.10.2015
comment
Хм? MMU нужны таблицы страниц, вот как это работает. Кроме того, нет отображения 1: 1 для, например, vmalloc или адреса пользовательского пространства, линейная карта ядра - это особый случай.   -  person Notlikethat    schedule 25.10.2015
comment
@ Notlikethat, вы хотите сказать, что адреса внутри диапазона карты лайнера ядра не проходят через таблицы страниц?   -  person Amit Singh Tomar    schedule 10.08.2016


Ответы (1)


Мой вопрос: в чем преимущество этого сопоставления один-к-одному на armv7 mmu, когда mmu должен выполнять перевод таблицы страниц при промахе TLB?

Ваш ответ частично заключен в вопросе. Отображения 1: 1 реализованы с помощью секций размером 1 МБ, поэтому запись TLB меньше. То есть, для страницы размером 4 КБ требуется запись TLB уровня 1 и уровня 2, и она охватывает только 4 КБ памяти. Ядро ARM должно всегда оставаться отображенным, поскольку оно имеет прерывание, ошибку страницы и другой критический код, который может быть вызван в любое время.

Для кода пользовательского пространства каждый фрагмент кода размером 4 КБ поддерживается inode и может быть удален из памяти во время нехватки памяти. Код пользовательского пространства обычно представляет собой всего несколько горячих процессов / подпрограмм, поэтому записи TLB для них не так важны. TLB часто является вторичным по отношению к кэшам L1 / L2.

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

Является ли единственное преимущество сопоставления один-к-одному, так что ПО может напрямую получать физический адрес соответствующего виртуального адреса, просто вычитая PAGE_OFFSET, или есть еще какое-то преимущество при трансляции страниц ARMV7 MMU?

Отображение 1: 1 позволяет отображать более крупные диапазоны за один раз. Типичная SDRAM / основная память поставляется с шагом 1 МБ. Это также очень эффективно. Есть и другие возможности, но, вероятно, это выигрыш для данного выбора.

Является ли единственное преимущество сопоставления один-к-одному, так что ПО может напрямую получать физический адрес соответствующего виртуального адреса, просто вычитая PAGE_OFFSET, или есть еще какое-то преимущество при трансляции страниц ARMV7 MMU?

MMU должен быть включен, чтобы использовать кэш данных и для защиты памяти между процессами пользовательского пространства; друг друга, а также разделение пользователя / ядра. Само по себе изучение использования ядром отображения 1: 1 - это еще не все. Другие части ядра нуждаются в MMU. Без MMU отображение 1: 1 было бы идентичностью. Т.е. PAGE_OFFSET==0. Единственная причина иметь фиксированное смещение - это позволить отображать память любого физического адреса на общий виртуальный адрес. Не все платформы имеют одинаковое значение PAGE_OFFSET.

Еще одно преимущество отношения virt_to_phys; ядро написано для выполнения по фиксированному виртуальному адресу. Это означает, что код ядра не обязательно должен относиться к ПК, и при этом он может работать на платформах с разными физическими адресами основной памяти. В коде ассемблера arm / boot позаботятся о том, чтобы он соответствовал ПК, поскольку загрузчик должен управлять вручную с выключенным MMU. Этот код arm / boot устанавливает начальное сопоставление.

См. Также: Найдите физический адрес вектора table, исключение из сопоставления virt_to_phys.
Возможность замены данных ядра?
Как ядро ​​управляет менее 1 ГБ?
Некоторые подробности о загрузке ARM Linux?
Таблица страниц в ядре Linux - ранняя загрузка и MMU.

person artless noise    schedule 25.10.2015