Я выполняю ряд действий, чтобы убедиться, что Redis хорошо работает в комплекте встроенных систем, в том числе с малиной PI. Чтобы исправить определенные пути кода Redis, где выполняются нерациональные обращения к памяти (из-за изменения, внесенного в Redis 3.2), я пытаюсь заставить PI либо регистрировать сообщение на неуправляемых обращениях к памяти, либо посылать сигнал процессу, когда Бывает. Таким образом, я могу убедиться, что Redis будет работать хорошо, если неприглаженные обращения являются нарушением, и что он будет работать быстрее на платформах, где вместо этого такие обращения могут выполняться, но медленнее. ARM v6, он используется в PI v1, по-видимому, в состоянии иметь дело с выровненным доступа к памяти, поэтому, если я использую следующую команду, чтобы настроить Linux, чтобы отправить сигнал в процессе выполнения невыровненное доступа:Unaligned accesses не обнаружены Raspberry PI версии 1
echo 4 > /proc/cpu/alignment
И затем выполнить следующую программу:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char **argv) {
char *buf = "foobareklsjdfklsjdfslkjfskdljfskdfjdslkjfdslkjfsd";
uint32_t *l = (uint32_t*) (buf+1);
printf("%p\n", l);
printf("%d\n", (int)*l);
return 0;
}
Я не могу увидеть любой сигнал, полученный с помощью процесса, или счетчиков на /proc/cpu/alignment
инкрементирования.
Мое предположение заключается в том, что это связано с тем, что ARM v6 автоматически справляется с несогласованными адресами, если установлен заданный флаг конфигурации ЦП. Мой вопрос в том, правильно ли моя гипотеза? И если это так, то как заставить PI-версию 1 на самом деле создать исключение в случае неприсоединения доступа, чтобы ядро Linux могло его захватить и отправить сигнал, зарегистрировать доступ и т. Д. Согласно/proc/cpu/alignment настройки?
EDIT: Следует отметить, что не все инструкции могут выполнять неравномерные обращения даже в ARM v6. Например, STMDB, STMFD, LDMDB, LDMEA и аналогичные инструкции с несколькими словами действительно вызовут исключение и будут захвачены ядром Linux.
ARMv4 и v5 также допускаются для неравномерных доступов, некоторые рычаги управления по умолчанию включены другими, а в любом случае вы можете включить или отключить его. Более старшее поведение ядра для неприсоединения доступа было другим/странным для того, что можно было бы ожидать, оно вращало байты вокруг слова, а не погружалось бы в следующий адрес. Это имеет смысл, так как вы получаете правый байт на нулевой байт-полосе для доступа к байтам (или полуслову), более чем один способ скинуть этот кот. –
Обратите внимание, что вы можете получить x86 для ловушки при неправильном доступе в Linux, если вы просто хотите найти несовместимые обращения вообще в программном обеспечении, а не специально для ARM. – EOF
EOF да, я обнаружил, что если вы имеете в виду регистр AC. Однако я не нашел надежного способа обмануть его в своей программе, если не с помощью команды gdb set. – antirez