2013-10-14 6 views
2

Я играю с адресами памяти на 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 и что оптимально. Мои мысли и вопросы повсюду, но я попытаюсь сформулировать некоторые конкретные пункты:

  1. ли процессор имеет выравнивание проверки на по умолчанию, но ядро ​​обнаруживает, что от поддерживается и инструктирует его не проверять?
  2. Как ядро, по крайней мере, я испытал это на другом HW, может получить упс из-за того, что какой-то драйвер пытается получить доступ к неизмененной памяти: выполняется ли ядро ​​в выравнивание проверки -mode? Или это возможно только определенные части кода?
  3. Поскольку доступ к нерациональной памяти требует больше ресурсов; рекомендуется ли проверять выравнивание, например, на сборочной линии, на этапе тестирования программного обеспечения? Будет ли это также сделать его более портативным?

У меня есть много вопросов по этому поводу, но оставьте это на этом пока.

+1

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

+2

Работа с памятью ... Чипы Intel (CISC) могут управлять нестандартными записями - со скоростью, я считаю. Обычно чипы RISC (SPARC, в частности, я считаю, и другие) генерируют ошибку шины при запросе на доступ к несогласованным данным (2-байтовое количество на нечетном адресе памяти, 4-байтовое количество по адресу, которое не кратно 4 байта) и т. Д. Некоторые чипы (DEC Alpha) генерируют ловушку ядра и имеют дело с несогласованным доступом в ядре - это ужасно медленно. Была команда 'uam', чтобы контролировать, были ли программы разбиты на неприсоединенный доступ к памяти или ловушку ядра. –

+0

Для вашего первого вопроса, я не думаю, что есть режим включения/выключения, это больше похоже на то, сможет ли ОС или компилятор справиться с программным обеспечением в проблемах, вызванных неприглаженным доступом к памяти. Если это можно обработать, я не вижу причин, по которым он был бы отключен для некоторого кода и не включен для некоторых других. Надеюсь, что вы найдете следующие две ссылки полезными: http://msdn.microsoft.com/en-us/library/aa290049%28v=vs.71%29.aspx http://lwn.net/Articles/ 260832/ – AquaAsh

ответ

2

Просто попробуйте дать частичный ответ.

ли процессор выравнивание проверки по умолчанию, но ядро ​​ обнаруживает, что от поддерживается и инструктирует его не проверить?

Это зависит от арки и даже от той же арки, что может случиться, что некоторые инструкции по неизмененной памяти могут обрабатываться HW, в то время как другие не могут.

В ядре, по крайней мере, я испытал это на другом HW, может получить Упс из-за какой-то драйвер пытается получить доступ к невыровненной памяти: делает ядра работать в выравнивающей проверке режиме? Или это возможно только определенные части кода, которые делают?

Несвязанный доступ к памяти, не поддерживаемый HW, приведет к тому, что ловушка и ядро ​​имеют обработчик для trap/exception. Я работаю над ppc, и такое исключение будет обрабатываться на основе инструкции (полученной с ПК); некоторые инструкции позаботятся, и программа возобновится; некоторые другие могут привести к завершению работы программы, поскольку ядро ​​не может ее обработать. Одним из таких примеров является команда stwcx, которая используется для реализации логики сравнения и замены.

Поскольку доступ к нерациональной памяти требует дополнительных ресурсов; это хорошая идея, чтобы включить проверку выравнивания, как, например, на примере сборки , в тестовой фазе для программного обеспечения? Будет ли это также сделать более портативным?

На практике это может быть не очень хорошо, если у вас много старого кода в большом проекте ..... но это должно быть хорошо для нового кода.

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