ARM bare-metal с 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. Было бы хорошо, если бы кто-нибудь мог дать мне какое-то объяснение. Большое спасибо.


person sing lam    schedule 20.11.2013    source источник
comment
у вас 0x15000000 сопоставлено с двумя разными местами? Как вам это удалось?   -  person old_timer    schedule 20.11.2013
comment
@dwelch: я предполагаю, что левая сторона - это физические адреса.   -  person unixsmurf    schedule 20.11.2013
comment
Откуда вы знаете, что запись не происходит до сброса кеша? Я собираюсь рискнуть в темноте, но вы пишете на 0x95000000, а читаете на 0x15000000 (в кеше которого могут быть устаревшие данные)?   -  person tangrs    schedule 20.11.2013
comment
Я делаю что-то неправильно? Вам нужно показать нам, что вы сделали, почтовый индекс или настройки таблицы mmu и т. д. Проблема может быть очевидна или не очевидна из этих деталей.   -  person old_timer    schedule 20.11.2013
comment
Я обнаружил, что запись на самом деле не записывается, пока я явно не удалю сброс кеша. - Как вы это определяете? Читая по адресу 0x15000000-0x24ffffff? Эта область может быть кэширована для чтения. Кэш - это VIVT, он не может узнать о вашем псевдониме. Linux ioremap() будет выделять только некэшируемые/небуферизуемые, он не отображает два раздела/страницы.   -  person artless noise    schedule 21.11.2013
comment
Извините за путаницу, левая сторона физическая, а правая — виртуальная. Я делаю это, потому что у меня есть устройство, которое будет принимать адрес структуры данных, чтобы запустить DMA содержимого памяти на другое устройство. Перед запуском DMA мне нужно прочитать и записать, чтобы указать элемент структуры. Я считаю очень неэффективным делать кеш недействительным и очищать всякий раз, когда мне нужно получить доступ к 4 байтам структуры. Вот почему я хочу иметь некэшированную и небуферизованную копию памяти. Если это не подходит для этого, есть ли альтернатива?   -  person sing lam    schedule 22.11.2013


Ответы (1)


Прежде всего: Cortex-A9 — это процессор ARMv7-A. Термины некэшируемый/небуферизуемый/кэшируемый/буферизуемый больше не являются правильным описанием сопоставлений. Фактический тип отображения определяется битами TEX[2:0], C и B.

Так что на самом деле мне приходится немного догадываться о том, что на самом деле представляют собой ваши сопоставления. И я предполагаю, что у вас есть большинство ваших сопоставлений, настроенных как строго упорядоченные, а зеркальная область - как кэшируемая с обычной обратной записью.

Наличие нескольких виртуальных сопоставлений с разными типами памяти, указывающими на одно и то же физическое местоположение, обычно не является хорошей идеей в архитектуре ARM. Раньше это было явно запрещено, но в последней версии справочного руководства по архитектуре ARMv7-AR (DDI 0406C.b) есть (довольно длинный) раздел, посвященный последствиям «несоответствующих атрибутов памяти».

Я бы порекомендовал найти другой способ достижения цели.

Простое изменение сопоставления некэшируемых регионов на Normal Non-cacheable было бы хорошим началом. Нет веской причины для использования строго упорядоченных отображений для ОЗУ.

person unixsmurf    schedule 20.11.2013
comment
Спасибо за пояснение, не могли бы вы дать мне более подробную информацию о том, как внести изменения? Спасибо. - person sing lam; 22.11.2013