Эти макросы выполняют преобразование одного порядка байтов в другой. В случае когда порядки байтов, между которыми выполняется преобразование, одинаковы (например, если выполняется преобразование в обратный порядку байтов и процессор тоже использует такой же порядок), то эти макросы не делают ничего. В противном случае возвращается преобразованное значение.
Никогда нельзя привязываться к какой-либо конкретной частоте генерации прерывания системного таймера и, соответственно, к тому, сколько раз в секунду изменяется переменная 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
определена в файле . Об этом подробно рассказано в главе 10, "Таймеры и управление временем".
При работе со страницами памяти никогда нельзя привязываться к конкретному размеру страницы. Программисты, которые разрабатывают для аппаратной платформы x86, часто делают ошибку, считая, что размер страницы всегда равен 4 Кбайта. Хотя это справедливо для платформы x86, для других аппаратных платформ размер станицы может быть другим. Некоторые аппаратные платформы поддерживают несколько размеров страниц! В табл. 19.1 приведен список размеров страниц памяти для всех поддерживаемых аппаратных платформ.
Таблица 19.4. Размеры страниц памяти для разных аппаратных платформ
Аппаратная платформа |
Значение PAGE_SHIFT |
Значение PAGE_SIZE |
alpha |
13 |
8 Кбайт |
arm |
12, 14, 15 |
4 Кбайт, 16 Кбайт, 32 Кбайт |
cris |
13 |
8 Кбайт |
h8300 |
12 |
4 Кбайт |
i386 |
12 |
4 Кбайт |
ia64 |
12, 13, 14, 16 |
4 Кбайт, 8 Кбайт, 32 Кбайт, 64 Кбайт |
m68k |
12, 13 |
4 Кбайт, 8 Кбайт |
m86knommu |
12 |
4 Кбайт |
mips |
12 |
4 Кбайт |
mips64 |
12 |
4 Кбайт |
parisc |
12 |
4 Кбайт |
ppc |
12 |
4 Кбайт |
ppc64 |
12 |
4 Кбайт |
s390 |
12 |
4 Кбайт |
sh |
12 |
4 Кбайт |
spare |
12,13 |
4 Кбайт, 8 Кбайт |
sparc64 |
13 |
8 Кбайт |
v850 |
12 |
4 Кбайт |
x86_64 |
12 |
4 Кбайт |
При работе со страницами памяти необходимо использовать константу PAGE_SIZE
, которая содержит размер страницы памяти в байтах.
Значение макроса PAGE_SHIFT
— это количество битов, на которое необходимо сдвинуть влево значение адреса, чтобы получить номер соответствующей страницы памяти. Например, для аппаратной платформы x86, для которой размер страницы равен 4 Кбайт, макрос PAGE_SIZE
равен 4096, а макрос PAGE_SHIFT
— 12. Эти значения содержатся в заголовочном файле .
Порядок выполнения операций процессором
Вспомните из материала главы 9, "Средства синхронизации в ядре", что для различных аппаратных платформ процессоры в разной степени изменяют порядок выполнения программных инструкций. Для некоторых процессоров порядок выполнения операций строго соблюдается, запись данных в память и считывание данных из памяти выполняются в строго указанном в программе порядке. Другие процессоры имеют ослабленные требования к порядку выполнения операций считывания и записи данных и могут изменять порядок выполнения этих операций с целью оптимизации.
Если код зависит от порядка выполнения операций чтения-записи данных, то необходимо гарантировать, что даже процессор с самыми слабыми ограничениями на порядок выполнения чтения-записи будет выполнять эти операции в правильном порядке. Это делается с помощью соответствующих барьеров, таких как rmb()
и wmb()
. Более подробная информация приведена в главе 9, "Средства синхронизации в ядре".
Читать дальше