2013-11-20 3 views
0

Я ARM Cortex A9 CPU с 2 ядрами. Но я просто использую 1 ядро, а другой - только в замкнутом цикле. Я настраиваю таблицу MMU с использованием раздела (1 МБ на запись) следующим образом:ARM bare-metal с MMU: записывать в неперехватываемую, небуферируемую отображаемую область сбой

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

+0

У вас есть 0x15000000, нанесенный на два разных места? Как вам это удалось? –

+0

@ dwelch: Я предполагаю, что левая сторона - это физические адреса. – unixsmurf

+0

Как вы знаете, что запись не происходит до сброса кеша? Я собираюсь взять удар в темноте, но вы пишете до '0x95000000', но читаете с' 0x15000000' (у которого могут быть устаревшие данные в кеше)? – tangrs

ответ

1

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

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

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

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

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

+0

Спасибо за объяснение, не могли бы вы дать мне более подробную информацию о том, как сделать изменения? Благодарю. –

Смежные вопросы