Рефераты. Pentium IV

Очевидно, что первый способ непригоден для вызова функций операционной системы, имеющей обычно нулевой уровень прав, из пользовательской программы, работающей, как правило, на третьем уровне. Поэтому процессор i386 предоставляет другой способ вызова подпрограмм, основанный на том, что заранее определяется набор точек входа в привилегированные кодовые сегменты, и эти точки входа описываются с помощью специальных дескрипторов - дескрипторов шлюзов вызова подпрограмм. Этот дескриптор принадлежит к системным дескрипторам, и его структура отличается от структуры дескрипторов сегментов кода и данных (рисунок 2.26). Схема его использования приведена на рисунке 2.27. Селектор из поля команды CALL используется для указания на дескриптор шлюза вызова подпрограммы в таблицах GDT или LDT. Для использования этого дескриптора вызывающий код должен иметь не меньший уровень прав, чем дескриптор, но если дескриптор шлюза доступен, то он может указывать на дескриптор сегмента вызываемого кода, имеющий более высокий уровень, чем имеет шлюз, и вызов при этом произойдет. При определении адреса входа в вызываемом сегменте смещение из поля команды CALL не используется, а используется смещение из дескриптора шлюза, что не дает возможности задаче самой определять точку входа в защищенный кодовый сегмент.

При вызове кодов, обладающих различными уровнями привилегий, возникает проблема передачи параметров между различными стеками, так как для надежной защиты задачи различного уровня привилегий имеют различные сегменты стеков. Селекторы этих сегментов хранятся в контексте задачи - сегменте TSS (Task State Segment). Если вызывается подпрограмма, имеющая другой уровень привилегий, то из текущего стека в стек уровня доступа вызываемого сегмента копируется столько 32-разрядных слов, сколько указано в поле счетчика слов дескриптора шлюза.

Структура сегмента TSS задачи приведена на рисунке 2.28. Контекст задачи должен содержать все данные для того, чтобы можно было восстановить выполнение прерванной в произвольный момент времени задачи, то есть значения регистров процессора, указатели на открытые файлы и некоторые другие, зависящие от операционной системы, переменные. Скорость переключения контекста в значительной степени влияет на скоростные качества многозадачной операционной системы. Процессор i386 производит аппаратное переключение контекста задачи, хранящегося в сегменте TSS. Как видно из рисунка, сегмент TSS имеет фиксированные поля, отведенные для значений регистров процессора, как универсальных, так и некоторых управляющих (например LDTR и CR3). Для описания возможностей доступа задачи к портам ввода-вывода процессор использует в защищенном режиме поле IOPL (Input/Output Privilege Level) в своем регистре EFLAGS и карту битовых полей доступа к портам. Для получения возможности выполнять команды ввода-вывода выполняемый код должен иметь уровень прав не ниже значения поля IOPL. Если же это условие соблюдается, то возможность доступа к порту с конкретным адресом определяется значением соответствующего бита в карте ввода-вывода сегмента TSS (карта состоит из 64 Кбит для описания доступа к 65536 портам).

Кроме этого, сегмент TSS может включать дополнительную информацию, необходимую для работы задачи и зависящую от конкретной операционной системы (например, указатели открытых файлов или указатели на именованные конвейеры сетевого обмена). Включенная в этот сегмент информация автоматически заменяется процессором при выполнении команды CALL, селектор которой указывает на дескриптор сегмента TSS в таблице GDT (дескрипторы этого типа могут быть расположены только в этой таблице). Формат дескриптора сегмента TSS аналогичен формату дескриптора сегмента данных.

Как и в случае вызова подпрограмм, имеется две возможности вызова задачи - непосредственный вызов через указание селектора сегмента TSS нужной задачи в поле команды CALL и косвенный вызов через шлюз вызова задачи. Как и при вызове подпрограмм, непосредственный вызов возможен только в случае, если вызывающий код обладает уровнем привилегий, не меньшим, чем вызываемая задача. При вызове через шлюз (который может располагаться и в таблице LDT) достаточно иметь права доступа к шлюзу. Непосредственный вызов задачи показан на рисунке 2.29. При переключении задач процессор выполняет следующие действия:

1) Выполняется команда CALL, селектор которой указывает на дескриптор сегмента типа TSS.

2) В TSS текущей задачи сохраняются значения регистров процессора. На текущий сегмент TSS указывает регистр процессора TR, содержащий селектор сегмента.

3) В TR загружается селектор сегмента TSS задачи, на которую переключается процессор.

4) Из нового TSS в регистр LDTR переносится значение селектора таблицы LDT в таблице GDT задачи.

5) Восстанавливаются значения регистров процессора (из соответствующих полей нового сегмента TSS).

6) В поле селектора возврата заносится селектор сегмента TSS снимаемой с выполнения задачи для организации возврата к прерванной задаче в будущем.

Вызов задачи через шлюз происходит аналогично, добавляется только этап поиска дескриптора сегмента TSS по значению селектора дескриптора шлюза вызова.

Использование всех возможностей, предоставляемых процессорами Intel 80386, 80486 и Pentium , позволяет организовать операционной системе высоконадежную многозадачную среду.

Всем было понятно, что Intel необходимо выпустить новый CPU. Конкуренты буквально "наступают на пятки", ядро Coppermine практически достигло своего предела частот, требования к производительности процессоров растут не по дням, а по часам, стремительно набирает обороты рынок домашней мультимедиа... Пользователь уже не довольствовался простым повышением частоты, его душа томилась по чему-то принципиально новому, свежему, неизведанному. И вот -- вышел Pentium 4. Революция свершилась. Но революция не бывает "мягкой"...

Новая архитектура Pentium 4


Проще перечислить, что в новом процессоре Intel не изменилось: он все еще 64-битовый и все еще поддерживает систему команд x86. Собственно, если перечислять именно то, чего изменения совсем не коснулись, то на этом список заканчивается. Группа разработчиков Pentium 4 "отряхнула с колен прах Pentium III" и создала архитектуру нового CPU практически "с нуля".

Но старую аксиому "не сломалось -- не чини" в R&D-отделе Intel знают наверняка. Поэтому сперва попробуем понять, почему понадобилось настолько сильно переделывать (а кое-где и создавать заново) архитектуру Pentium 4 вместо того, чтобы подвергать дальнейшим усовершенствованиям ядро Pentium Pro (а мы уже писали ранее, что фактически именно этот процессор служит родоначальником серии Pentium II/III).

Как работают современные процессоры

Для начала -- небольшая, но совершенно необходимая теоретическая часть. Во первых, все современные CPU используют конвейерную (pipelined) архитектуру в различных ее вариантах. Это означает, что любая команда выполняется не одним, а несколькими блоками, объединенными в конвейер. Первым процессором, в котором было применено такое решение, стал Intel 486, он имел конвейер из пяти ступеней.

Однако это еще не все. Дело в том, что внутри любой современный CPU уже давно "наполовину RISC", т. е. фактически он исполняет совсем другие команды, а не те, что поступают к нему из ОЗУ. Эра процессоров, "напрямую" выполнявших команды x86-ассемблера, закончилась еще с приходом Intel Pentium Pro/II и AMD K5/K6. Все последующие CPU сначала осуществляют преобразование довольно "емких" x86-команд в более простой RISC-подобный код (как правило, при этом одна команда преобразуется в несколько), исполнением которого и занимается непосредственно ядро процессора. Такой, на первый взгляд, сложный путь был избран потому, что ядро, исполняющее простые команды, гораздо легче "переносит" высокие частоты работы. В общем, спор между низкочастотным сложным ядром и высокочастотным простым уже давно и однозначно решен в пользу последнего.

При этом появляется еще одна возможность увеличения скорости исполнения команд -- параллелизация обработки. То есть несколько RISC-подобных команд обрабатываются параллельно -- за один такт, но на разных участках конвейера. Ну и кроме того, начиная с Intel Pentium, архитектура современных CPU стала "суперскалярной" (superpipelined), это означает, что конвейеров в них несколько и работают они параллельно.

Конвейерная архитектура: плюсы и минусы, проблемы и решения

Однако на этом пути возникла существенная проблема, связанная уже с недостатком самой конвейерной архитектуры. Поток команд, поступающих на конвейер, очень желательно сделать постоянным и непрерывным. В противном случае из-за "заминки" на любой его стадии те операции, для которых необходимо "знать" результат исполнения предыдущей команды, будут просто ждать ее завершения, и все "замрет". Для устранения этой проблемы используются два приема: внеочередное исполнение (Out-of-Order Execution) и предсказание ветвлений (Branch Prediction).

Внеочередное исполнение -- термин, понимать который следует именно буквально: команды, поступающие на конвейер позже, исполняются -- раньше. Рассмотрим простой пример "программы":

A = B + C
N = A + 2
C = B + 3

В этом случае для выполнения второй операции необходимо завершить первую, так как значение A + 2 невозможно узнать до тех пор, пока в результате предыдущей операции не будет установлено значение A. Однако для выполнения третьей команды результаты двух предшествующих знать не обязательно! Значит, чтобы конвейер не простаивал, следует исполнять сначала первую команду, потом сразу же можно приступать к третьей, а уж пока она будет выполняться, "подоспеет" значение А, необходимое для выполнения второй. Именно выявлением подобных последовательностей и занимаются современные CPU, что позволяет им в результате сократить время простоя.

Механизм предсказания ветвлений -- штука более сложная, однако получить некоторое представление о нем на простейшем примере тоже можно. Правда, необходимо знать хотя бы азы программирования (к примеру, BASIC). Итак, представим себе цикл FOR I = 1 TO 10 ... NEXT I. При компиляции этого цикла в машинный код он преобразуется примерно в такую последовательность команд:

10 I = 1
20 ...
30 I = I + 1
40 IF I <= 10 THEN GOTO 20
50 ...

Как видите, переход со строки 40 в десяти случаях осуществляется на строку 20 и только в одном -- на строку 50. Механизм предсказания при этом просто "запомнит", куда произошел переход по условию в самый первый раз, после чего будет предполагать, что и в следующий раз переход осуществится туда же. И ошибется всего лишь один раз из десяти! А ведь в реальных задачах встречаются циклы с гораздо большим количеством повторений... Зная же, какие команды последуют за операцией перехода, можно, соответственно, начать декодировать их задолго до того, как сама операция совершится. И опять-таки конвейер будет "спасен" от простоя.

Страницы: 1, 2, 3, 4



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.