2016-09-20 14 views
2

Как я могу регистрировать неравномерные обращения к памяти на Linux/aarch64 (Cortex-a57)?Регистрация и отладка несвязанных доступов на Linux/aarch64

Я понимаю, что есть две разные вещи, связанные здесь:.

  1. Выбор, чтобы вызвать прерывание от центрального процессора на выровненным доступа (т.е. прерывания для выровненным доступа к памяти, которые могли бы быть поддержаны процессору в снижение производительности)
  2. Выбор, как обрабатывать эти прерывания в Linux (зарегистрировать их/огонь SIGBUS/мягкий эмулировать невыровненное доступа)

Моя проблема заключается в том, что во-первых, я не знаю, как управлять регистров управления ЦП из моя программа (и если я должен действительно сделать это в своем приложении для пользовательского пространства), а во-вторых, интерфейс /proc/cpu/alignment для управления неустановленными доступом в Linux, кажется, пропал (я использую ядро ​​4.4.0), см. ссылку ниже.

Управления невыровненных доступов из ядра: https://www.kernel.org/doc/Documentation/arm/mem_alignment (вероятно, устарелый)

Связанные: Does AArch64 support unaligned access?

ответ

1

Вы не можете это сделать. В любом случае, не с Linux.

Ошибки выравнивания для EL0 регулируются бит SCTLR_EL1.A, но это также влияет на EL1. Таким образом, даже если вы написали модуль хакерского ядра для его включения (вы, очевидно, не можете прикасаться к привилегированным регистрам системного управления непосредственно из пользовательского пространства), вы в значительной степени гарантируете, что ядро ​​начнет паниковать, как только поступит следующий сетевой пакет. Порт ядра arm64 полагается на на наличие возможности выравнивания доступа, предоставляемой AArch64. У него нет обработчика /proc/cpu/alignment порта ARM, поскольку он не имеет наследства от процессоров pre-ARMv6, которые вообще не поддерживают неприсоединенный доступ (ну, по крайней мере, в любом удобном для использования режиме).

Что вы можете сделать, однако, использовать perf tools для мониторинга любых или всех Cortex-A57-х microarchitectural PMU events 0x68, 0x69 или 0x6a, подсчитывать события выровненным-доступа, связанные с триггерами, которые ваша программа. Нет никаких средств для ловушки или отладки отдельных доступов, поскольку может быть с тупым инструментом ошибок выравнивания, но в противном случае это, возможно, более полезно, так как это будет только подсчет событий, относящихся к вашей программе.

+0

Таким образом, ядро ​​не может установить другую обработку ошибок выравнивания для себя и для пользовательского пространства? Как вы упомянули, профилирование - это путь сюда; Мне было интересно, если понадобится более строгая проверка памяти (если это имеет смысл) –