Книга: Разработка ядра Linux
Внутреннее представление переменной jiffies
Внутреннее представление переменной jiffies
Переменная jiffies
исторически всегда представлялась с помощью типа unsigned long
и, следовательно, имеет длину 32 бит для 32-разрядных аппаратных платформ и 64 бит для 64-разрядных. В случае 32-разрядного значения переменной jiffies
и частоты появления временных отметок 100 раз в секунду, переполнение этой переменной будет происходить примерно каждые 497 дней, что является вполне возможным событием. Увеличение значения параметра HZ
до 1000 уменьшает период переполнения до 49.7 дней! В случае 64-разрядного типа переменной jiffies
, переполнение этой переменной невозможно за время существования чего-либо при любых возможных значениях параметра HZ
для любой аппаратной платформы.
Из соображений производительности и по историческим причинам — в основном, для совместимости с уже существующим кодом ядра — разработчики ядра предпочли оставить тип переменной jiffies
— unsigned long
. Для решения проблемы пришлось немного подумать и применить возможности компоновщика.
Как уже говорилось, переменная jiffies
определяется в следующем виде и имеет тип unsigned long
.
extern unsigned long volatile jiffies;
Вторая переменная определяется в файле <linux/jiffies.h>
в следующем виде.
extern u64 jiffies_64;
Директивы компоновщика ld(1)
, которые используются для сборки главного образа ядра (для аппаратной платформы x86 описаны в файле arch/i386/kernel/vmlinux.lds.S
), указывают компоновщику, что переменную jiffies
необходимо совместить с началом переменной jiffies_64
.
jiffies = jiffies_64;
Следовательно, переменная jiffies
— это просто 32 младших разряда полной 64-разрядной переменной jiffies_64
. Так как в большинстве случаев переменная jiffies
используется для измерения промежутков времени, то для большей части кода существенными являются только младшие 32 бит.
В случае применения 64-разрядного значения, переполнение не может возникнуть за время существования чего-либо. В следующем разделе будут рассмотрены проблемы, связанные с переполнением (хотя переполнение счетчика импульсов системного таймера и не желательно, но это вполне нормальное и ожидаемое событие). Код, который используется для управления ходом времени, использует все 64 бит, и это предотвращает возможность переполнения 64-разрядного значения. На рис. 10.1 показана структура переменных jiffies
и jiffies_64
.
Рис. 10.1. Структура переменных jiffies
и jiffies_64
Код, который использует переменную jiffies
, просто получает доступ к тридцати двум младшим битам переменной jiffies_64
. Функция get_jiffies_64()
может быть использована для получения полного 64-разрядного значения[57]. Такая необходимость возникает редко, следовательно большая часть кода просто продолжает считывать младшие 32 разряда непосредственно из переменной jiffies
.
На 64-разрядных аппаратных платформах переменные jiffies_64
и jiffies
просто совпадают. Код может либо непосредственно считывать значение переменной jiffies
, либо использовать функцию get_jiffies_64()
, так как оба этих способа позволяют получить аналогичный эффект.
- Переменная jiffies
- Представление «TINY»
- Представление
- Использование переменной окружения ISC_PATH
- Внутреннее устройство системы и обеспечение её целостности
- 4.2. Формализованное представление угроз ИБ от персонала
- 5 Текстовое представление данных: ясные протоколы лежат в основе хорошей практики
- Представление дискуссионной группы по управлению проектами
- ГЛАВА 4. ВНУТРЕННЕЕ ПРЕДСТАВЛЕНИЕ ФАЙЛОВ
- Объявление переменной на внутреннем уровне
- Представление метаданных компоновочного блока
- 9.5.1. Представление графов