Операция записи в регистр блокировки ARM приводит к сбою устройства - PullRequest
2 голосов
/ 01 марта 2011

Я провожу некоторые эксперименты с устройством ARM Cortex A-8, работающим под ядром Linux.

Я могу получить доступ и прочитать значение регистра блокировки кэша L2 без проблем:

asm volatile ("mrc p15, 1,% 0, c9, c0, 0": "= r" (i));

Когда я пытаюсь записать значение обратно, устройство сразу вылетает:

asm volatile ("mcr p15, 1,% 0, c9, c0, 0":: "r" (i));

Код работает как модуль ядра, поэтому проблем с разрешениями нет.

Интересно, не пропустил ли я что-то особенное перед записью этого значения регистра?

1 Ответ

3 голосов
/ 01 марта 2011

Существует длинный контрольный список, с которым нужно быть осторожным, если вы собираетесь играть с блокировкой кэша.Информационный центр ARM предлагает несколько советов: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344i/Chdeghcb.html

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

В худшем случае вы в конечном итоге заклините внутренний конечный автоматконтроллера кэш-памяти L2, блокируя неправильные данные, предотвращая кеширование данных в целом и вызывая прерывание всего или отключение тегов.Это объяснит крах.

Кроме того, это всего лишь эксперимент или вы пытаетесь повысить производительность?Это полезно для избежания прикосновения к DRAM / шине для хорошо созданных последовательностей кода, например, если вы хотите отключить его (глубокий сон), но обычно это не выигрыш в производительности.

...