Определение точного размера элементам данных

Предыдущая  Содержание  Следующая V*D*V

Иногда код ядра требует элементов данных определённого размера, может быть, чтобы соответствовать предопределённым бинарным структурам (* Это происходит при чтении таблицы разделов, когда запускается бинарный файл, либо при декодировании сетевого пакет.), для общения с пользовательским пространством, или выравнивания данных в структурах включением "добивочных" полей (отсылаем к разделу "Выравнивание данных" для получения информации о вопросах согласований).

 

Когда вам необходимо знать размер ваших данных, ядро предлагает для использования следующие типы данных. Все типы объявлены в <asm/types.h>, который, в свою очередь, подключается через <linux/types.h>:

 

u8;  /* беззнаковый байт byte (8 бит) */

u16; /* беззнаковое слово (16 бит) */

u32; /* беззнаковая 32-х битовая переменная */

u64; /* беззнаковая 64-х битовая переменная */

 

Существуют соответствующие знаковые типы, но они требуются редко; если они вам необходимы, просто заменить в имени u на s.

 

Если программе пространства пользователя необходимо использовать эти типы, она может прибавить префикс к именам с двойным подчеркиванием: __u8 и другие типы определяются независимо от __KERNEL__. Если, например, драйверу необходимо обменяться бинарными структурами с программой, работающей в пользовательском пространстве посредством ioctl, файлы заголовков должны объявить 32-х разрядные поля в структурах как __u32.

 

Важно помнить, что эти типы специфичны для Linux, и их использование препятствует переносимости программ на другие виды Unix. Системы с последними компиляторами поддерживают типы стандарта C99, такие как uint8_t и uint32_t; если переносимость вызывает обеспокоенность, вместо разнообразных специфичных для Linux могут быть использованы эти типы.

 

Можно также отметить, что иногда ядро использует обычные типы, такие, как unsigned int, для элементов, размерность которых зависит от архитектуры. Это обычно сделано для обратной совместимости. Когда в версии 1.1.67 были введены u32 и друзья, разработчики не могли изменить существующие структуры данных в соответствие с новыми типами, потому что компилятор выдаёт предупреждение, когда есть несоответствие между типом поля структуры и присваиваемой ему переменной (* На самом деле, компилятор сигнализирует о несоответствии типа, даже если два типа просто разные названия одного и того же объекта, такие как unsigned long и u32 на ПК.). Линус не ожидал, что операционная система (ОС), которую он написал для собственного пользования, станет мультиплатформенной; как следствие, старые структуры иногда типизированы небрежно.

Предыдущая  Содержание  Следующая