Эти макросы выполняют преобразование одного порядка байтов в другой. В случае когда порядки байтов, между которыми выполняется преобразование, одинаковы (например, если выполняется преобразование в обратный порядку байтов и процессор тоже использует такой же порядок), то эти макросы не делают ничего. В противном случае возвращается преобразованное значение.
Никогда нельзя привязываться к какой-либо конкретной частоте генерации прерывания системного таймера и, соответственно, к тому, сколько раз в секунду изменяется переменная 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, "Средства синхронизации в ядре".
Читать дальше