Мой вопрос: в чем преимущество этого сопоставления один-к-одному на 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
phys_to_virt()
без фиксированного сопоставления 1: 1? Кроме того, предпосылка вопроса кажется немного запутанной - да, MMU выполняет преобразование сам по себе, когда ЦП просто обращается к памяти с помощью VA, но это совершенно другое дело, когда ядру требуется < i> вычислить преобразования VA / PA (например, передача адресов DMA устройствам, включение дополнительных процессоров или обновление самих таблиц страниц). - person Notlikethat   schedule 25.10.2015