Роберт Лав - Разработка ядра Linux
- Название:Разработка ядра Linux
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс
- Год:2006
- Город:Москва
- ISBN:5-8459-1085-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Роберт Лав - Разработка ядра Linux краткое содержание
В книге детально рассмотрены основные подсистемы и функции ядер Linux серии 2.6, включая особенности построения, реализации и соответствующие программны интерфейсы. Рассмотренные вопросы включают: планирование выполнения процессов, управление временем и таймеры ядра, интерфейс системных вызовов, особенности адресации и управления памятью, страничный кэш, подсистему VFS, механизмы синхронизации, проблемы переносимости и особенности отладки. Автор книги является разработчиком основных подсистем ядра Linux. Ядро рассматривается как с теоретической, так и с прикладной точек зрения, что может привлечь читателей различными интересами и потребностями.
Книга может быть рекомендована как начинающим, так и опытным разработчикам программного обеспечения, а также в качестве дополнительных учебных материалов.
Разработка ядра Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Порядок байтов в ядре
Для каждой аппаратной платформы, которая поддерживается ядром Linux, в файле определена одна из двух констант __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
определена в файле . Об этом подробно рассказано в главе 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, "Средства синхронизации в ядре".
Многопроцессорность, преемптивность и верхняя память
Может показаться неправильным включать поддержку симметричной многопроцессорности, возможность вытеснения процессов в режиме ядра и работу с верхней памятью в вопросы переносимости. В конце концов, это не особенности аппаратной платформы, которые влияют на операционную систему, а функции ядра Linux, которые по многом не зависят от аппаратной платформы. Тем не менее для этих функций существуют важные конфигурационные параметры, которые необходимо учитывать при разработке кода. Программировать всегда необходимо под SMP, с поддержкой преемптивности и с использованием верхней памяти, чтобы код был безопасным всегда, при любых конфигурациях. Необходимо всегда соблюдать следующие правила.
• Всегда необходимо учитывать, что код может выполняться на SMP-системе и использовать соответствующие блокировки.
• Всегда необходимо учитывать, что код может выполняться при включенной преемптивности ядра, поэтому необходимо всегда использовать необходимые блокировки и операции для управления преемптивностью.
Читать дальшеИнтервал:
Закладка: