Книга: Разработка ядра Linux
Размер машинного слова и типы данных
Машинное слово (word) — это количество данных, которые процессор может обработать за одну операцию. Здесь можно применить аналогию документа, состоящего из символов (character, 8 бит) и страниц (много слов). Слово— это некоторое количество битов, как правило 16, 32 или 64. Когда говорят о "n-битовой" машине, то чаще всего имеют в виду размер машинного слова. Например, когда говорят, что процессор Intel Pentium — это 32-разрядный процессор, то обычно имеют в виду размер машинного слова, равный 32 бит, или 4 байт.
Размер процессорных регистров общего назначения равен размеру машинного слова этого процессора. Обычно разрядность остальных компонентов этой же аппаратной платформы в точности равна размеру машинного слова. Кроме того, по крайней мере для аппаратных платформ, которые поддерживаются ОС Linux, размер адресного пространства соответствует размеру машинного слова[92]. Следовательно, размер указателя равен размеру машинного слова. В дополнение к этому, размер типа long
языка С также равен размеру машинного слова. Например, для аппаратной платформы Alpha размер машинного слова равен 64 бит. Следовательно, регистры, указатели и тип long
имеют размер 64 бит. Тип int
для этой платформы имеет размер 32 бит. Машины платформы Alpha могут обработать 64 бит — одно слово с помощью одной операции.
Слова, двойные слова и путаница
Для некоторых операционных систем и процессоров стандартную порцию данных не называют машинным словом. Вместо этого, словом называется некоторая фиксированная порция данных, название которой выбрано случайным образом или имеет исторические корни. Например, в некоторых системах данные могут разбиваться на байты (byte — 8 бит), слова (word — 16 бит), двойные слова (double word — 32 бит) и четверные слова (quad word — 64 бит), несмотря на то что на самом деле система является 32-разрядной. В этой книге и вообще в контексте операционной системы Linux под машинным словом понимают стандартную порцию данных процессора, как обсуждалось ранее.
Для каждой аппаратной платформы, поддерживаемой операционной системой Linux, в файле <asm/types.h>
определяется константа BITTS_PER_LONG
, которая равна размеру типа long языка С и совпадает с размером машинного слова системы. Полный список всех поддерживаемых аппаратных платформ и их размеры машинного слова приведены в табл. 19.1.
Таблица 19.1. Поддерживаемые аппаратные платформы
Аппаратная платформа | Описание | Размер машинного слова |
---|---|---|
alpha | Digital Alpha | 64 бит |
arm | ARM и StrongARM | 32 бит |
cris | CRIS | 32 бит |
h8300 | H8/300 | 32 бит |
I386 | Intel x86 | 32 бит |
ia64 | IA-64 | 64 бит |
m68k | Motorola 68k | 32 бит |
m86knommu | m68k без устройства MMU | 32 бит |
mips | MIPS | 32 бит |
mips64 | 64-разрядная MIPS | 64 бит |
parisc | HP PA-RISC | 32 бит, или 64 бит |
ppc | PowerPC | 32 бит |
ppc64 | POWER | 64 бит |
s390 | IBM S/390 | 32 бит, или 64 бит |
sh | Hitachi SH | 32 бит |
sparс | SPARC | 32 бит |
sparc64 | UltraSPARC | 64 бит |
um | Usermode Linux | 32 бит, или 64 бит |
v850 | v850 | 32 бит |
x86_64 | X86-64 | 64 бит |
Стандарт языка С явно указывает, что размер памяти, которую занимают переменные стандартных типов данных, зависит от аппаратной реализации[93], при этом также определяется минимально возможный размер типа. Неопределенность размеров стандартных типов языка С для различных аппаратных платформ имеет свои положительные и отрицательные стороны. К плюсам можно отнести то, что для стандартных типов языка С можно пользоваться преимуществами, связанными с размером машинного слова, а также отсутствие необходимости явного указания размера. Для ОС Linux размер типа long
гарантированно равен размеру машинного слова. Это не совсем соответствует стандарту ANSI С, однако является стандартной практикой в ОС Linux. Как недостаток можно отметить, что при разработке кода нельзя рассчитывать на то, что данные определенного типа занимают в памяти определенный размер. Более того, нельзя гарантировать, что переменные типа int
занимают столько же памяти, сколько и переменные типа long
[94].
Ситуация еще более запутывается тем, что одни и те же типы данных в пространстве пользователя и в пространстве ядра не обязательно должны соответствовать друг другу. Аппаратная платформа sparc64 предоставляет 32-разрядное пространство пользователя, а поэтому указатели, типы int
и long
имеют размер 32 бит. Однако в пространстве ядра для аппаратной платформы размер типа int равен 32 бит, а размер указателей и типа long
равен 64 бит. Тем не менее такая ситуация не является обычной.
Всегда необходимо помнить о следующем.
• Как и требует стандарт языка С, размер типа char
всегда равен 8 бит (1 байт),
• Нет никакой гарантии, что размер типа int
для всех поддерживаемых аппаратных платформ будет равен 32 бит, хотя сейчас для всех платформ он равен именно этому числу.
• То же касается и типа short
, который для всех поддерживаемых аппаратных платформ сейчас равен 16 бит.
• Никогда нельзя надеяться, что тип long
или указатель имеет некоторый заданный размер. Этот размер для поддерживаемых аппаратных платформ может быть равен 32, или 64 бит.
• Так как размер типа long
разный для различных аппаратных платформ, никогда нельзя предполагать, что sizeof(int) == sizeof(long)
.
• Точно так же нельзя предполагать, что размер типа int
и размер указателя совпадают.
- Резервное копирование базы данных InterBase
- Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Резервное копирование многофайловых баз данных
- Восстановление из резервных копий многофайловых баз данных
- Владелец базы данных
- ЧАСТЬ IV. База данных и ее объекты.
- Перевод базы данных InterBase 6.x на 3-й диалект
- Ключевые слова
- Типы данных для работы с датой и временем
- Большие целые типы
- Практическая работа 53. Запуск Access. Работа с объектами базы данных
- Обзор основных причин повреждения базы данных