ARM MMU отключен 4 КБ

Я хочу отключить MMU во время программы загрузки (голое железо) для архитектуры ARMv7. Читая ARM ARM я наткнулся на это.

«Когда MMU отключен, инструкция может быть извлечена, если выполняется одно из следующих условий:

• Инструкция находится в том же блоке памяти размером 4 КБ (выровненном по 4 КБ), что и инструкция, необходимая для простого последовательного выполнения программы, или находится в блоке памяти размером 4 КБ, непосредственно следующем за таким блоком.

• Инструкция находится в том же блоке памяти размером 4 КБ (выровненном по 4 КБ), из которого ранее требовалось выполнение инструкции простым последовательным выполнением программы с отключенным MMU, или находится в блоке 4 КБ, непосредственно следующем за таким блоком».

Кто-нибудь может расшифровать и объяснить мне, как я могу убедиться, что инструкции находятся в пределах 4 КБ / 8 КБ рядом друг с другом? (Вот как я понимаю утверждения..)


person temp    schedule 17.09.2013    source источник


Ответы (2)


Думаю, это означает, что вы не можете переходить более чем на (8 КиБ минус текущее смещение страницы) вперед, а не назад на предыдущую страницу размером 4 КиБ. В основном: линейный поток программы в порядке, как и скачки вперед примерно на 4 КиБ; обратные переходы (и циклы) допустимы только в том случае, если они гарантированно не пересекают страницу.

Вы, вероятно, можете научить свой компилятор C использовать модель коротких переходов, если вы используете C; если вы используете сборку напрямую, это довольно легко сделать. Также используйте скрипт компоновщика или прямое преобразование в двоичный формат вывода, чтобы гарантировать, что адреса памяти, по которым вы загружаетесь, совпадают с теми, которые, по вашему думанию, загружаются во время разработки.

Многие ассемблеры поддерживают вычисления смещения для переходов. Вы также можете создать карту ссылок всех символов, а затем проанализировать, не слишком ли велики ваши переходы.

Конечно, может оказаться полезным посмотреть, как это делают BSD и Linux. Я предполагаю, что они просто быстро включают MMU и до тех пор используют немного написанного от руки кода.

person Community    schedule 17.09.2013
comment
Я рассмотрю модель коротких прыжков и т. д., как только пойму проблему, которую пытаюсь решить. Трудно понять ограничения только из текста. @dwelch dwelch может быть на правильном пути - person temp; 18.09.2013
comment
Ах да, он подходит к этому с совершенно другой точки зрения: ЦП накладывает ограничения на память (контроллер) с помощью предварительной выборки и тому подобного, поэтому разработчик системы должен сделать свою систему способной поддерживать этот режим работы ЦП. Имеет смысл. Это прочтение отличается от того, что я сделал, но благодаря контексту оно звучит правдоподобно. - person mirabilos; 18.09.2013

Если вы добавите остальную часть контекста, вы увидите, что

Эти обращения могут быть вызваны спекулятивной выборкой инструкций, независимо от того, зафиксирована ли предварительно выбранная инструкция для выполнения.

Примечание. Чтобы обеспечить соответствие архитектуре, программное обеспечение должно обеспечивать выполнение обоих следующих условий:

инструкции, которые будут выполняться при отключении MMU, расположены в блоках адресного пространства размером 4 КБ, которые содержат только память, устойчивую к спекулятивному доступу

каждый блок адресного пространства размером 4 КБ, следующий сразу за блоком размером 4 КБ, который содержит инструкции, которые будут выполняться при отключении MMU, также содержит только память, устойчивую к спекулятивному доступу.

Все, что они говорят, это то, где предсказатели ветвления могут тянуть инструкции, независимо от того, используются они или нет. Поэтому, если у вас отключен MMU, и вы выполняете операции ближе к концу своего ОЗУ, а ваш контроллер памяти не допустит чтения (выборки) за пределами этого ОЗУ. то у вас могут быть проблемы. Либо не запускайте закрывающий код, либо меняйте контроллер памяти на более толерантный, либо включайте mmu и миритесь с его нюансами, какими бы они ни были. (с включенным mmu вы могли бы более легко сопоставить этот следующий блок с каким-либо другим ОЗУ, зная, что вы на самом деле не будете выполнять там, а только как панель для выборки предсказателя ветвления).

Как вы это страхуете? просто скажите вашему компоновщику не помещать туда код, и он предупредит и/или потерпит неудачу, если .text окажется слишком близко.

person old_timer    schedule 18.09.2013
comment
Я на самом деле не понимаю :-(. Моя мини-система состоит из 64 КБ ПЗУ (где запускается моя программа) и только 16 КБ sram. Предсказание переходов отключено. Можно ли отключить предварительную загрузку? Это довольно сложный текст для чтения ... - person temp; 18.09.2013
comment
Вам нужно отключить предварительную выборку? Если ваши ПЗУ и SRAM допускают спекулятивный доступ, вам не нужно ничего делать. Я думаю, что проблема здесь заключается в том, что ЦП может (попытаться) читать с адресов, которые поддерживаются пространством ввода-вывода или вообще не памятью, и пока MMU отключен, нормальный механизм ошибки страницы не работает. используется, так что это может привести систему в ненормальное состояние. Может быть, возможно раннее включение MMU (в пределах первых 4 КБ или 8 КБ вашего ПЗУ)? - person mirabilos; 18.09.2013
comment
Просто прочтите руководство, проблема связана с спекулятивным чтением, которое происходит по соседству с исполняемым кодом, и если ваша система памяти не может выдержать такое чтение, ваша система выйдет из строя. В идеале это проблема дизайна чипа, а не проблема программного обеспечения, но это зависит от инженеров по кремнию. Вы, конечно, можете протестировать это или просто держать свой код подальше от недовольных областей памяти. Обычно у вас будет стек в верхней части оперативной памяти и, возможно, данные в верхней части ПЗУ, поэтому обычно это не будет проблемой. - person old_timer; 18.09.2013
comment
Я продолжу, так как проблем быть не должно, но оставлю вопрос без ответа. Спасибо за полезные комментарии! - person temp; 30.09.2013
comment
документы руки отвечают на ваш вопрос, я не понимаю проблемы. - person old_timer; 30.09.2013