Разработка ядра Linux (Второе издание)
Шрифт:
Обратите внимание на то, что для аппаратной платформы с обратным порядком байтов самый старший байт записывается в самый минимальный адрес памяти.
И наконец, еще один пример — фрагмент кода, который позволяет определить порядок байтов для той аппаратной платформы, на которой он выполняется.
Этот пример работает как в ядре, так и в пространстве пользователя.
История терминов big-endian и little-endian
Термины big-endian и little-endian заимствованы из сатирического романа Джонатана Свифта "Путешествие Гулливера", который был
Аналогия между дебатами лилипутов и спорами о том, какой порядок байтов лучше, говорит о том, что это вопрос больше политический, чем технический.
Порядок байтов в ядре
Для каждой аппаратной платформы, которая поддерживается ядром Linux, в файле
В этот заголовочный файл также включаются макросы из каталога
Эти макросы выполняют преобразование одного порядка байтов в другой. В случае когда порядки байтов, между которыми выполняется преобразование, одинаковы (например, если выполняется преобразование в обратный порядку байтов и процессор тоже использует такой же порядок), то эти макросы не делают ничего. В противном случае возвращается преобразованное значение.
Таймер
Никогда нельзя привязываться к какой-либо конкретной частоте генерации прерывания системного таймера и, соответственно, к тому, сколько раз в секунду изменяется переменная
Например, константа
Никогда нельзя сравнивать значение переменной
Константа
Размер
страницы памятиПри работе со страницами памяти никогда нельзя привязываться к конкретному размеру страницы. Программисты, которые разрабатывают для аппаратной платформы 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 Кбайт |
При работе со страницами памяти необходимо использовать константу
Значение макроса
Порядок выполнения операций процессором
Вспомните из материала главы 9, "Средства синхронизации в ядре", что для различных аппаратных платформ процессоры в разной степени изменяют порядок выполнения программных инструкций. Для некоторых процессоров порядок выполнения операций строго соблюдается, запись данных в память и считывание данных из памяти выполняются в строго указанном в программе порядке. Другие процессоры имеют ослабленные требования к порядку выполнения операций считывания и записи данных и могут изменять порядок выполнения этих операций с целью оптимизации.