Вход/Регистрация
Разработка ядра Linux
вернуться

Лав Роберт

Шрифт:

Обратите внимание на то, что для аппаратной платформы с обратным порядком байтов самый старший байт записывается в самый минимальный адрес памяти.

И наконец, еще один пример — фрагмент кода, который позволяет определить порядок байтов для той аппаратной платформы, на которой он выполняется.

int x = 1;

if (*(char*)&x == 1)

 /* прямой порядок */

else

 /* обратный порядок */

Этот пример работает как в ядре, так и в пространстве пользователя.

История терминов big-endian и little-endian

Термины big-endian и little-endian заимствованы из сатирического романа Джонатана Свифта "Путешествие Гулливера", который был издан в 1726 году. В этом романс наиболее важной политической проблемой народа лилипутов была проблема, с какого конца следует разбивать яйцо: с тупого (big) или острого (little). Тех, кто предпочитал тупой конец называли "тупоконечниками" (big-endian), тех же, кто предпочитал острый конец, называли "остроконечниками" (little-endian).

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

Порядок байтов в ядре

Для каждой аппаратной платформы, которая поддерживается ядром Linux, в файле

<asm/byteorder.h>
определена одна из двух констант
__BIG_ENDIAN
или
__LITTLE_ENDIAN
, в соответствии с используемым порядком байтов.

В этот заголовочный файл также включаются макросы из каталога

include/linux/byteorder/
, которые помогают конвертировать один порядок байтов в другой. Ниже показаны наиболее часто используемые макросы.

u32 __cpu_to_be32(u32); /* преобразовать порядок байтов текущего

процессора в порядок big-endian */

u32 __cpu_to_le32(u32); /* преобразовать порядок байтов текущего

процессора в порядок little-endian */

u32 __be32_to_cpu(u32); /* преобразовать порядок байтов big-endian в

порядок байтов текущего процессора */

u32 __lе32_to_cpu(u32); /* преобразовать порядок байтов little-endian

в порядок байтов текущего процессора */

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

Таймер

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

jiffies
. Всегда необходимо использовать константу
HZ
, чтобы корректно определять интервалы времени. Это очень важно, потому что значение частоты системного таймера может отличаться не только для разных аппаратных платформ, но и для одной аппаратной платформы при использовании разных версий ядра.

Например, константа

HZ
для аппаратной платформы x86 сейчас равна 1000. Это значит, что прерывание таймера возникает 1000 раз в секунду, или каждую миллисекунду. Однако до серии ядер 2.6 для аппаратной платформы x86 значение константы
HZ
было равно 100. Для разных аппаратных платформ эти значения отличаются: для аппаратной платформы alpha константа
HZ
равна 1024, а для платформы ARM — 100.

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

jiffies
с числом, таким как 1000, и думать, что это всегда будет означать одно и то же. Для получения интервалов времени необходимо всегда умножать или делить на константу
HZ
, как в следующем примере.

HZ /* одна секунда */

(2*HZ) /* две секунды */

(HZ/2) /* полсекунды */

(HZ/100) /* 10 мс */

(2*HZ/100) /* 20 мс */

Константа

HZ
определена в файле
<asm/param.h>
. Об этом подробно рассказано в главе 10, "Таймеры и управление временем".

Размер страницы памяти

При работе со страницами памяти никогда нельзя привязываться к конкретному размеру страницы. Программисты, которые разрабатывают для аппаратной платформы x86, часто делают ошибку, считая, что размер страницы всегда равен 4 Кбайта. Хотя это справедливо для платформы x86, для других аппаратных платформ размер станицы может быть другим. Некоторые аппаратные платформы поддерживают несколько размеров страниц! В табл. 19.1 приведен список размеров страниц памяти для всех поддерживаемых аппаратных платформ.

  • Читать дальше
  • 1
  • ...
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: