Я играю с адресами памяти на C и задаюсь вопросом об этом названии unaligned доступ к памяти.Unaligned доступ к памяти
Я в настоящее время на платформе Intel x86 с ядром Linux, но задать тему в духе аркой и OS агностицизма - хотя следующее а Linux и HW конкретны:
Когда Я читаю/пишу простой тип от/до неувязанного адреса, я не получаю никакой ошибки. Нет сообщений в журналах или что-то еще. Я также пробовал:
perf top -e alignment-faults
# And with PID
perf top -p NNN -e alignment-faults
но без хитов.
Включение alignment checking по:
__asm__("pushf\norl $0x40000,(%esp)\npopf");
дает "хотел" результат: (., Но до сих пор нет сообщений в perf
)
Bus error (core dumped)
Мой вопрос как это обрабатывается hardw + OS и что оптимально. Мои мысли и вопросы повсюду, но я попытаюсь сформулировать некоторые конкретные пункты:
- ли процессор имеет выравнивание проверки на по умолчанию, но ядро обнаруживает, что от поддерживается и инструктирует его не проверять?
- Как ядро, по крайней мере, я испытал это на другом HW, может получить упс из-за того, что какой-то драйвер пытается получить доступ к неизмененной памяти: выполняется ли ядро в выравнивание проверки -mode? Или это возможно только определенные части кода?
- Поскольку доступ к нерациональной памяти требует больше ресурсов; рекомендуется ли проверять выравнивание, например, на сборочной линии, на этапе тестирования программного обеспечения? Будет ли это также сделать его более портативным?
У меня есть много вопросов по этому поводу, но оставьте это на этом пока.
Большая причина, по которой выравнивание - это даже тема, потому что некоторые архитектуры проверяют и один/некоторые не делают. те, которые делают, могут или не могут включать/отключать. Также проверка выполняется на оборудовании, так что цикл памяти/выборки имеет ошибку. –
Работа с памятью ... Чипы Intel (CISC) могут управлять нестандартными записями - со скоростью, я считаю. Обычно чипы RISC (SPARC, в частности, я считаю, и другие) генерируют ошибку шины при запросе на доступ к несогласованным данным (2-байтовое количество на нечетном адресе памяти, 4-байтовое количество по адресу, которое не кратно 4 байта) и т. Д. Некоторые чипы (DEC Alpha) генерируют ловушку ядра и имеют дело с несогласованным доступом в ядре - это ужасно медленно. Была команда 'uam', чтобы контролировать, были ли программы разбиты на неприсоединенный доступ к памяти или ловушку ядра. –
Для вашего первого вопроса, я не думаю, что есть режим включения/выключения, это больше похоже на то, сможет ли ОС или компилятор справиться с программным обеспечением в проблемах, вызванных неприглаженным доступом к памяти. Если это можно обработать, я не вижу причин, по которым он был бы отключен для некоторого кода и не включен для некоторых других. Надеюсь, что вы найдете следующие две ссылки полезными: http://msdn.microsoft.com/en-us/library/aa290049%28v=vs.71%29.aspx http://lwn.net/Articles/ 260832/ – AquaAsh