Разработка ядра Linux
Шрифт:
Стандарт языка С явно указывает, что размер памяти, которую занимают переменные стандартных типов данных, зависит от аппаратной реализации [93] , при этом также определяется минимально возможный размер типа. Неопределенность размеров стандартных типов языка С для различных аппаратных платформ имеет свои положительные и отрицательные стороны. К плюсам можно отнести то, что для стандартных типов языка С можно пользоваться преимуществами, связанными с размером машинного слова, а также отсутствие необходимости явного указания размера. Для ОС Linux размер типа
93
За исключением размера типа
94
На самом деле, для 64-разрядных аппаратных платформ, которые поддерживаются ОС Linux, размеры типов
Ситуация еще более запутывается тем, что одни и те же типы данных в пространстве пользователя и в пространстве ядра не обязательно должны соответствовать друг другу. Аппаратная платформа sparc64 предоставляет 32-разрядное пространство пользователя, а поэтому указатели, типы
Всегда необходимо помнить о следующем.
• Как и требует стандарт языка С, размер типа
• Нет никакой гарантии, что размер типа
• То же касается и типа
• Никогда нельзя надеяться, что тип
• Так как размер типа
• Точно так же нельзя предполагать, что размер типа
Скрытые типы данных
Скрытые (opaque) типы данных — это те типы, для которых не раскрывается их внутренняя структура, или формат. Они похожи на черный ящик, насколько это можно реализовать в языке программирования С. В этом языке программирования нет какой-либо особенной поддержки для этих типов. Вместо этого, разработчики определяют новый тип данных через оператор
Еще один пример скрытого типа данных — это тип
Другие примеры скрытых типов данных в ядре — это
• Нельзя предполагать, что данные скрытого типа имеют некоторый определенный размер в памяти.
• Нельзя преобразовывать скрытый тип обратно в стандартный тип данных.
Разрабатывать код необходимо с учетом того, что размер и внутреннее представление скрытого типа данных могут изменяться.
Специальные типы данных
Некоторые данные в ядре, кроме того, что представляются с помощью скрытых типов, требуют еще и специальных типов данных. Два примера — счетчик импульсов системного таймера
При хранении и использовании специфических данных всегда необходимо обращать особенное внимание на тот тип данных, который представляет эти данные, и использовать именно его. Часто встречающейся ошибкой является использование другого типа, например типа
Типы с явным указанием размера
Часто при программировании необходимы типы данных заданного размера. Обычно это необходимо для удовлетворения некоторых внешних требований, связанных с аппаратным обеспечением, сетью или бинарной совместимостью. Например, звуковой адаптер может иметь 32-разрядный регистр, пакет сетевого протокола — 16-разрядное поле данных, а исполняемый файл — 8 битовый идентификатор cookie. В этих случаях тип, который представляет данные, должен иметь точно заданный размер.
В ядре типы данных явно заданного размера определены в файле
Таблица 19.2. Типы данных явно заданного размера
Тип | Описание |
---|---|
s8 | байт со знаком |
u8 | байт без знака |
s16 | 16-разрядное целое число со знаком |
u16 | 16-разрядное целое число без знака |
s32 | 32-разрядное целое число со знаком |
u32 | 32-разрядное целое число без знака |
s64 | 64-разрядное целое число со знаком |
u64 | 64-разрядное целое число без знака |
Варианты со знаком используются редко.
Эти типы данных, с явно заданным размером, просто определены с помощью оператора