Информационные технологииStfw.Ru 🔍

Архитектура IA-32

🕛 17.09.2009, 13:14
В рамках архитектуры IA-32 существует и развивается ряд микроархитектур. Ранее было показано, что понятие архитектуры компьютера иерархично и что существуют общие и индивидуальные свойства архитектуры. В контексте обсуждения
архитектуры процессоров Intel имеет смысл также позиционировать различные их архитектурные свойства и принципы как общие и индивидуальные. К индивидуальным архитектурным свойствам и принципам можно отнести существующие в рамках различных микроархитектур (см. далее). Что касается общих архитектурных свойств и принципов IA-32, то к ним относятся те, которые имеют место для всех процессоров Intel или, по крайней мере, существуют вне рамок конкретной микроархитектуры для большого числа моделей процессоров. Так как процессор в основном определяет логику работы компьютера, то и названия большинства общих архитектурных свойств и принципов IA-32 совпадают с названиями аналогичных свойств и принципов компьютера: номенклатура программно-доступных регистров; организация и способы адресации памяти; номенклатура режимов работы процессоров; организация и разрядность внешних интерфейсов ЭВМ; способы представления и форматы данных; набор и форматы машинных команд ЭВМ; порядок обработки прерываний. Практически все эти общие архитектурные свойства и принципы составляют программную модель процессора, которая будет рассмотрена в дальнейшем.

Варианты микроархитектуры процессоров Intel

Понятие микроархитектуры впервые было определено Intel для процессоров семейства Pentium Pro. Его введение объяснялось необходимостью правильного позиционирования новых процессоров среди существующих. Внешняя программная модель (логическая) 32-разрядных процессоров изменялась только в сторону развития, в то время как их исполнительная (физическая) часть могла быть совершено разной. Понятие микроархитектуры ориентировано на описание особенностей исполнительной части процессоров, то есть того, какими способами и какими средствами процессор выполняет обработку машинного кода (рис. 2.2). На сегодняшний день в рамках IA-32 существует две микроархитектуры процессоров Intel: P6 и NetBurst.
Уровень операционной системы

Уровень машинных команд

Микроархитектура Р6
Микроархитектуру Р6 поддерживают такие процессоры Intel, как Pentium Pro, Pentium II (Xeon), Celeron, Pentium III (Xeon). Эта микроархитектура является, по определению Intel, трехходовой (three-way) суперскалярной конвейерной архитектурой. Термин «трехходовая» означает поддержку технологий параллельного вычисления, позволяющих процессору одновременно (за один такт) обрабатывать до трех инструкций. Проблема оптимальной обработки потока машинных команд является ключевой при разработке любого процессора. Поэтому для большей ясности необходимо показать эту проблему в развитии. В компьютере фон-неймановской архитектуры существуют две основные стадии исполнения команды - выборка очередной команды из памяти и собственно ее исполнение. В первых процессорах Intel все блоки процессора работали последовательно, начиная с этапа выборки очередной команды из памяти и заканчивая этапом завершения ее обработки процессором. Напоминание об этом осталось в названии регистра IP/EIP - (Instruction Pointer - указатель инструкции). До появления процессоров Intel с конвейерной архитектурой данный регистр непосредственно указывал на очередную команду, подлежащую выполнению. Процессоры Intel относятся к группе CISC-процессоров, в которых для выполнения одной команды может требоваться от единиц до нескольких десятков процессорных тактов. При такой обработке команд увеличение производительности может быть достигнуто только повышением частоты генерации машинных тактов. Простое увеличение частоты работы процессора не имеет смысла, так как есть физически обусловленная верхняя граница, до которой ее можно поднимать. По этому пути разработчики Intel шли до процессора i80386 включительно. В ходе исполнения команды есть и другое узкое место - выборка команды из памяти. Это затратная по времени операция. Частичное решение проблемы было найдено еще на заре развития компьютерной техники в виде буфера упреждающей выборки. Развитием этой и реализацией других идей стал конвейер - специальное устройство, существующее на уровне архитектуры исполнительной части компьютера. Благодаря конвейеру исполнение команды разбивается на несколько стадий, каждая из которых реализует некоторую элементарную операцию общего процесса обработки команды. Впервые для процессоров Intel конвейер был реализован в архитектуре процессора i80486. Конвейер i80486 имеет пять ступеней, которые соответствуют перечисленным далее стадиям обработки машинной команды.
1. Выборка команды из кэш-памяти или из оперативной памяти.
2. Декодирование команды.
3. Генерация адреса, в ходе которой определяются адреса операндов в памяти и выполняется выборка операндов.
4. Выполнение операции с помощью АЛУ.
5. Запись результата (место записи результата зависит от алгоритма работы конкретной машинной команды).
В чем преимущество такого подхода? Очередная команда после ее выборки попадает в блок декодирования. Таким образом блок выборки освобождается и может выбрать следующую команду. В результате на конвейере могут находиться в различной стадии выполнения пять команд. Скорость вычисления в результате существенно возрастает.
В процессорах Pentium конвейерная архитектура была усовершенствована и получила название суперскалярной. В отличие от скалярной архитектуры i80486
(с одним конвейером), первые модели процессоров Pentium имели два конвейера. В идеале такой суперскалярный процессор должен выполнять две команды за машинный такт. Но не все так просто. Реально два конвейера Pentium не были функционально равнозначными. В связи с этим они даже имели разные названия - u-конвейер (главный) и v-конвейер (второстепенный). Главный конвейер был полнофункциональным и мог выполнять любые машинные команды. Функциональность второстепенного конвейера была ограничена основными целочисленными командами и одной командой с плавающей точкой (FXCH). Внутренняя структура обоих конвейеров такая же, как у i80486 с одним общим блоком выборки команд. Для того чтобы два разных по функциональным возможностям конвейера могли обеспечить предельную эффективность (две выполненных команды за такт работы процессора), необходимо было группировать команды из входного потока в совместимые пары. Важно заметить, что исходная последовательность команд входного потока была неизменной. Если процессору не удавалось собрать совместимую пару, то выполнялась одна команда на u-конвейере. Оставшуюся команду процессор пытался «спарить» со следующей командой входного потока.
Вернемся к процессорам микроархитектуры Р6. Они имеют другую структуру конвейера. Собственно конвейера в понимании i80486 и первых Pentium уже нет. Конвейеризация заключается в том, что весь процесс обработки команд разбит на 12 стадий, которые исполняются различными блоками процессора. Сколько именно команд обрабатывается процессором, сказать трудно. Термин трехходовой означает лишь то, что для исполнения из входного потока выбираются до трех команд. Известен верхний предел - в процессоре в каждый момент времени могут находиться до 30 команд в различной стадии исполнения. Детали этого процесса скрыты за понятием динамическое исполнение с нарушением исходного порядка следования машинных команд (out of order), что означает исполнение команд в порядке, определяемом исполнительным устройством процессора, а не исходной последовательностью команд. В основу технологии динамического исполнения положены три концепции: Предсказание правильного адреса перехода. Основная задача механизма предсказания - исключить перезагрузку конвейера. Под переходом понимается запланированное алгоритмом изменение последовательного характера выполнения программы. Как показывает статистика, типичная программа на каждые 6-8 команд содержит 1 команду перехода. Последствия обработки перехода предсказать несложно: при наличии конвейера через каждые 6-8 команд его нужно очищать и заполнять заново в соответствии с адресом перехода. Все преимущества конвейеризации теряются. Поэтому в архитектуру Pentium в состав устройства выборки/декодирования (см. главу 1) был введен блок предсказания переходов. Вероятность правильного предсказания составляет около 80 %.
Динамический анализ потока данных. Анализ проводится с целью определения зависимостей команд программы от данных и регистров процессора с последующей оптимизацией выполнения потока команд. Главный критерий здесь -максимально полная загрузка процессора. Для реализации данного критерия допускается нарушение исходного порядка следования команд. Сбоя при этом не7 происходит, так как внешне логика работы программы не нарушается.
Подобная внутренняя неупорядоченность исполнения команд позволяет держать процессор загруженным даже тогда, когда данные в кэш-памяти второго уровня отсутствуют и необходимо тратить время на обращение за ними в оперативную память. Спекулятивное исполнение - способность процессора исполнять машинные команды на участках программы с условными переходами и циклами до того, как эти переходы будут разрешены алгоритмом программы. Если переход предсказан правильно, то процессор к этому моменту уже имеет исполненный код, в противном случае весь конвейер нужно очищать, загружать и исполнять код новой ветви программы, что очень накладно.
Рассмотрим порядок функционирования исполнительного устройства микро архитектуры Рб и реализацию с его помощью описанных ранее технологий. Это рассмотрение не является строгим, кое-где для лучшего понимания оно упрощено. Для иллюстрации будем использовать схему, представленную на рис. 2.3 и являющуюся развитием схемы на рис. 1.2 (см. главу 1). Из схемы видно, что структурно процессор микроархитектуры Р6 состоит из нескольких подсистем. Подсистема памяти состоит из системной шины, кэша второго уровня L2, устрой-ства шинного^интерфейса, кэша первого уровня L1 (инструкций и данных), устройства связи с памятью и буфера переупорядочивания запросов к памяти. Устройство выборки/декодированиясостоит из устройства выборки команд, блока предсказания переходов, в который входят блоки меток перехода и вычисления адреса следующей инструкции, устройства декодирования, устройства микропрограммного управления и таблицы псевдонимов регистров.

Буфер команд.

Устройство диспетчеризации/исполнения содержит буфер микроопераций, готовых к исполнению, и пять исполнительных устройств (два - для исполнения целочисленных операций, два - для исполнения операций с плавающей точкой, а также устройство связи с памятью). Необходимо заметить, что здесь допущена вольность в трактовке назначения исполнительных устройств: выделены устройства для выполнения обычных команд (целочисленных и с плавающей точкой) и ММХ-команд (также целочисленных и с плавающей точкой). Реальное деление несколько иное. Такое допущение сделано исключительно с учебной целью - для более осознанного перехода от архитектуры к системе команд ассемблера.

Блок удаления и восстановления.

Рассмотрим подсистему памяти. Для бесперебойной работы процессора в микроархитектуре Рб используется два уровня кэш-памяти1. Кэш-память первого уровня состоит из кэшей команд и данных размером по 8 Кбайт, расположенных внутри процессора в непосредственной близости к его исполнительной части. Кэш-память
второго уровня является внешней по отношению к процессору (но в едином кон Кэширование - способ увеличения быстродействия системы за счет хранения часто используемых данных и кодов в так называемой кэш-памяти, находящейся внутри процессора (кэш-память первого уровня) либо в непосредственной близости от него (кэш-памятьвторого уровня).

Структурная схема процессора семейства Р6 (Pentium Pro/11/lll)
структиве с ним), имеет значительно б ольший размер (256 Кбайт, 512 Кбайт или 1 Мбайт) и соединена с ядром процессора посредством 64-разрядной шины. Разделение кэш-памяти на две части (для кода и данных) обеспечивает бесперебойную поставку машинных инструкций и элементов данных в исполнительное устройство процессора. Исходные данные для кэш-памяти первого уровня предоставляет кэш-память второго уровня. Заметьте, что информация из нее поступает на устройство шинного интерфейса и далее в соответствующую кэш-память первого уровня по 64-разрядной шине. При этом благодаря более быстрому обновлению содержимого кэш-памяти первого уровня обеспечивается высокий темп работы процессора.
Устройство шинного интерфейса обращается к оперативной памяти системы через внешнюю системную шину. Эта 64-разрядная шина ориентирована на обработку запросов, то есть каждый шинный запрос обрабатывается отдельно и требует обратной реакции. Пока устройство шинного интерфейса ожидает ответа на один запрос шины, возможно формирование многочисленных дополнительных запросов. Все они обслуживаются в порядке поступления. Считываемые по запросу дан-ные помещаются в кэш второго уровня. То есть процессор посредством устройства шинного интерфейса читает команды и данные из кэша второго уровня. Устройство шинного интерфейса взаимодействует с кэшем второго уровня через 64-разрядную шину кэша, которая также ориентирована на обработку запросов и функционирует на тактовой частоте процессора. Доступ к кэшу первого уровня осуществляется через внутренние шины на тактовой частоте процессора. Синхронная работа с системной памятью кэш-памяти обоих уровней осуществляется благодаря специальному протоколу MESI [7], [13].
Запросы от команд на получение операндов из памяти в исполнительном устройстве процессора обслуживаются посредством устройства связи с памятью и буфера переупорядочивания запросов к памяти. Эти два устройства специально включены в схему для того, чтобы обеспечить бесперебойное снабжение исполняемых команд необходимыми данными. Особо стоит подчеркнуть роль буфера переупорядочивания запросов к памяти. Он отслеживает все запросы к операндам в памяти и выполняет функции планирующего устройства. Если нужные для очередной операции данные в кэш-памяти первого уровня (L1) отсутствуют, то буфер переупорядочивания запросов к памяти автоматически передает информацию о неудачном обращении к данным кэшу второго уровня (L2). Если и в кэше L2 нужных данных не оказалось, то буфер переупорядочивания запросов к памяти заставляет устройство шинного интерфейса сформировать запрос к оперативной памяти компьютера.
Устройство выборки/декодирования извлекает одну 32-байтную строку кэша команд ( L1) за такт и передает в декодер, который преобразует ее в последовательность микроопераций. Поток микроопераций (пока он еще соответствует последовательности исходных команд) поступает в буфер команд. Устройство выборки команд вычисляет указатель на следующую команду, подлежащую выборке, на основании информации трех источников: буфера меток перехода, состояния прерывания/исключения и сообщения от исполнительного целочисленного устройства об ошибке в предсказании метки перехода. Важная часть этого процесса - предсказание метки перехода, которое выполняется по специальному алгоритму. В его основе лежит работа с буфером меток перехода, который содержит информацию о последних 256 переходах. Если очередная команда, выбираемая из памяти, является командой перехода, то содержащийся в ней адрес перехода сравнивается с адресами, уже находящимися в буфере меток перехода. Если этот адрес уже есть в буфере меток переходов, то он станет адресом следующей команды, с которой устройство выборки будет извлекать очередную команду. Если искомого адреса перехода в буфере нет, то выборка команд из памяти будет продолжена до момента исполнения команды перехода исполнительным устройством. В результате ее исполнения становится ясно, было ли правильным решение об адресе начала выборки следующих команд после выборки команды перехода. Если предсказанный переход оказывается неверным, то конвейер сбрасывается и загружается заново в соответствии с адресом перехода. Цель предсказания переходов - в том, чтобы
устройство исполнения постоянно было занято полезной работой и сброс конвейера производился как можно реже.
Устройство выборки команд выбирает команды для исполнения и помещает их в устройство декодирования. Устройство декодирования состоит из трех параллельно работающих декодеров (два простых и один сложный). Именно эти декодеры воплощают в жизнь понятие исполнения с нарушением исходного порядка следования команд (out of order) и являются теми самыми тремя входами (three way) в исполнительное устройство процессора. Декодеры преобразуют команды процессора в микрооперации. Микрооперации представляют собой примитивные команды, которые выполняются пятью исполнительными устройствами процессора, работающими параллельно. Многие машинные команды преобразуются в одиночные микрооперации (это делает простой декодер), а некоторые машинные команды - в последовательность от двух и более (оптимально - четырех) микроопераций (это делает сложный декодер). Информация о последовательности микроопераций для реализации конкретной машинной команды содержится в устройстве микропрограммного управления. Кроме команд, декодеры обрабатывают также префиксы команд. Декодер команд может формировать до шести микроопераций за такт - по одной от простых декодеров и до четырех от сложного декодера. Для достижения наибольшей производительности работы декодеров необходимо, чтобы на их вход поступали команды, которые декодируются шестью микрооперациями в последовательности 4 + 1 + 1. Если время работы программы критично, то имеет смысл провести ее оптимизацию, заключающуюся в переупорядочивании исходного набора команд таким образом, чтобы группы команд формировали последовательности микроопераций по схеме 4 + 1 + 1. После того как команды разбиты на микрооперации, порядок их выполнения трудно предсказать. При этом могут возникнуть проблемы с таким критичным ресурсом, как регистры. Суть здесь в том, что если в двух соседних фрагментах программы данные помещались в одинаковые регистры, откуда они, возможно, записывались в некоторые области памяти, а после переупорядочивания эти фрагменты перемешались, то как разобраться в том, какие регистры и где использовались. Эта проблема носит название проблемы ложных взаимозависимостей и решается с помощью механизма переименования регистров. Основу этого механизма составляет набор из 40 внутренних универсальных регистров, которые и задействуются в реальных вычислениях исполнительным устройством абсолютно прозрачно для программ. Универсальные регистры могут работать как с целыми числами, так и со значениями с плавающей точкой. Информация о действительных именах регистров процессора и их внутренних именах (номерах универсальных регистров) помещается в таблицу псевдонимов регистров.
В заключение процесса декодирования устройство управления таблицей псевдонимов регистров добавляет к микрооперациям биты состояния и флаги, чтобы подготовить их к неупорядоченному выполнению, после чего посылает получившиеся микрооперации в буфер переупорядоченных команд. Нужно заметить, что новый порядок их следования не соответствует порядку следования соответствующих команд в исходной программе. Буфер переупорядоченных команд представляет собой массив ассоциативной памяти, физически выполненный в виде 40 регистров и представляющий собой кольцевую структуру, элементы которой содержат
два типа микроопераций: ожидающие своей очереди на исполнение и уже частично выполненные, но не до конца из-за их переупорядочивания и зависимости от других частично или полностью не выполненных микроопераций. Устройство диспетчеризации/исполнения может выбирать микрооперации из этого буфера в любом порядке.
Устройство диспетчеризации/исполнения планирует и исполняет неупорядоченную последовательность микроопераций из буфера переупорядоченных команд. Но оно не занимается непосредственной выборкой микроопераций из буфера переупорядоченных команд, так как в нем могут содержаться и не готовые к исполнению микрооперации. Этим занимается устройство, управляющее специальным буфером, который условно назовем буфером микроопераций, готовых к исполнению. Оно постоянно сканирует буфер переупорядоченных команд в поисках микроопераций, готовых к исполнению (фактически это означает доступность всех операндов), после чего посылает их соответствующим исполнительным устройствам, если они не заняты. Результаты исполнения микроопераций возвращаются в буфер переупорядоченных команд и сохраняются там наряду с другими микрооперациями до тех пор, пока не будут удалены устройством удаления и восстановления.
Подобная схема планирования и исполнения программ реализует классический принцип неупорядоченного выполнения, при котором микрооперации посылаются исполнительным устройствам вне зависимости от их расположения в исходном алгоритме. В случае, если к выполнению одновременно готовы две или более микрооперации одного типа (например, целочисленные), то они выполняются в соответствии с принципом FIFO (First In, First Out - первым пришел, первым ушел), то есть в порядке поступления в буфер переупорядоченных команд.
Непосредственно исполнительное устройство состоит из пяти блоков, каждый из которых обрабатывает свой тип микроопераций: два целочисленных устройства, два устройства для вычислений с плавающей точкой и одно устройство связи с памятью. Таким образом, за один машинный такт одновременно исполняется пять микроопераций.
Два целочисленных исполнительных устройства могут параллельно обрабатывать две целочисленные микрооперации. Одно из этих целочисленных исполнительных устройств специально предназначено для работы с микрооперациями переходов. Оно способно обнаружить непредсказанный переход и сообщить об этом устройству выборки команд, чтобы перезапустить конвейер. Такая операция реализована следующим образом. Декодер команд отмечает каждую микрооперацию перехода и адрес перехода. Когда целочисленное исполнительное устройство выполняет микрооперацию перехода, то оно определяет, был предсказан переход или нет. Если переход предсказан правильно, то микрооперация отмечается пригодной для использования, и выполнение продолжается по предсказанной ветви. Если переход предсказан неправильно, то целочисленное исполнительное устройство изменяет состояние всех последующих микроопераций с тем, чтобы удалить их из буфера переупорядоченных команд. После этого целочисленное устройство помещает метку перехода в буфер меток перехода, который, в свою очередь, совместно с устройством выборки команд перезапускает конвейер относительно нового исполнительного адреса.

Устройство связи с памятью управляет загрузкой и сохранением данных для микроопераций. Для их загрузки в исполнительное устройство достаточно определить только адрес памяти, поэтому такое действие кодируется одной микрооперацией. Для сохранения данных необходимо определять и адрес, и записываемые данные, поэтому это действие кодируется двумя микрооперациями. Та часть устройства связи с памятью, которая управляет сохранением данных, имеет два блока, позволяющие ему обрабатывать адрес и данные для микрооперации параллельно. Это позволяет устройству связи с памятью выполнить загрузку и сохранение данных для микроопераций параллельно в одном такте.
Исполнительные устройства с плавающей точкой аналогичны устройствам в более ранних моделях процессора Pentium. Было добавлено только несколько новых команд с плавающей точкой для организации условных переходов и перемещений.
Последний блок в этой схеме выполнения команд исходной программы - блок удаления и восстановления, задачей которого является возврат вычислительного процесса в рамки, определенные исходной последовательностью команд. Для этого он постоянно сканирует буфер переупорядоченных команд на предмет обнаружения полностью выполненных микроопераций, не имеющих связи с другими микрооперациями. Такие микрооперации удаляются из буфера переупорядоченных команд и восстанавливаются в порядке, соответствующем порядку следования команд исходной программы с учетом прерываний, исключений, точек прерывания и переходов. Блок удаления и восстановления может удалить три микрооперации за один машинный такт. При восстановлении порядка следования команд блок удаления и восстановления записывает результаты в реальные регистры процессора и в оперативную память.
Таким образом, система динамического исполнения команд позволяет организовать прохождение команд программы через исполнительное устройство процессора эффективнее, чем это было в конвейере процессора i80486и первых процессоров Pentium.

Микроархитектура NetBurst

Микроархитектура NetBurst, реализованная в процессоре Pentium IV, является
развитием идей микроархитектуры Р6, поэтому рассматривается довольно конспективно. Судя по названию (net - сеть, burst - прорыв), микроархитектура NetBurst призвана обеспечить некий «сетевой прорыв». Очевидно, что этим разработчики хотели подчеркнуть те новые особенности процессора Pentium IV, которые позволяют организовать более быструю и эффективную работу приложений в современных сетевых и мультимедийных информационных средах. Отметим наиболее важные свойства новой микроархитектуры.
я Быстрая исполнительная часть процессора. АЛУ процессора работает на удвоенной частоте процессора. За каждый такт процессора выполняются две основные целочисленные команды. Обеспечена более высокая пропускная способность потока команд через исполнительную часть процессора и уменьшены различные задержки.
ш Гиперконвейерная технология. Гиперконвейер Pentium IV состоит из 20 ступеней. Цель увеличения длины конвейера - упрощение задач, реализуемых каждой из его ступеней, и, как следствие, упрощение соответствующей аппаратной логики.
Улучшенная технология динамического исполнения благодаря более глубокой «произвольности» в порядке исполнения кода и усовершенствованной системе предсказания переходов. Размер буфера меток перехода увеличен до 4 Кбайт (Pentium III - 512 байт). Усовершенствован и сам алгоритм предсказания. В результате вероятность предсказания перехода возрастает до 95 %.
Новая подсистема кэширования. Отсутствует кэш команд первого уровня. Вместо него введен кэш трасс. Трассолшназываются последовательности микроопераций, в которые были декодированы ранее выбранные команды. Кэш трасс способен хранить до 12 Кбайт микроопераций и доставлять исполнительному ядру до 3 микроопераций за такт. Кэш второго уровня работает на полной частоте ядра процессора.

Микроархитектура NetBurst поддерживает еще одну новую технологию - Ну-perThreading. Данная технология позволяет на базе одного физического процессора Pentium IV моделировать несколько логических, каждый из которых имеет собственное архитектурное пространство IA-32. Под архитектурным пространством
IA-32 понимается совокупность регистров данных, сегментных регистров, системных регистров и регистров MSR. Каждый логический процессор имеет также собственный контроллер прерываний API С.
На этом, наверное, следует завершить обсуждение общих вопросов, связанных с архитектурой процессоров Intel. Более подробную информацию по этой теме, в том числе о логике функционирования и характеристиках микроархитектур Р6 и NetBurst, можно получить из материала книги [13]. Наша ближайшая задача - разобраться, как управлять этими сложными процессорами. Программисту совершенно необязательно помнить о схемотехнических тонкостях реализации процессора, ему достаточно знать, какие части процессора ему доступны и как с ними взаимодействовать для реализации некоторой задачи. Первый шаг в этом направлении - знакомство с программной моделью процессора. Эта модель описывает видимые для программиста объекты архитектуры процессора, знание которых позволяет программисту эффективно и в полном объеме использовать возможности процессора.

Программная модель IA-32

Любая выполняющаяся программа получает в свое распоряжение определенный
набор ресурсов процессора. Эти ресурсы необходимы для обработки и хранения в памяти команд и данных программы, а также информации о текущем состоянии программы и процессора. Программную модель процессора в архитектуре IA-32 процессоров Intel составляет следующий набор ресурсов: пространство адресуемой памяти до 232 - 1 байт (4 Гбайт), для Pentium III/IV -до 236 - 1 байт (64 Гбайт);
набор регистров для хранения данных общего назначения;
набор сегментных регистров;
набор регистров состояния и управления;
набор регистров устройства вычислений с плавающей точкой (сопроцессора); набор регистров целочисленного MMX-расширения, отображенных на регистры сопроцессора (впервые появились в архитектуре процессора Pentium MMX); набор регистров MMX-расширения с плавающей точкой (впервые появились в архитектуре процессора Pentium III);
программный стек - специальная информационная структура, работа с которой предусмотрена на уровне машинных команд (более подробно она будет обсуждена позже).
Это основной набор ресурсов. Кроме того, к ресурсам, поддерживаемым архитектурой IA-32, необходимо отнести порты ввода-вывода, счетчики мониторинга производительности.
Программные модели более ранних процессоров (i486, первые Pentium) отличаются меньшим размером адресуемого пространства оперативной памяти (232 - 1, так как разрядность их шины адреса составляет 32 бита) и отсутствием некоторых групп регистров.

Регистры MMX-расширения с плавающей точкой (Pentium III/IV)
(Pentium MMX/II/III/IV) Программная модель архитектуры IA-32 процессоров Intel
с какой модели данная группа регистров появилась в программной модели процессоров Intel. Если такого обозначения нет, то это означает, что данная группа регистров присутствовала в процессорах i386 и i486. Что касается еще более ранних процессоров i8086/88, то на самом деле они тоже полностью представлены на схеме, но составляют лишь ее небольшую ее часть. В программную модель данных процессоров входят 8- и 16-разрядные регистры общего назначения, сегментные регистры, регистры FLAGS, IP и адресное пространство памяти размером до 1 Мбайт. Свойства некоторых перечисленных далее программно-доступных ресурсов определяются текущим режимом работы процессора.

Режимы работы процессора архитектуры IA-32

Режим работы процессора определяет поведение, номенклатуру и свойства доступных ресурсов процессора. Перевод процессора из одного режима в другой осуществляется специальными программными и аппаратными методами.
В рамках архитектуры IA-32 доступны следующие режимы работы процессора.
Ж Режим реальных адресов, или просто реальный режим (real mode) - это режим, в котором работал i8086. Наличие его в i486 и Pentium обусловлено тем, что фирма Intel старается обеспечить в новых моделях процессоров возможность функционирования программ, разработанных для ранних моделей.
Защищенный режим (protected mode) позволяет максимально реализовать все идеи, заложенные в процессорах архитектуры IA-32, начиная с i80286. Программы, разработанные для i8086 (реального режима), не могут функционировать в защищенном режиме. Одна из причин этого связана с особенностями формирования физического адреса в защищенном режиме. Режим виртуального процессора 8086 предназначен для организации многозадачной работы программ, разработанных для реального режима (процессора i8086), совместно с программами защищенного режима. Переход в этот режим (virtual 8086 mode) возможен, если процессор уже находится в защищенном режиме. Работа программ реального режима в режиме виртуального i8086в о з-можна благодаря тому, что процесс формирования физического адреса для них производится по правилам реального режима. Режим системного управления (System Management Mode, SMM) - это новый режим работы процессора, впервые появившийся в процессоре Pentium. Он обеспечивает операционную систему механизмом для выполнения машинно-зависимых функций, таких как перевод компьютера в режим пониженного энергопотребления или выполнения действий по защите системы. Для перехода в данный режим процессор должен получить специальный сигнал SMI от усовершенствованного программируемого контроллера прерываний (Advanced Programmable Interrupt Controller, APIC), при этом сохраняется состояние вычислительной среды процессора. Функционирование процессора в этом режиме подобно его работе в режиме реальных адресов. Возврат из этого режима производится специальной командой процессора.
Процессор всегда начинает работу в реальном режиме.

Набор регистров

Регистрами называются области высокоскоростной памяти, расположенные внутри процессора в непосредственной близости от его исполнительного ядра. Доступ к ним осуществляется несравнимо быстрее, чем к ячейкам оперативной памяти. Соответственно, машинные команды с операндами в регистрах выполняются максимально быстро, поэтому в программах на языке ассемблера регистры используются очень интенсивно. К сожалению, архитектура IA-32 предоставляет в распоряжение программиста не слишком много регистров, поэтому они являются критически важным ресурсом и за их содержимым приходится следить очень внимательно.

Большинство регистров имеют определенное функциональное назначение. С точки зрения программиста, их можно разделить на две большие группы. Первую группу образуют пользовательские регистры, к которым относятся:
регистры общего назначения ЕАХ/АХ/АН/АЦEBX/BX/BH/BL, EDX/DX/DH/DL, ЕСХ/ CX/CH/CL, ЕВР/ВР, ESI/SI, EDI/DI, ESP/SP предназначены для хранения данных и адресов, программист может их использовать (с определенными ограничениями) для реализации своих алгоритмов; сегментные регистры CS, DS, SS, ES, FS, GS используются для хранения адресов сегментов в памяти; регистры сопроцессора ST(0), ST(1), ST(2), ST(3), ST(4), ST(5), ST(6), ST(7) предназначены для написания программ, использующих тип данных с плавающей точкой (глава 17); целочисленные регистры MMX-расширения ММХО, MMXl, MMX2, ММХЗ, ММХ4, ММХ5, ММХб, ММХ7; регистры MMX-расширения с плавающей точкой XMMO, XMMl, ХММ2, ХММЗ,. ХММ4,ХММ5,ХММб,ХММ7; регистры состояния и управления (регистр флагов Е FLAGS/FLAGS и регистр-указатель команды EIP/IP) содержат информацию о состоянии процессора, исполняемой программы и позволяют изменить это состояние.
Во вторую группу входят системные регистры, то есть регистры, предназначенные для поддержания различных режимов работы, сервисных функций, а также регистры, специфичные для определенной модели процессора. Перечислим системные регистры, поддерживаемые IA-32: управляющие регистры CR0.. .CR4 определяют режим работы процессора и характеристики текущей исполняемой задачи;
регистры управления памятью GDTR, IDTR, LDTR и TR используются в защищенном режиме работы процессора для локализации управляющих структур этого режима; отладочные регистры DR0.. .DR7 предназначены для мониторинга и управления различными аспектами отладки; регистры типов областей памяти MTRR используются для аппаратного управления кэшированием в целях назначения соответствующих свойств областям памяти; машинно-зависимые регистры MSR используются для управления процессором, контроля за его производительностью, получения информации об ошибках. Почему в обозначениях многих из регистров общего назначения присутствует наклонная разделительная черта? Это не разные регистры - это части одного большого 32-разрядного регистра, но их можно использовать в программе как отдельные объекты. Зачем так сделано? Чтобы обеспечить работоспособность программ, написанных для прежних 16-разрядных моделей процессоров фирмы Intel начиная с i8086. Процессоры i486 и Pentium имеют в основном 32-разрядные регистры.

Их количество, за исключением сегментных регистров, такое же, как и у i8086, но размерность больше, что и отражено в обозначениях - они имеют приставку е(extended).
Многие из приведенных регистров предназначены для работы с определенными вычислительными подсистемами процессора: сопроцессором, MMX-расширениями. Поэтому их целесообразно рассматривать в соответствующем контексте. Так как первая часть учебника посвящена вопросам программирования целочисленной подсистемы процессора, то в данной главее описываются регистры, обеспечивающие ее функционирование. В дальнейшем при обсуждении новых вычислительных подсистем процессора будут рассмотрены и другие регистры из перечисленных ранее.
Регистры общего назначения
Регистры общего назначения используются в программах для хранения: операндов логических и арифметических операций; компонентов адреса;
указателей на ячейки памяти.
В принципе, все эти регистры доступны для хранения операндов без особых ограничений, хотя в определенных условиях некоторые из них имеют жесткое функциональное назначение, закрепленное на уровне логики работы машинных команд. Среди всех этих регистров особо следует выделить регистр ESP. Его не следует использовать явно для хранения каких-либо операндов программы, так как в нем хранится указатель на вершину стека программы.
Все регистры этой группы позволяют обращаться к своим «младшим» частям (см. рис. 2.5). Обращение производится по их именам. Важно отметить, что использовать для самостоятельной адресации можно только младшие 16- и 8-разрядные части этих регистров. Старшие 16 битов как самостоятельные объекты недоступны. Это сделано, как мы отметили ранее, для совместимости с первыми 16-разрядными моделями процессоров фирмы Intel. Перечислим регистры, относящиеся к группе регистров общего назначения и физически находящиеся в процессоре внутри арифметико-логического устройства (поэтому их еще называютрегистрами АЛУ):
ж регистр-аккумулятор (Accumulator register) EAX/AX/AH/AL применяется для хранения промежуточных данных, в некоторых командах его использование обязательно;
т базовый регистр (Base register) EBX/BX/BH/BL применяется для хранения базового адреса некоторого объекта в памяти; регистр-счетчик (Count register) ECX/CX/CH/CL применяется в командах, производящих некоторые повторяющиеся действия. Использование регистра-счетчика зачастую скрыто в алгоритме работы той или иной команды. Например, команда организации цикла LOOP помимо передачи управления анализирует и уменьшает на единицу значение регистра ЕСХ/СХ;
т регистр данных (Data register) EDX/DX/DH/DL, так же как и регистр ЕАХ/АХ/АН/ AL, хранит промежуточные данные (в некоторых командах его явное использование обязательно, в других он используется неявно).

Следующие два регистра предназначены для поддержки так называемых цепочечных операций, то есть операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит:
И регистр индекса источника (Source Index register) ESI/SI в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике; регистр индекса приемника (Destination Index register) EDI/DI в цепочечных операциях содержит текущий адрес в цепочке-приемнике.
В архитектуре процессора на программно-аппаратном уровне поддерживается такая структура данных, как стек. Для работы со стеком в системе команд процессора есть специальные команды, а в программной модели процессора для этого существуют специальные регистры:
регистр указателя стека (Stack Pointer register) ESP/SP содержит указатель на вершину стека в текущем сегменте стека; регистр указателя базы кадра стека (Base Pointer register) EBP/BP предназначен для организации произвольного доступа к данным внутри стека.
Не стоит пугаться столь жесткого функционального назначения регистров АЛУ. На самом деле при программировании хранить операнды команд можно в большинстве регистров, причем практически в любых сочетаниях. Однако всегда следует помнить, что некоторые команды требуют строго определенных регистров. Цель подобного жесткого закрепления регистров для этих команд - более компактная кодировка их машинного представления. Знание особенностей использования регистров машинными командами (см. приложение) позволяет, при необходимости, экономить память, занимаемую кодом программы, и более эффективно программировать алгоритм.

Сегментные регистры

Процессоры Intel аппаратно поддерживают сегментную организацию программы. Это означает, что любая программа состоит из трех сегментов: кода, данных и стека. Логически машинные команды в архитектуре IA-32 построены так, что при выборке каждой команды для доступа к данным программы или к стеку неявно используется информация из вполне определенных сегментных регистров. В зависимости от режима работы процессора по их содержимому определяются адреса памяти, с которых начинаются соответствующие сегменты. В программной модели IA-32 имеется шесть сегментных регистров CS, SS, DS, ES, GS, FS, служащих для доступа к четырем типам сегментов.
Сегмент кода содержит команды программы. Для доступа к этому сегменту служит регистр сегмента кода (Code Segment register) CS. Он содержит адрес сегмента с машинными командами, к которому имеет доступ процессор (эти команды загружаются в конвейер процессора). Сегмент данных содержит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр сегмента данных (Data Segment register) DS, который хранит адрес сегмента данных текущей программы. Сегмент стека представляет собой область памяти, называемую стеком. Работу со стеком процессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этой области служат регистр сегмента стека (Stack Segment register) SS, содержащий адрес сегмента стека. № Дополнительный сегмент данных. Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположе -ны в сегменте данных, адрес которого находится в регистре сегмента данных DS. Если программе недостаточно одного сегмента данных, то она имеет возможность задействовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в регистре DS, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах дополнительного сегмента данных (Extension Data Segment registers) ES, GS, FS.

Регистры состояния и управления

В процессор включены два регистра, постоянно содержащие информацию о состоянии как самого процессора, так и программы, команды которой он в данный момент обрабатывает:
регистр-указатель команд EIP/IP;
регистр флагов Е FLAGS/FLAGS.
С помощью этих регистров можно также ограниченным образом управлять состоянием процессора.
Регистр-указатель команд (Instruction Pointer register) EIP/IP имеет разрядность 32(16) бита и содержит смещение следующей подлежащей выполнению команды относительно содержимого регистра сегмента кода CS в текущем сегменте команд. Этот регистр непосредственно недоступен программисту, но загрузка и изменение его значения производятся различными командами управления, к которым относятся команды условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра EIP/IP.
Разряцкостьрегистра флагов (flagregister) EFLAGS/FLAGS равна 32(16) битам. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть регистра EFLAGS/FLAGS полностью аналогична регистру FLAGS процессора i8086. На рис. 2.6 показано содержимое регистра EFLAGS.
Исходя из особенностей использования, флаги регистра EFLAGS/FLAGS можно разделить на три группы.
В первую группу флагов регистра EFLAGS/FLAGS входят 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд. Флаги состояния регистра EFLAGS отражают особенности результата исполнения арифметических или логических операций. Это дает возможность анализировать состояние вычислительного процесса и реагировать на него с помощью команд, условных переходов и вызовов подпрограмм.

СИСТЕМНЫЕ ФЛАГИ:
~флагтрассировки -флаг прерывания -флаг возобновления
флаг виртуального 8086 -флаг контроля выравнивания
флаг виртуального прерывания -флаг отложенного прерывания
(для режима виртуального J8086) -флагподдержки идентификации
процессора

Во вторую группу флагов (группа флагов управления) регистра EFLAGS/FLAGS входит всего один флаг направления (directory flag) DF. Он находится в десятом бите регистра EFLAGS и используется цепочечными командами. Значение флага DF определяет направление поэлементной обработки в этих операциях: от начала строки к концу (DF = 0) либо, наоборот, от конца строки к ее началу (DF - 1). Для работы с флагом DF существуют специальные команды CLD (снять флаг DF) и STD (установить флаг DF). Применение этих команд позволяет привести флаг DF в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками.
В третью группу флагов регистра EFLAGS/FLAGS входит 8 системных флагов, управляющих вводом-выводом, маскируемыми прерываниями, отладкой, переключением между задачами и режимом виртуального процессора 8086. Прикладным программам не рекомендуется модифицировать без необходимости эти флаги, так как в большинстве случаев это ведет к прерыванию работы программы. Далее перечислены системные флаги и их назначение.
Флаг идентификации (identification flag) ID используется для того, чтобы показать факт поддержки процессором инструкции CPUID. Если программа может установить или сбросить этот флаг, это означает, что данная модель процессора поддерживает инструкцию CPUID.
Организация памяти
Физическая память, к которой процессор имеет доступ по шине адреса (см. рис. 1.2), называется оперативной памятью (или оперативным запоминающим устройством - ОЗУ). На самом нижнем уровне память компьютера можно рассматривать как массив битов. Один бит может хранить значение 0 или 1. Для физической реализации битов и работы с ними идеально подходят логические схемы. Но процессору неудобно работать с памятью на уровне битов, поэтому реально ОЗУ организовано как последовательность ячеек - байтов. Один байт состоит из восьми битов. Каждому байту соответствует свой уникальный адрес (его номер), называемый физическим. Диапазон значений физических адресов зависит от разрядности шины адреса процессора. Для i486 и Pentium он находится в пределах от О до 232 - 1 (4 Гбайт). Для процессоров Pentium Pro/II/III/IV этот диапазон шире - от 0 до 23s - 1 (64 Гбайт).
Механизм управления памятью полностью аппаратный. Это означает, что программа не может сама сформировать физический адрес памяти на адресной шине. Ей приходится «играть» по правилам процессора. Что это за правила, мы узнаем чуть позже. Пока же отметим, что в конечном итоге этот механизм позволяет обеспечить:

компактность хранения адреса в машинной команде; И гибкость механизма адресации;
защиту адресных пространств задач в многозадачной системе;
поддержку виртуальной памяти.
Процессор аппаратно поддерживает две модели использования оперативной памяти.
В сегментированной модели программе выделяются непрерывные области памяти (сегменты), а сама программа может обращаться только к данным, которые находятся в этих сегментах.
Страничную модель можно рассматривать как надстройку над сегментированной моделью. В случае использования этой модели оперативная память рассматривается как совокупность блоков фиксированного размера (4 Кбайт и более). Основное применение этой модели связано с организацией виртуальной памяти, что позволяет операционной системе использовать для работы программ пространство памяти большее, чем объем физической памяти. Для процессоров i486 и Pentium размер возможной виртуальной памяти может достигать 4 Тбайт.
Сегментированная модель памяти
Сегментация - механизм адресации, обеспечивающий существование нескольких независимых адресных пространств как в пределах одной задачи, так и в системе в целом для защиты задач от взаимного влияния. В основе механизма сегментации лежит понятие сегмента, который представляет собой независимый поддерживаемый на аппаратном уровне блок памяти.
Когда мы рассматривали сегментные регистры, то отмечали, что для процессоров Intel, начиная с i8086, принят особый подход к управлению памятью. Каждая программа в общем случае может состоять из любого количества сегментов, но непосредственный доступ она имеет только к трем основным сегментам (кода, данных и стека), а также к дополнительным сегментам данных числом от одного до трех. Программа никогда не знает, по каким физическим адресам будут размещены ее сегменты. Этим занимается операционная система. Операционная система размещает сегменты программы в оперативной памяти по определенным физическим адресам, после чего помещает значения этих адресов в определенные места. Куда именно, зависит от режима работы процессора. Так, в реальном режиме эти адреса помещаются непосредственно в соответствующие сегментные регистры, а в защищенном режиме они размещаются в элементы специальной системной дескрипторной таблицы. Внутри сегмента программа обращается к адресам относительно начала сегмента линейно, то есть начиная с 0 и заканчивая адресом, равным размеру сегмента. Этот относительный адрес, или смещение, который процессор использует для доступа к данным внутри сегмента, называется эффективным.
Отличия моделей сегментированной организации памяти в различных режимах хорошо видны на схеме. Различают три основных модели сегментированной организации памяти:

Модели памяти процессоров Intel
Рассмотрим порядок формирования физического адреса в реальном и защищенном режимах. Уточним терминологию. Под физическим адресом понимается адрес памяти, выдаваемый на шину адреса процессора. Другое название этого адреса - линейный адрес. Подобная двойственность в названии обусловлена наличием страничной модели организации оперативной памяти. Эти названия являются синонимами только при отключении страничного преобразования адреса
(в реальном режиме страничная адресация всегда отключена). Страничная модель, как мы отметили ранее, является надстройкой над сегментированной моделью. В страничной модели линейный и физический адреса имеют разные значения. Далее мы будем обсуждать схему, на которой показан порядок формирования адреса в реальном режиме работы процессора. Обратите внимание на наличие в этой схеме устройства страничного преобразования адреса, предназначенного для того, чтобы совместить две принципиально разные модели организации оперативной памяти и выдать на шину адреса истинное значение физического адреса памяти.
Формирование физического адреса в реальном режиме
Далее перечислены характеристики механизма адресации физической памяти в реальном режиме. Диапазон изменения физического адреса - от 0 до 1 Мбайт. Эта величина определяется тем, что шина адреса i8086 имела 20 линий. Максимальный размер сегмента - 64 Кбайт. Это объясняется 16-разрядной архитектурой i8086. Нетрудно подсчитать, что максимальное значение, которое могут содержать 16-разрядные регистры, составляет 216 - 1, что применительно к памяти и определяет величину 64 Кбайт. Для обращения к конкретному физическому адресу оперативной памяти необходимо определить адрес начала сегмента (сегментную составляющую) и смещение внутри сегмента.
Понятие адреса начала сегмента ввиду принципиальной важности требует дополнительного пояснения. Исходя из разрядности сегментных регистров, можно утверждать, что сегментная составляющая адреса (или база сегмента) представляет собой всего лишь 16-разрядное значение, помещенное в один из сегментных регистров. Максимальное значение, которое при этом получается, соответствует 216 - 1. Если так рассуждать, то получается, что адрес начала сегмента может быть только в диапазоне 0-64 Кбайт от начала оперативной памяти. Возникает вопрос, как адресовать остальную часть оперативной памяти вплоть до 1 Мбайт с учетом того, что размер самого сегмента не превышает 64 Кбайт. Дело в том, что в сегментном регистре содержатся только старшие 16 битов физического адреса начала сегмента. Недостающие младшие четыре бита 20-разрядного адреса получаются сдвигом значения в сегментном регистре влево на 4 разряда. Эта операция сдвига выполняется аппаратно и для программного обеспечения абсолютно прозрачна. Получившееся 20-разрядное значение и является настоящим физическим адресом, соответствующим началу сегмента. Что касается второго компонента (смещения), участвующего в образовании физического адреса некоторого объекта в памяти, то он представляет собой 16-разрядное значение. Это значение может содержаться явно в команде либо косвенно в одном из регистров общего назначения. В процессоре эти две составляющие складываются на аппаратном уровне, в результате получается физический адрес памяти размерностью 20 битов. Данный механизм образования физического адреса позволяет сделать программное обеспечение перемещаемым, то есть не зависящим от конкретных адресов загрузки его в оперативной памяти.
Механизм формирования физического адреса в реальном режиме
На рисунке хорошо видно, как формируется некоторый целевой физический адрес: сегментная часть извлекается из одного из сегментных регистров, сдвигается на четыре разряда влево и суммируется со смещением. В свою очередь, видно, что значение смещения можно получить минимум из одного и максимум из трех источников: из значения смещения в самой машинной команде и/или из содержимого одного базового и/или одного индексного регистра. Количество источников, участвующих в формировании смещения, определяется кодированием конкретной машинной команды, и если таких источников несколько, то значения в них складываются. В заключение заметим, что не стоит волноваться из-за несоответствия размеров шины адреса процессора i486 или Pentium (32 бита) и 20-разрядного значения физического адреса реального режима. Пока процессор находится в реальном режиме, старшие 12 линий шины адреса попросту недоступны, хотя при определенных условиях и существует возможность работы с первыми 64 Кбайт оперативной памяти, лежащими сразу после первого мегабайта.
Недостатки такой организации памяти:
И сегменты бесконтрольно размещаются с любого адреса, кратного 16 (так как содержимое сегментного регистра аппаратно смещается на 4 разряда), и, как следствие, программа может обращаться по любым адресам, в том числе и реально не существующим;
« сегменты имеют максимальный размер 64 Кбайт;
ж сегменты могут перекрываться другими сегментами.
Желанием ввести в архитектуру средства, позволяющие избавиться от указанных недостатков, и обусловлено, в частности, появление защищенного режима,
в котором работают все современные операционные системы, в том числе Windows и Linux.
Формирование физического адреса в защищенном режиме
Основная идея защищенного режима - защитить исполняемые процессором программы от взаимного влияния. В защищенном режиме процессор поддерживает два типа защиты - по привилегиям и по доступу к памяти. В контексте нашего изложения интерес представляет второй тип защиты. Его мы и рассмотрим.
Для введения любого механизма защиты нужно иметь как можно больше информации об объектах защиты. Для процессора такими объектами являются исполняемые им программы. Организуя защиту программ по доступу к памяти, фирма Intel не стала нарушать принцип сегментации, свойственный ее процессорам. Так как каждая программа занимает один или несколько сегментов в памяти, то логично иметь больше информации об этих сегментах как об объектах, реально существующих в данный момент в вычислительной системе. Если каждому из сегментов присвоить определенные атрибуты, то часть функций по контролю за доступом к ним можно переложить на процессор. Что и было сделано. Любой сегмент памяти в защищенном режиме имеет следующие атрибуты: расположение сегмента в памяти; размер сегмента; уровень привилегий (определяет права данного сегмента относительно других
сегментов); тип доступа (определяет назначение сегмента); и некоторые другие.
В отличие от реального режима, в защищенном режиме программа уже не может запросто обратиться по любому физическому адресу памяти. Для этого она должна иметь определенные полномочия и удовлетворять ряду требований.
Ключевым объектом защищенного режима является специальная структура - дескриптор сегмента, который представляет собой 8-байтовый дескриптор (краткое описание) непрерывной области памяти, содержащий перечисленные ранее атрибуты. На рис. 2.9 приведена структура дескриптор сегмента. Приведем назначение некоторых полей дескриптора сегмента:
limit_l и limit_2 - 20-разрядное поле, определяющее размер сегмента;
base_l и base_2 - 32-разрядное поле, определяющее значение линейного адреса начала сегмента в памяти;
AR - байт, поля которого определяют права доступа к сегменту;
D - бит разрядности операндов и адресов (глава 3);
G - бит гранулярности.
В защищенном режиме размер сегмента не фиксирован, его расположение можно задать в пределах 4 Гбайт. Если посмотреть на рисунок, то возникнет вопрос: почему разорваны поля, определяющие размер сегмента и его начальный (базовый) адрес? Это результат эволюции процессоров. Защищенный режим впервые появился в процессоре i80286. Этот процессор имел 24-разрядную адресную шину и, соответственно, мог адресовать в защищенном режиме до 16 Мбайт оперативной памяти. Для этого ему достаточно было иметь в дескрипторе поле базового адреса 24 бита и поле размера сегмента 16 битов. После появления процессора i80386 с 32-разрядной шиной команд и данных в целях совместимости программ разработчики не стали менять формат дескриптора, а просто использовали свободные поля. Внутри процессора эти поля объединены. Внешне же они остались разделенными, и при программировании с этим приходится мириться.
Следующий интересный момент связан с тем, что размер сегмента в защищенном режиме может достигать 4 Гбайт, то есть занимать все доступное физическое пространство памяти. Как это возможно, если суммарный размер поля размера сегмента составляет всего 20 битов, что соответствует величине 1 Мбайт? Секрет скрыт в поле гранулярности - бит G (см. рис. 2.9). Если G = 0, то значение в поле размера сегмента означает размер сегмента в байтах, если G - 1, - то в страницах. Размер страницы составляет 4 Кбайт. Нетрудно подсчитать, что когда максимальное значение поля размера сегмента составляет 0fffffhто это соответствует 1 М страниц или величине 1 М х 4 Кбайт = 4 Гбайт.
Выведение информации о базовом адресе сегмента и его размере на уровень процессора позволяет аппаратно контролировать работу программ с памятью и предотвращать обращения к несуществующим адресам либо к адресам, находящимся вне предела, разрешенного полем размера сегмента limit.
Другой аспект защиты заключается в том, что сегменты неравноправны в пра-вах доступа к ним. Информация об этом содержится в специальном байте AR, входящем в состав дескриптора. Наиболее важные поля байта AR - это с1р1и биты R/W, C/ED и I, которые вместе определяют тип сегмента. Поле dpi- часть механизма защиты по привилегиям. Суть этого механизма заключается в том, что конкретный сегмент может находиться на одном из четырех уровней привилегированности с номерами О, 1, 2 и 3. Самым привилегированным является уровень 0. Существует ряд ограничений (опять-таки на аппаратном уровне) на взаимодействие сегментов кода, данных и стека с различными уровнями привилегий.

Итак, мы выяснили, что в защищенном режиме перед использованием любой области памяти должна быть проведена определенная работа по инициализации соответствующего дескриптора. Эту работу выполняет операционная система или программа, сегменты которой также описываются подобными дескрипторами. Все дескрипторы собираются вместе в одну из трех дескрипторных таблиц:
глобальная дескрипторная таблица (Global Descriptor Table, GDT), ее адрес хранится в регистре GDTR;
локальная дескрипторная таблица (Local Descriptor Table, LDT), ее адрес хранится в регистре LDTR;
дескрипторная таблица векторов прерываний (Interrupt Descriptor Table, IDT), ее адрес хранится в регистре IDTR.
В какую именно таблицу должен быть помещен дескриптор, определяется его назначением. Адрес, по которому размещаются эти дескрипторные таблицы, может быть любым; он хранится в специально предназначенном для этого адреса системном регистре.
Схемы, показанные на рис. 2.7, б и в, иллюстрируют Принцип формирования адреса в защищенном режиме. Важно отметить изменение роли сегментных регистров. В защищенном режиме они содержат не адрес, а селектор, то есть указатель на соответствующую ячейку одной из дескрипторных таблиц (GDT или LDT).
Остальные элементы архитектуры IA-32, такие как формат машинных команд, типы данных и др., логично рассмотреть в следующих главах в контексте соответствующих аспектов использования языка ассемблера.

Итоги

Понимание архитектуры ЭВМ является ключевым для изучения ассемблера. Это касается любого типа компьютера. Структура ассемблера, формат его команд, адресация операндов и т. д. полностью отражают особенности архитектуры компьютера. Есть общие архитектурные свойства, присущие всем современным машинам фон-неймановской архитектуры, и есть частные свойства, присущие конкретному типу компьютеров. Целью изучения архитектуры является:
выявление набора доступных для программирования регистров, их функционального назначения и структуры;
понимание организации оперативной памяти и порядка ее использования;
знакомство с типами данных;
изучение формата машинных команд;
выяснение организации обработки прерываний. Процессор содержит 32 доступных тем или иным образом регистра. Они делятся на пользовательские и системные.
Пользовательские регистры имеют определенное функциональное назначение. Среди них особо нужно выделить регистр флагов Е FLAGS и регистр указателя команды EIP. Назначение регистра EFLAGS - отражать состояние процессора
после выполнения последней машинной команды. Регистр EIP содержит адрес следующей выполняемой машинной команды. Доступ к этим регистрам, в силу их специфики, со стороны программ пользователя ограничен.
Процессор имеет три основных режима работы:
реальный режим, который использовался для i8086 и поддерживается до сих пор для обеспечения совместимости программного обеспечения;
защищенный режим, который впервые появился в i80286;
режим виртуального процессора i8086 обеспечивает полную эмуляцию i8086,
позволяя при этом организовать многозадачную работу нескольких таких
программ.
Процессор имеет сложную систему управления памятью, функционирование которой зависит от режима работы процессора.

Assembler   Теги:

Читать IT-новости в Telegram

Читайте также:

Архитектура ЭВМ

Информационные технологии
Мы в соцсетях ✉