Лекции по Вычислительным машинам, системам и сетям   

3. Тридцатидвухразрядные процессоры фирмы Intel

3.1. Общие сведения и терминология

Среди 32-разрядных процессоров фирмы Intel различают процессоры 386, 486, Pentium, семейство Р6 (процессоры Pentium Pro, Pentium II, Celerone и Pentium III, в котрых фирма реализует микроархитектуру Р6) и Pentium IV, в котором реализована NetBurst-микроархитектура. Базовые механизмы, реализуемые всеми этими процессорами,практически идентичны. При употреблении термина «процессор» речь будет идти обо всех вышеперечисленных процессорах, а конкретные особенности для отдельного процессора будут оговариваться дополнительно.

Итак, процессор имеет 32-адресные линии (А31-0) и, следовательно, может адресовать 232 байта (4 Гбайта) оперативной памяти. Начиная с Р6, в регистре cr4 (control register – регистр управления) введен специальный бит PAE (physical address extension – расширение физического адреса). Если этот бит установлен в единицу, то к процессору добавляются еще 4 адресные линии (А35-32) и он может адресовать 64 Гбайта оперативной памяти. Но при этом обязательно должен быть включен страничный механизм, так как, несмотря на наличие 36-адресных линий, сегментный механизм процессора продолжает вырабатывать 32-разрядный адрес, т.е. продолжает адресовать 4 Гбайта ОП. И только наличие страничного механизма позволяет транслировать эти 4 Гбайта в любое место 64-Гбайтного пространства.

Шина данных у процессоров 386 и 486 32-разрядная, начиная с Pentium – 64-разрядная. При этом во всех процессорах (в отличие от ВМ86) шины адреса и данных раздельные (не мультиплексные). Процессор может работать в следующих режимах.

1. Реальный режим. С точки зрения пользователя, МП в этом режиме представляет из себя аналог МП 8086, только более быстрый и с расширенной системой команд. Механизм формирования физического адреса в реальном режиме аналогичен подобному механизму МП 8086:

Аф = (sr)×16+Аэф.

Надо отметить, что сами процессы формирования Аф в 8086 и реальном режиме различны, а результат ‑ один и тот же. Так как сегментные регистры (sr) и Аэф ‑ 16-разрядные, то формируемый таким образом Аф будет 20-разрядным. Следовательно, в реальном режиме МП адресует 1Мбайт оперативной памяти (младший мегабайт 4-Гбайтного пространства памяти). Сегменты, как и в ВМ86 имеют фиксированный размер 64 Кбайта.

2. Режим виртуального 86-го процессора (V86). Этот режим предназначен для того, чтобы в защищенном режиме была возможность выполнять программы, написанные для ВМ86 (DOS-задачи). Работа процессора в этом режиме похожа на работу ВМ86, но сам режим V86 является подмножеством защищенного режима.

3. Режим SMM (system management mode – режим управления системой). Работа процессора в этом режиме «не видна» ни прикладным программам, ни даже операционной системе. Связано это с тем, что в этом режиме процессор адресует область памяти, недоступную в других режимах. Обычно в этом режиме процессор выполняет программу, написанную разработчиками аппаратуры. Чаще всего эта программа реализует системные функции пониженного энергопотребления. Попасть в режим SMM можно только по специальному внешнему аппаратному прерыванию SMI (system mode interrupt). Выход из режима SMM осуществляется специальной командой RSM (resume system mode).

4. Защищенный режим. В этом режиме раскрываются все возможности МП. В режиме используются все 32 адресных линии и может адресоваться память объемом до 4 Гбайт. Сегменты в защищенном режиме имеют переменный объем (1 байт ‑ 4 Гбайта). Одновременно МП может работать с 214  таких сегментов. Очевидно, что все сегменты могут не поместиться в реально существующей оперативной памяти (ОП), поэтому часть из них (а скорее всего большинство) находится на диске. Когда процессор обращается к сегменту, которого нет в ОП, происходит прерывание. Обработчик этого прерывания должен подка-чать с диска в ОП нужный сегмент, после чего происходит рестарт «виноватой» команды. От пользователя этот процесс скрыт и у него создается впечатление что в его распоряжении находится память объемом 64 Тбайта (214 сегментов по 4 Гбайта каждый, т.е. 246 байта). Такая память называется виртуальной (кажущаяся).

В защищенном режиме МП аппаратно поддерживает многозадачность. То есть в системе одновременно может находиться множество задач, а МП обеспечивает быстрое переключение между этими задачами. Наличие многозадачности приводит к ряду проблем, основные две из которых следующие: как переключаться с задачи на задачу и как защитить задачи друг от друга.

Для решения первой проблемы для каждой задачи в системе создается так называемый сегмент состояния задачи (TSS task state segment). Размер этого сегмента должен быть не менее 104-х байт. Когда МП переключается с задачи А на задачу В, то он автоматически запоминает контекст задачи А (содержимое почти всех своих внутренних регистров) в TSS задачи А, а затем также автоматически загружает в свои регистры контекст задачи В (из TSS задачи В). Тем самым обеспечивается переключение на задачу В и в то же время возможность возврата и продолжения выполнения задачи А. Под задачей понимается любой программный код, для которого в системе создан свой TSS. Создание TSS ‑ это функция ОС.

Для решения проблемы защиты задач друг от друга всем создаваемым в системе сегментам присваивается уровень привилегий. Возможно четыре уровня привилегий: 0,1,2 и 3, причем 0-й уровень самый старший. Уровень 3 (самый низкий) присваивается обычно сегментам  пользователя, уровень 0 ‑ сегментам ОС, а уровни 1 и 2 предназначены для расширения ОС и на практике часто не используются.

Если программа с уровнем привилегий А обращается к сегменту с уровнем привилегий В, то процессор проверяет условие А£В. Если условие выполняется, то доступ к сегменту предоставлен, если же условие не выполняется, то будет прерывание (нарушены права доступа к сегменту).

Механизм формирования физического адреса в защищенном режиме радикально отличается от механизма МП 8086. Для каждого создаваемого в системе сегмента создается (как правило, ОС) специальная структура, называемая дескриптором этого сегмента. Дескриптор занимает в памяти 8 байт и содержит все необходимые сведения о сегменте: начальный адрес сегмента, размер сегмента, уровень привилегий, атрибуты сегмента и.т.д. МП вычисляет физический адрес по формуле

Аф = начальный адрес сегмента+Аэф.

В отличие от 8086, начальный адрес сегмента не вычисляется, а берется готовым из дескриптора.

Все созданные в системы дескрипторы сводятся в дескрипторные таблицы. Любая задача может одновременно работать с двумя такими таблицами. Одна из них называется глобальной (GDT global descriptor table), а другая ‑ локальной (LDT local descriptor table). В GDT собраны дескрипторы сегментов, разделяемых всеми задачами в системе, а в LDT располагаются дескрипторы сегментов, с которыми работает только данная задача. GDT в системе одна и всегда должна находиться в ОП, а LDT может быть столько же, сколько и задач (для любой задачи LDT может быть создана, а может и не создаваться), и располагаться эти таблицы могут как в ОП, так и на диске.

Для того чтобы перейти к новому сегменту, надо обратиться к его дескриптору, т.е. надо найти этот дескриптор в дескрипторной таблице. Для этого необходимо знать начальный адрес таблицы и внутритабличное смещение (это смещение принято называть селектором дескриптора). Начальные адреса таблиц процессору известны, они хранятся в специальных внутренних регистрах МП, а смещение берется из сегментного регистра. Любой сегментный регистр в МП имеет формат, приведенный на рис. 3.1.

Видимая часть   Теневая часть

16 бит

 

64 бита

Рис. 3.1

Видимая часть доступна программисту, а с теневой частью работает сам МП. Видимая часть имеет формат, приведенный на рис. 3.2. Старшие 13 разрядов (биты 15 ‑ 3) занимает селектор, определяющий местоположение дескриптора в одной из двух  дескрипторных таблиц ( в какой именно задает бит TI (table indicator)).

15                       3

2

1    0 

Селектор

TI RPL

Рис. 3.2

При обращении к дескрипторной таблице к селектору справа дописываются три нуля и он становится 16-разрядным. Дело здесь в том, что размер дескриптора 8 байт и его смещение в таблице всегда кратно восьми. Биты 1 и 0 задают запрашиваемый уровень привилегий (RPL requested privilege level). Нетрудно видеть, что максимальное число дескрипторов в любой дескрипторной таблице 213 (поскольку селектор 13-разрядный), а максимальный размер таблицы равен 8×213 = 64 Кбайт. Так как одновременно процессору доступны две такие таблицы, то МП одновременно доступны 214 сегментов.

При обращении к новому сегменту в видимую часть сегментного регистра загружается новый селектор. По этому селектору в дескрипторной таблице МП находит дескриптор нового сегмента.

Проверяются права доступа и, если они не нарушены, то найденный дескриптор копируется (кэшируется) в теневую часть сегментного регистра (с тем чтобы в дальнейшем он был у МП «под рукой» и не требовалось каждый раз обращаться за ним в память).

Например, выполняется команда jmp 0008 : 00000002h. При этом 00000002h – это смещение в новом кодовом сегменте, и эта величина будет загружена (если не нарушены права доступа и другие условия) в регистр eip. Величина 0008h представляет из себя селектор, ссылающийся на 1-й дескриптор в GDT, TI = 0, RPL = 0 (рис. 3.3).

GDT

0-й дескриптор

1-й дескриптор

..

.

.

Рис. 3.3

Очевидно, что таким способом (из-за проверки прав доступа) нельзя обратиться к более привилегированному  сегменту, поскольку при этом будет прерывание (нарушены права доступа). В то же время должна быть возможность обращения к привилегированным сегментам, потому что в противном случае задачам пользователя вообще будут недоступны средства ОС. Для предоставления такой возможности в системе создаются специальные структуры называемые шлюзами (вентилями) (gate).

Шлюз ‑ структура, подобная дескриптору. Так же, как и дескрипторы, шлюзы занимают в памяти по 8 байт и располагаются в дескрипторных таблицах. Однако, если через дескриптор обращаемся к сегменту и при этом проверяется уровень привилегий, записанный в этом дескрипторе (рис. 3.4), то через шлюз обращаемся к дескриптору, на который ссылается этот шлюз (и далее через этот дескриптор к сегменту). При этом проверяется уровень привилегий, записанный в шлюзе, а уровень привилегий, записанный в дескрипторе, игнорируется (рис. 3.5). Здесь cpl (current privilege level) ‑ текущий уровень привилегий задачи, dpl (descriptor privilege level) – уровень привилегий сегмента, записанный в его дескрипторе. Уровень привилегий, записанный в шлюзе (dpl шлюза), задает минимальный уровень привилегий, на котором разрешается  «проход» через данный шлюз.

Рис. 3.4

Рис. 3.5

Отметим также, что проверки, приведенные на рис. 3.4 и 3.5, для простоты картины показаны несколько упрощенно. Более полно они будут рассмотрены позднее.

Обращаться через шлюзы можно только к исполняемым сегментам. К последним относятся сегменты кода и сегменты TSS.

Например, пусть выполняется программа с уровнем привилегий 3. В какой-то момент программа обращается к сегменту, в дескрипторе которого записан уровень приви-легий 0. Это обращение окончится неудачно (прерывани-ем). Однако, если в системе есть шлюз, ссылающийся на этот дескриптор и имеющий уровень привилегий 3, и нашей программе известно его месторасположение в таблице, то она может обратиться к этому шлюзу. Права доступа для шлюза нарушены не будут, что позволит программе обратиться к дескриптору. Права доступа дескриптора проверяться не будут и программа получит доступ к сегменту с уровнем привилегий 0.

Шлюзы бывают четырех типов.

1. Шлюз вызова. Может располагаться в таблицах GDT и LDT. Предназначен для вызова привилегированных подпрограмм.

2. Шлюз задачи. Может располагаться в GDT, LDT и IDT (interrupt descriptor table) (дескрипторная таблица прерываний). Предназначен для переключения на привилегированную задачу.

3. Шлюз прерываний. Может располагаться только в IDT. Служит для вызова обработчика внешнего прерыва-ния. При переходе через этот шлюз флаг if сбрасывается в ноль, т.е. запрещаются внешние прерывания.

4. Шлюз ловушки. Может располагаться только в IDT. Служит для вызова обработчика внутреннего прерывания (особого случая). Практически аналогичен шлюзу прерываний, только внешние прерывания не запрещаются.

Некоторые сегменты кода могут быть отмечены как согласованные (подчиненные) (conforming). Если обычный сегмент кода всегда выполняется на том уровне привилегий, который записан в его дескрипторе, то согласованный сегмент кода выполняется на том уровне привилегий, с которого он был вызван. То есть уровень привилегий, записанный в дескрипторе согласованного сегмента, в расчет не принимается и к такому сегменту можно обратиться с любого уровня привилегий.

Имеется одно исключение – ни к какому кодовому сегменту, в том числе и согласованному, нельзя обратиться с более высокого уровня привилегий. Обычно в согласованных сегментах располагаются системные библиотеки. Большинство сегментов в системе, как правило, согласованными не являются.

Зачастую для одного и того же сегмента в системе создаются сразу несколько дескрипторов. Такие дескрипторы называют альтернативными (или псевдонимами) (alias). Например, пусть некоторый сегмент данных разделяется задачей пользователя и ОС. При этом ОС может менять данные в этом сегменте, а задача пользователя может только считывать информацию из этого сегмента. Для того чтобы такая организация была возможна, придется создать два дескриптора этого сегмента. Одному сегменту будет присвоен 0-й уровень привилегий, и этот сегмент будет описан как доступный для чтения/записи, другому будет присвоен 3-й уровень привилегий и сегмент будет отмечен доступным только для чтения.



*****

© 2009-2017 Банк лекций siblec.ru
Лекции для преподавателей и студентов. Формальные, технические, естественные, общественные, гуманитарные, и другие науки.