Э. Таненбаум - Архитектура компьютера (1127755), страница 94
Текст из файла (страница 94)
В настоящее время наиболее распространенный размер ячейки— 8 бит, но раньше использовались ячейки от 1 до 60 бит (см. табл. 2.1). Ячейка из 8 бит называется байтом. Причиной применения именно 8-разрядных ячеек памяти является АБСП-символ, который занимает 7 бит, а вместе с битом четности — 8. Если в будущем будет доминировать кодировка 1)Х1СОРЕ, то ячейки памяти, возможно, станут 16-разрядными. Вооб1це говоря, число 2' лучше, чем 2, поскольку 4 — степень двойки, а 3 — нет. з Байты обычно группируются в 4-байтные (32-разрядные) или 8-байтные (64-разрядные) слова с командами манипулирования целыми словами.
Многие архитектуры требуют, чтобы слова были выровнены в своих естественных границах. Так, 4-байтное слово может начинаться с адреса О, 4, 8 и т. д., но не с адреса 1 или 2. Точно так же слово из 8 байт может начинаться с адреса О, 8 или 16, но не с адреса 4 или 6. Механизм размещения 8-байтных слов в памяти иллюст- Рирует рис.
5,2, Выравнивание адресов требуется довольно часто, поскольку при этом память работает наиболее эффективно. Например, процессор Репбпш 4, который вызывает из памяти по 8 байт за обращение, использует 36-разрядные физические адреса, но содержит только 33 адресных бита. Следовательно, Репбшп 4 даже не сможет обратиться к невыровненной памяти, поскольку младшие 3 бита явным образом не определены. Эти биты всегда равны О, и все адреса памяти кратны значению 8 байт.
Однако требование относительно выравнивания адресов иногда вызывает некоторые проблемы. В процессоре Репг1шп 4 программы могут обращаться к словам, начиная с любого адреса, — это качество восходит к модели 8088 с шиной данных шириной 1 байт, в которой не требовалось, чтобы ячейки располагались в 8-байтных границах. Если программа в процессоре Репгнаш 4 считывает 4-байтное слово с адреса 7, аппаратное обеспечение должно сделать одно обра|цение к памяти, чтобы вызвать байты с 0 по 7, а второе — чтобы вызвать байты с 8 по 15. Затем центральный процессор извлекает требуемые 4 байта из 16, 378 Глава 5.
Уровень архитектуры набора команд считанных из памяти, и компонует их в нужном порядке, чтобы сформировать 4-байтное слово. Адрес 6 Выровненное 8-байтное слово в ячейке с адресом 8 Адрес » 24 18 8 О Невыровненное 8-бвйтное слово в ячейке с адресом 12 рис. 8.2. Расположение слова из 8 байт в памяти: выровненное слово(в); невыровненное слово (б). Некоторые машины требуют, чтобы слова в памяти были выровнены Возможность считывать слова с произвольными адресами требует усложнения микросхемы, которая после етого становится больше и дороже.
Разработчики были бы рады избавиться от такой микросхемы и просто потребовать, чтобы все программы обращались к памяти пословно, а не побайтно. Однако на традиционный вопрос разработчиков: «Кому нужны древние программы, написанные еще для машин 8088 и совершенно неправильно работающие с памятью?» — следует не менее традиционный ответ продавцов: «Нашим покупателям». Большинство машин имеют единое линейное адресное пространство, которое простирается от адреса 0 до какого-то максимума, обычно 2зт или 2м байт. В некоторых машинах содержатся раздельные адресные пространства для команд и данных, так что при вызове команды с адресом 8 и вызове данных с адресом 8 происходит обращение к разным адресным пространствам.
Такая система гораздо сложнее, чем единое адресное пространство, но зато она имеет два преимущества. Во-первых, все с теми же 32-разрядными адресами появляется возможность иметь 2зт байт для программ и дополнительные 2зт байт для данных. Во-вторых, поскольку запись всегда автоматически происходит только в пространство данных, случайная перезапись программы становится невозможной, и, следовательно, устраняется один из источников программных ошибок.
Отметим, что раздельные адресные пространства для команд и для данных— зто не то же самое, что разделенная кзш-память первого уровня, В первом случае Общий обзор уровня архитектуры набора команд 379 все адресное пространство целиком дублируется, и считывание из любого адреса вызывает разные результаты в зависимости от того, что именно считывается: слово данных или команда.
При разделенной кэш-памяти существует только одно адресное пространство, просто в разных блоках кэш-памяти хранятся разные части этого пространства. Еще один аспект модели памяти — семантика памяти. Естественно ожидать, что команда ЕОАО, если она выполняется после команды 5ТОЙЕ, обратится к тому же адресу и возвратит только что сохраненное значение. Однако, как мы видели в главе 4, во многих машинах микрокоманды переупорядочиваются. Таким образом, существует реальная опасность, что память будет работать не так, как ожидается. Ситуация усложняется при наличии мультипроцессора, когда каждый процессор посылает в общую память поток запросов на чтение и запись, и эти запросы тоже могут быть переупорядочены.
Системные разработчики могут применять один из нескольких подходов решения этой проблемы. С одной стороны, все запросы к памяти могут быть упорядочены таким образом, чтобы каждый из них завершался до того, как начнется следующий. Такая стратегия отрицательно сказывается на производительности, но зато дает простейшую семантику памяти (все операции выполняются строго в том порядке, в котором они расположены в программе). С другой стороны, можно вообще не давать никаких гарантий относительно упорядоченности запросов к памяти, а чтобы добиться такой упорядоченности, программа выполняет команду 5УМС, которая блокирует запуск всех новых операций с памятью до тех пор, пока не завершатся предыдущие.
Эта идея весьма затрудняет работу создателей компиляторов, поскольку им приходится т|цательно разбираться в том, как работает соответствующая микроархитектура, но зато разработчикам аппаратного обеспечения предоставлена полная свобода в плане оптимизации использования памяти. Возможны также промежуточные модели памяти, в которых аппаратное обеспечение автоматически блокирует запуск определенных операций с памятью (например, тех, которые связаны с ВАЖ- и ЧтАК-взаимозависимостями), при этом запуск всех других операций не блокируется. Хотя реализация этих возможностей на уровне архитектуры набора команд довольно утомительна (по крайней мере, для создателей компиляторов и программистов на языке ассемблера), сейчас заметна тенденция к преобладанию подобного подхода.
Данная тенденция вызвана к жизни такими разработками, как механизмы переупорядочения микрокоманд, конвейеры, многоуровневая кэш-память и т. д. Другие, менее известные, примеры такого рода мы рассмотрим в этой главе чуть позже. Регистры Во всех компьютерах имеются несколько регистров, доступных на уровне архитектуры набора команд. Они позволяют контролировать выполнение программы, хранить временные результаты, а также служат для некоторых других целей.
Обычно регистры, доступные на уровне микроархитектуры, например ТОК и МАК (см. рис. 4.1), на уровне архитектуры набора команд недоступны, однако некоторые регистры, например счетчик команд и указатель стека, доступны на 380 Глава б. Уровень архитектуры набора команд обоих уровнях. В то же время регистры, доступные на уровне архитектуры набора команд, всегда доступны на уровне микроархитектуры, поскольку именно там они реализованы.
Регистры уровня архитектуры набора команд можно разделить на две категории: специальные регистры и регистры общего назначения. К специальным регистрам относятся счетчик команд и указатель стека, а также другие регистры, имеющие особые функции. Регистры общего назначения содержат ключевые локальные переменные и промежуточные результаты вычислений. Их основная функция состоит в том, чтобы обеспечить быстрый доступ к часто используемым данным (обычно без обращений к памяти). К1ЯС-машины с высокоскоростными процессорами и (относительно) медленной памятью обычно содержат как минимум 32 регистра общего назначения, причем в новых процессорах количество регистров общего назначения постоянно растет.
В некоторых машинах регистры общего назначения полностью симметричны и взаимозаменяемы. Если все регистры эквивалентны, для хранения промежуточного результата компилятор может использовать как регистр К1, так и регистр К25. Выбор регистра не имеет никакого значения. В других машинах некоторые регистры общего назначения могут быть специализированными. Например, в процессоре Репбпт 4 имеется регистр Е()Х, который может использоваться в качестве регистра общего назначения, но который, кроме того, используется для решения сугубо специфических задач (получает половину произведения при умножении и половину делимого при делении).
Даже если регистры общего назначения полностью взаимозаменяемы, операционная система или компиляторы часто следуют соглашениям о том, каким образом использовать эти регистры. Например, некоторые регистры могли бы применяться для хранения параметров вызываемых процедур, другие выполнять роль временных. Если компилятор помещает важную локальную переменную в регистр К1, а затем вызывает библиотечную процедуру, которая воспринимает К1 как регистр, временно выделенный в ее распоряжение, то после возвращения значения этой процедурой в регистре К1 может остаться «мусор».
То есть если существуют какие-либо системные соглашения по поводу того, как нужно использовать регистры, разработчики компиляторов и программисты, пишущие на ассемблере, должны им следовать. Помимо регистров, доступных на уровне архитектуры набора команд, всегда существует довольно много специальных регистров, доступных только в привилегированном режиме.
Эти регистры контролируют различные блоки кэш-памяти, основную память, устройства ввода-вывода, другие устройства машины. Данные регистры используются только операционной системой, поэтому компиляторам и пользователям не обязательно знать об их существовании.