Адресация оперативной памяти
С точки зрения процессора, оперативная память представляет
собой массив пронумерованных ячеек. Номер каждой ячейки памяти называется
ее адресом. Разрядность адреса является одной
из важнейших характеристик процессора и реализуемой им системы команд.
Разрядность важна не как самоцель, а потому, что ею обусловлен объем адресуемой
памяти — адресного пространства. Системы с
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-битовое целое
число) относительно безобидны на машинах, у которых младший байт первый,
и приводят к немедленным катастрофическим результатам на компьютерах,
использующих меньший адрес для старшего байта.
|