Разработка ядра Linux - [183]

Шрифт
Интервал

, насколько это можно реализовать в языке программирования С. В этом языке программирования нет какой-либо особенной поддержки для этих типов. Вместо этого, разработчики определяют новый тип данных через оператор >typedef, называют его скрытым и надеются на то, что никто не будет преобразовывать этот тип в стандартный тип данных языка С. Любые использования данных этих типов возможны только через специальные интерфейсы, которые также создаются разработчиком. Примером может быть тип данных >pid_t, в котором хранится информация об идентификаторе процесса. Размер этого типа данных не раскрывается, хотя каждый может смошенничать, использовать размер по максимуму и работать с этим типом, как с типом int. Если нигде явно не используется размер скрытого типа данных, то размер этого типа может быть изменен, и это не вызовет никаких проблем. На самом деле так уже однажды случилось: в старых Unix-подобных операционных системах тип >pid_t был определен как >short.

Еще один пример скрытого типа данных — это тип >atomic_t. Как уже обсуждалось в главе 9, "Средства синхронизации в ядре", этот тип содержит данные целочисленного типа, с которыми можно выполнять атомарные операции. Хотя этот тип и соответствует типу int, использование скрытого типа данных позволяет гарантировать, что данные этого типа будут использоваться только в специальных функциях, которые выполняют атомарные операции. Скрытые типы позволяют скрыть размер типа данных, который не всегда равен полным 32 разрядам, как в случае платформы SPARC.

Другие примеры скрытых типов данных в ядре — это >dev_t, >gid_t и >uid_t. При работе со скрытыми типами данных необходимо помнить о следующем.

• Нельзя предполагать, что данные скрытого типа имеют некоторый определенный размер в памяти.

• Нельзя преобразовывать скрытый тип обратно в стандартный тип данных.

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

Специальные типы данных

Некоторые данные в ядре, кроме того, что представляются с помощью скрытых типов, требуют еще и специальных типов данных. Два примера — счетчик импульсов системного таймера >jiffies и параметр >flags, используемый для обработки прерываний. Для хранения этих данных всегда должен использоваться тип >unsigned long.

При хранении и использовании специфических данных всегда необходимо обращать особенное внимание на тот тип данных, который представляет эти данные, и использовать именно его. Часто встречающейся ошибкой является использование другого типа, например типа >unsigned int. Хотя для 32-разрядных аппаратных платформ это не приведет к проблемам, на 64-разрядных системах возникнут проблемы.

Типы с явным указанием размера

Часто при программировании необходимы типы данных заданного размера. Обычно это необходимо для удовлетворения некоторых внешних требований, связанных с аппаратным обеспечением, сетью или бинарной совместимостью. Например, звуковой адаптер может иметь 32-разрядный регистр, пакет сетевого протокола — 16-разрядное поле данных, а исполняемый файл — 8 битовый идентификатор cookie. В этих случаях тип, который представляет данные, должен иметь точно заданный размер.

В ядре типы данных явно заданного размера определены в файле >, который включается из файла >. В табл. 19.2 приведен полный список таких типов данных.


Таблица 19.2. Типы данных явно заданного размера

ТипОписание
>s8байт со знаком
>u8байт без знака
>s1616-разрядное целое число со знаком
>u1616-разрядное целое число без знака
>s3232-разрядное целое число со знаком
>u3232-разрядное целое число без знака
>s6464-разрядное целое число со знаком
>u6464-разрядное целое число без знака

Варианты со знаком используются редко.

Эти типы данных, с явно заданным размером, просто определены с помощью оператора >typedef через стандартные типы данных языка С. Для 64-разрядной машины они могут быть определены следующим образом.

>typedef signed char s8;

>typedef unsigned char u8;

>typedef signed short s16;

>typedef unsigned short u16;

>typedef signed int s32;

>typedef unsigned int u32;

>typedef signed long s64;

>typedef unsigned long u64;

Для 32-разрядной машины их можно определить, как показано ниже.

>typedef signed char s8;

>typedef unsigned char u8;

>typedef signed short s16;

>typedef unsigned short u16;

>typedef signed int s32;

>typedef unsigned int u32;

>typedef signed long long s64;

>typedef unsigned long long u64;

Знак типа данных >char

В стандарте языка С сказано, что тип данных >char может быть со знаком или без знака. Ответственность за определение того, какой вариант типа данных >char использовать по умолчанию, лежит на компиляторе, препроцессоре или на обоих.

Для большинства аппаратных платформ тип >char является знаковым, а диапазон значений данных этого типа от -128 до 127. Для небольшого количества аппаратных платформ, таких как ARM, тип >char по умолчанию без знака, а возможные значения данных этого типа лежат в диапазоне от 0 до 255.

Например, для систем, на которых тип >char без знака, выполнение следующего кода приведет к записи в переменную >i числа 255 вместо -1.

>char i = -1;


Рекомендуем почитать
Яйцо кукушки или Преследуя шпиона в компьютерном лабиринте

В отличие от плохого танцора, хорошему сисадмину мешают только кукушкины яйца. Их откладывают в его компьютер злобные хакеры, чтобы из них вылупились программы, делающие своего папу-кукушку суперпользователем. Но сколько кабелю не виться — а кончику быть: бравый сисадмин не дремлет и за годик-другой выводит злоумышленников на чистую воду: на этот раз хакерская тусовка круто пролетела. Такого предельно краткое содержание классической книги эксперта по компьютерной безопасности Клиффа Столла «Яйцо кукушки».


Безопасность информационных систем

В пособии излагаются основные тенденции развития организационного обеспечения безопасности информационных систем, а также подходы к анализу информационной инфраструктуры организационных систем и решению задач обеспечения безопасности компьютерных систем.Для студентов по направлению подготовки 230400 – Информационные системы и технологии (квалификация «бакалавр»).


Разработка приложений в среде Linux

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек.


FAQ по смартфону Qtek 8300/8310

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


Как перейти на Windows Vista. Начали!

Вы пользуетесь Windows ХР и стали задумываться, стоит ли спешить расстаться со ставшей столь привычной операционной системой и переходить на новую Windows Vista, о которой только и говорят? Есть ли в Windows Vista усовершенствования, достойные того, чтобы тратить время на свое обучение и немалые деньги на модернизацию компьютера? Безусловно, есть! И очень скоро большинство пользователей не смогут себе представить, как они обходились без этих возможностей ранее. Данная книга поможет вам присмотреться к новой операционной системе, освоить новые технологии и решения, примененные в Windows Vista, сравнить ее с уже привычной и хорошо изученной Windows ХР.


64 килобайта о Фидо

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