ARM голый металл с MMU: ошибка записи в не кэшируемую, не буферизированную область отображения
Я процессор ARM Cortex A9 с 2 ядрами. Но я просто использую 1 ядро, а другое просто в напряженном цикле. Я настраиваю таблицу MMU, используя раздел (1 МБ на запись) следующим образом:
0x00000000-0x14ffffff => 0x00000000-0x14ffffff (non-cachable, non-bufferable)
0x15000000-0x24ffffff => 0x15000000-0x24ffffff (cachable, bufferable)
0x25000000-0x94ffffff => 0x25000000-0x94ffffff (non-cachable, non-bufferable)
0x15000000-0x24ffffff => 0x95000000-0xa4ffffff (non-cachable, non-bufferable)
0xa5000000-0xffffffff => 0xa5000000-0xffffffff (non-cachable, non-bufferable)
Это довольно просто. Я просто хочу иметь зеркало 256 МБ памяти для доступа без кэширования. Однако, когда я делаю несколько писем, пишу в раздел без кэширования по адресу 0x95000000-0xa4ffffff. Я обнаружил, что запись на самом деле не записана, пока я явно не дам сброс кеша.
Я делаю что-то не так или это сопоставление недопустимо? Если это так, я не понимаю, как ioremap Linux будет работать на ARM. Будет хорошо, если кто-нибудь сможет дать мне какое-то объяснение. Спасибо большое.
1 ответ
Прежде всего: Cortex-A9 - это процессор ARMv7-A. Термины "не кэшируемый" / "не буферизируемый" / "кэшируемый" / "буферизируемый") больше не являются правильными описаниями отображений Фактический тип отображения определяется битами TEX[2:0], C и B.
Так что на самом деле мне нужно немного угадать, каковы ваши отображения. И я предполагаю, что у вас большинство ваших отображений установлено как строго упорядоченные, а зеркальная область как обычная запись с обратной записью кэшируется.
Наличие нескольких виртуальных отображений с разными типами памяти, указывающими на одно и то же физическое местоположение, обычно не является хорошей идеей в архитектуре ARM. Раньше это было явно запрещено, но в последней версии справочного руководства по архитектуре ARMv7-AR (DDI 0406C.b) есть (довольно длинный) раздел, посвященный последствиям "Несоответствующие атрибуты памяти".
Я бы порекомендовал найти другой способ достижения вашей цели.
Хорошим началом будет простое изменение отображения областей без кэширования на Обычное, не кэшируемое. Не существует веской причины для использования строго упорядоченных отображений для оперативной памяти.