| Адресация оперативной памяти С точки зрения процессора, оперативная
память представляет собой массив пронумерованных ячеек. Номер каждой ячейки памяти
называется ее адресом. Разрядность адреса является
одной из важнейших характеристик процессора и реализуемой им системы команд. Разрядность
важна не как самоцель, а потому, что ею обусловлен объем адресуемой памяти — адресного
пространства. Системы с 16-разрядным адресом способны адресовать 64 Кбайт
(65 536) ячеек памяти, а с 32-разрядным — 4 Гбайт (4 294 967 296) ячеек. В наше
время адресуемая память в 4 Гбайт для многих приложений считается неприемлемо
маленькой и требуется 64-разрядная адресация. Процессору обычно приходится
совершать арифметические операции над адресами, поэтому разрядность адреса у современных
процессоров обычно совпадает с разрядностью основного АЛУ. У некоторых компьютеров
адресация (нумерация) ячеек памяти фиксированная: одна и та же ячейка памяти всегда
имеет один и тот же номер. Такая адресация называется физической. Адрес при этом
разбит на битовые поля, которые непосредственно используются в качестве номера
физической микросхемы памяти, и номеров строки и столбца в этой микросхеме. Напротив,
большинство современных процессоров общего назначения используют
виртуальную адресацию, когда номер конкретной ячейки памяти определяется
не физическим размещением этой ячейки, а контекстом, в котором происходит адресация.
Способы реализации виртуальной памяти и необходимость ее применения обсуждаются
в главе 5. В старых компьютерах размер
адресуемой ячейки памяти данных совпадал с разрядностью АЛУ центрального процессора
и разрядностью шины данных. Адресуемая ячейка называлась словом.
В процессорах манчестерской архитектуры, которые могут использовать одну и ту
же память как для команд, так и для данных, оба размера определялись длиной команды.
Из-за этого многие процессоры такого типа имели странные по современным представлениям
разрядности — 48, 36, иногда даже 25 бит. БЭСМ-6
Так, БЭСМ-6 имела слово разрядностью 48 бит и команды длиной 24 бита, состоявшие
из 15-разрядного адресного поля и 9-разрядного кода операции. Адресное поле позволяло
адресовать 32К слов. В одном слове размещалось две команды, при этом команды перехода
могли указывать только на первую из упакованных в одно слово команд.
У процессоров гарвардской архитектуры (имеющих раздельные памяти для команд и
данных) разрядность АЛУ и размер команды не связаны. Microchip
PIC Микроконтроллеры семейства PIC фирмы Microchip имеют 8-разрядное
АЛУ и накристалльное ОЗУ той же разрядности [www.microchip.com PICMicro]. Команды
этих микроконтроллеров размещаются в ПЗУ (также накристалльном), в котором каждое
слово имеет 12 бит и содержит одну команду. Аналогично БЭСМ-6, команда микроконтроллера
состоит из адресного поля (которое может содержать как адрес, так и константное
значение длиной 1 байт) и кода операции. Под код операции остается всего четыре
бита, поэтому команд, имеющих полное адресное поле, может быть не более 16. Адресное
пространство микроконтроллера составляет 8 бит, т. е. всего 256 слов кода и 256
байт данных. Однако при помощи ухищрения, называемого банковой адресацией (подробнее
об этом см. в разд. Банки памяти), старшие модели семейства
PIC адресуют и по несколько килобайтов как кода, так и данных. Впрочем, для
многих целей и 256 команд вполне достаточно. Самый маленький в мире Web-сервер
[www-ccs.cs.umass.edu] реализован именно на основе PIC. В 512 слов кода удалось
упаковать реализацию полноценных подмножеств протоколов RS232 (использованная
модель микроконтроллера не имеет аппаратно реализованного последовательного порта),
РРР, TCP/IP и HTTP. Web-сервер состоит из двух микросхем — собственно сервера
и кристалла флэш-памяти, в котором хранятся экспортируемые сервером HTML-документы
и изображения. Сервер включается в последовательный порт компьютера и получает
питание от этого порта. Разработчик сервера рекламирует его как основу (или,
во всяком случае, как демонстрацию технической возможности) создания Web-интерфейсов
для разнообразного бытового оборудования. В современных
компьютерах единицей адресации является байт — ячейка
памяти размером 8 бит. При этом и АЛУ, и шина данных могут иметь большую разрядность
(хотя, конечно, эта разрядность всегда кратна байту -8, 16, 32 или 64 бита). Разрядность
АЛУ и шины данных может не совпадать: так, 18088 имел 16-разрядное АЛУ и 8-разрядную
шину, MC68000 и 180386SX — 32-разрядное АЛУ и 16-разрядную шину. Что при этом
понимается под "словом" - зависит от фантазии изготовителей процессора.
Например, у вполне 32-разрядного VAX документация называет 16-битовую структуру
словом, а 32-битовую — двойным или- длинным словом, хотя, обычно, длиной слова
считается все-таки разрядность АЛУ. При этом различные процессоры по-разному
подходят к адресации слов. Во-первых, некоторые процессоры (PDP-11, SPARC)
запрещают обращения к словам, адрес которых не кратен размеру слова, и генерируют
при попытках такого обращения исключительную ситуацию ошибки шины. Другие процессоры,
например VAX и х86 такие обращения разрешают, но в документации есть честное предупреждение,
что обращения к невыровненным словам будут минимум в два раза медленнее, чем к
выровненным (рис. 2.4).
Рис. 2.4. Выровненные и невыровненные обращения к
словам Во-вторых, есть разногласия в том, как следует адресовать
(или, как следует интерпретировать при арифметических операциях) байты одного
слова — по какому адресу находятся старшие 8 битов, а по какому — младшие? У одних
Процессоров (IBM/390, MC68000, SPARC) — старший байт располагается по меньшему
адресу (big endian), у других (VAX, x86) - по большему
(little etidian). Встречаются и процессоры со смешанным порядком байтов,
когда, например, из двух байтов полуслова по меньшему адресу расположен младший,
а из двух полуслов по меньшему адресу расположено старшее (рис. 2.5). Некоторые
современные процессоры, например PowerPC, MIPS, SPARC V9 могут работать и с тем,
и с другим порядком байтов, причем иногда даже в пределах одной программы. 
Рис. 2.5. Порядок байтов в слове Возможные различия в порядке
байтов следует принимать во внимание при разработке форматов для передачи данных
по сети или сохранения в файле. Кроме того, некоторые ошибки программирования
(например, неявное преобразование указателя на байт в указатель на 16- или 32-битовое
целое число) относительно безобидны на машинах, у которых младший байт первый,
и приводят к немедленным катастрофическим результатам на компьютерах, использующих
меньший адрес для старшего байта. |