Книга: Разработка ядра Linux
Как избежать проблем с выравниванием
Как избежать проблем с выравниванием
Компилятор обычно предотвращает проблемы, связанные с выравниванием, путем естественного выравнивания всех типов данных. На самом деле, разработчики ядра обычно не должны заниматься проблемами, связанными с выравниванием, об этом должны заботиться разработчики компилятора gcc. Однако такие проблемы все же могут возникать, когда разработчику приходится выполнять операции с указателями и осуществлять доступ к данным, не учитывая того, как компилятор выполняет операции доступа к данным.
Доступ к адресу памяти, для которого выполнено выравнивание, через преобразованный указатель на тип данных большего размера может привести к проблемам выравнивания (для разных аппаратных платформ это может проявляться по-разному). Следующий код может привести к указанной проблеме.
char dog[10];
char *p = &dog[1];
unsigned long l = *(unsigned long*)p;
В этом примере указатель на данные типа unsigned char
используется, как указатель на тип unsigned long
, что может привести к тому, что 32-разрядное значение типа unsigned long
будет считываться из памяти по адресу, не кратному четырем.
Если вы думаете: "Зачем мне это может быть нужно?", то вы, скорее всего, правы. Тем не менее, если мы такое сделали только что, то такое можно сделать и кто-нибудь еще, поэтому необходимо быть внимательными. Примеры, которые встречаются в реальной жизни, не обязательно будут так же очевидны.
- 9.1. Проблема синтаксического анализа
- 500 типичных проблем и их решений при работе на ПК
- Проблемы потребителя
- 3.5 Проблемы доступа при использовании нескольких протоколов
- 5.2 Проблемы при резервном копировании
- 10.6.1. Обнажение проблемы
- Введение Вторая грамотность и проблемы ее освоения
- Глава 8 Проблемы с «железом» и разгон процессора
- Как избежать случайного нажатия клавиши Caps Lock?
- Проблема с измерениями в секторе B2B
- У меня проблемы со здоровьем. Может ли мне помочь Интернет?
- Экран ноутбука буквально за месяц покрылся царапинами. Почему так произошло и как этого избежать в дальнейшем?