Из каких частей состоит адрес ячейки памяти в реальном режиме работы процессора

Обновлено: 07.07.2024

Режимы работы процессора

Все 32-разрядные процессоры Intel (и совместимые с ними) начиная с 80386-го могут выполнять программы в нескольких режимах. Режимы процессора предназначены для выполнения программ в различных средах; в разных режимах возможности МП неодинаковы, потому что команды выполняются по-разному.

Режимы процессора.

В зависимости от режима процессора изменяется схема управления памятью системы и задачами. Процессоры могут работать в трех режимах:

  • Реальный режим (16-разрядное программное обеспечение).
  • Режим IA-32:
  • • защищенный режим (32-разрядное программное обеспечение);
  • • виртуальный реальный режим (16-разрядное программное обеспечение в 32-разрядной среде).
  • Расширенный 64-разрядный режим IA-32e (также называемый AMD64, x86-64 и EM64T):
  • • 64-разрядный режим (64-разрядное программное обеспечение);
  • • режим совместимости (32-разрядное программное обеспечение).

Реальный режим. В первоначальном IBM PC использовался процессор i8086, который мог выполнять 16-разрядные команды, применяя 16-разрядные внутренние регистры, и адресовать только 1 Мбайт (220 байт) памяти, используя 20 разрядов для адреса. Все программное обеспечение PC первоначально было предназначено для этого процессора; оно было разработано на основе 16-разрядной системы команд и модели памяти объемом 1 Мбайт. Например, DOS, все программное обеспечение DOS, Windows от 1.x до 3.x и все приложения для Windows от 1.x до 3.x написаны в расчете на 16-разрядные команды. Эти 16-разрядные операционные системы и приложения были разработаны для выполнения на процессоре i8086.

Более поздние процессоры, например i80286, могли также выполнять те же самые 16-разрядные команды, что и первоначальный i8086, но намного быстрее. Другими словами, процессор i80286 был полностью совместим с первоначальным i8086. Шестнадцатиразрядный режим, в котором выполнялись команды процессоров i8086 и i80286, был назван реальным режимом. Все программы, выполняющиеся в реальном режиме, должны использовать только 16-разрядные команды, 20-разрядные адреса и поддерживаться архитектурой памяти, рассчитанной на емкость до 1 Мбайт.

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

Защищенный режим. Несмотря на то, что процессор i80286, как и i8086, является 16-разрядным, он (в отличие от последнего) может работать в новом — защищенном — режиме и имеет аппаратурную поддержку многозадачных операционных систем, значительно ускоряющую и упрощающую процесс переключения задач. Эта поддержка активно используется всеми мультизадачными операционными системами и оболочками, разработанными для компьютера IBM PC.

Адресная шина i80286 была увеличена с 20 до 24 разрядов, что привело к расширению адресного пространства с 1 до 16 Мбайт (224 байт). Новый метод адресации памяти позволил изолировать адресные пространства отдельных задач друг от друга. При этом прикладная программа, работающая в среде операционной системы, использующей защищенный режим, не может случайно или намеренно разрушить целостность самой операционной системы.

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

Следующие модели процессоров фирмы Intel — i80386, i80486 и i80586 (Pentium) были 32-разрядными. Помимо расширения адресного пространства до величины в 4 Гбайта (232 байт) в них реализована концепция страничной виртуальной памяти, возможной только в защищенном режиме.

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

Перечислим кратко основные преимущества, которые получает программа, работающая в защищенном режиме процессора:

· возможность непосредственной адресации памяти за пределами первого мегабайта;

· для процессоров i80x86 реализован механизм страничной виртуальной памяти, позволяющий программам работать с памятью, размер которой может быть много больше физической оперативной памяти, установленной в компьютере;

· аппаратная поддержка мультизадачности позволяет создавать на основе процессоров, работающих в защищенном режиме, высокопроизводительные мультизадачные и мультипользовательские системы.

Виртуальный реальный режим. Помимо страничной виртуальной памяти в процессорах i80386 и более поздних реализован так называемый режим виртуального процессора i8086 или просто виртуальный режим. Этот режим реализуется в рамках защищенного режима (процессор может переключиться в виртуальный режим только из защищенного режима). В виртуальном режиме процессор способен выполнять программы, составленные для процессора i8086, находясь в защищенном режиме и используя аппаратные средства защищенного режима: мультизадачность, изолирование адресных пространств отдельных задач друг от друга, страничная виртуальная память.

Реальный режим процессора 80х86. Это режим генерирования адресов, используемый процессором 8086. В этом режиме не может быть использована виртуальная память. Можно адресовать лишь до 1 Мбайт (220 байт) оперативной памяти, так как у процессора 8086 20-разрядная шина адреса. Так как все регистры процессора 8086 являются 16-разрядными, для представления 20-разрядного физического адреса памяти используется содержимое нескольких 16-разрядных регистров.

Оперативную память при работе в этом режиме можно разбить на логические блоки по 64 Кбайт, называемые сегментами, причем каждый сегмент может начинаться с адреса, кратного 16 байт. Таким образом, первый сегмент имеет начальный адрес 0, второй находится по адресу 16 (или 10 в шестнадцатеричной системе) и т. д. Несколько близко расположенных сегментов могут перекрываться. Это удобно при организации совместного доступа к командам и данным разными программами. Доступ к каждой ячейке в памяти происходит путем указания значения регистра сегмента (см. далее), определяющего блок размером 64 Кбайт, и положения, или смеще¬ния, этого адреса внутри этого блока.

Микропроцессор использует четыре регистра сегмента, при этом каждый регистр имеет размер, равный одному слову (16 бит):

· регистр сегмента команд CS (Code Segment), указывающий на сегмент, содержащий текущую исполняемую программу;

· регистр сегмента данных DS (Data Segment), указывающий на данные;

· регистр дополнительного сегмента ES (Extra Segment), указывающий на дополнительные данные;

· регистр сегмента стека SS (Stack Segment), указывающий на стек.

У процессора 80386 и старше есть еще два сегментных регистра — FS и GS.

Содержимое каждого из этих регистров однозначно связано с местом в памяти соответствующего сегмента. Его адрес получается приписыванием справа четырех двоичных нулей к значению сегмента, что соответствует умножению на 16 (или на 10 по основанию 16). Полученное 20-битовое значение представляет собой адрес начала (или базовый адрес) сегмента в физической памяти. Для определения реального адреса команды или данных процессор добавляет затем значение смещения к базовому адресу.

Например, команда, подлежащая исполнению процессором в каждый данный момент времени, определяется из значений двух регистров: регистра CS, значение которого, будучи умножено на 16, дает адрес начала сегмента команд, и регистра указателя команд IP (instruction Pointer), указывающего положение соответствующей команды относительно начала сегмента команд.

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

Выделим два основных недостатка схемы адресации памяти реального режима:

· ограниченное адресное пространство (до 1 Мбайта и еще примерно 64 Кбайта старшей области памяти для процессоров 80286 и старше);

· свободный доступ любых программ к любым областям данных, что представляет потенциальную опасность для целостности операционной системы.

Рассмотрим работу в защищенном режиме процессоров 80286, 80386 и более старших моделей.

Адресация в защищенном режиме 16-разрядного МП 80286

В этом режиме механизм адресации отличается от механизма адресации в реальном режиме. За счет использования 24-битной адресной шины процессора 80286 физическое адресное пространство достигает 16 Мбайт (224 байт).

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

Дескриптор содержит физический адрес начала сегмента в памяти (базовый адрес), его размер, а также другую информацию. Базовый адрес размещается в 24 битах (а не в 20, как для реального режима), поэтому сегменты не обязательно теперь должны быть выровнены на адрес, кратный 16. Размер сегмента указывается в 16 битах, и поэтому может принимать любые значения, меньшие или равные 64 Кбайт. В этом состоит фундаментальное отличие от реального режима, где каждый сегмент по умолчанию имеет размер 64 Кбайт. После определения базового адреса сегмента к нему прибавляется значение смещения (размещаемого в 16 битах), и процессор может обратиться к соответствующей ячейке памяти. Очевидно, что метод вычисления физических адресов в защищенном режиме значительно сложнее, чем в реальном режиме. Однако эти вычисле¬ния выполняются процессором и «прозрачны» для программиста, для которого механизм адресации выглядит неизменным. Действительно, как и в реальном режиме, команды, стек и данные адресуются с помощью соответствующего регистра сегмента (называемого селектором) и смещения.

Мне периодически приходится объяснять разным людям некоторые аспекты архитектуры Intel® IA-32, в том числе замысловатость системы адресации данных в памяти, которая, похоже, реализовала почти все когда-то придуманные идеи. Я решил оформить развёрнутый ответ в этой статье. Надеюсь, что он будет полезен ещё кому-нибудь.
При исполнении машинных инструкций считываются и записываются данные, которые могут находиться в нескольких местах: в регистрах самого процессора, в виде констант, закодированных в инструкции, а также в оперативной памяти. Если данные находятся в памяти, то их положение определяется некоторым числом — адресом. По ряду причин, которые, я надеюсь, станут понятными в процессе чтения этой статьи, исходный адрес, закодированный в инструкции, проходит через несколько преобразований.


На рисунке — сегментация и страничное преобразование адреса, как они выглядели 27 лет назад. Иллюстрация из Intel 80386 Programmers's Reference Manual 1986 года. Забавно, что в описании рисунка есть аж две опечатки: «80306 Addressing Machanism». В наше время адрес подвергается более сложным преобразованиям, а иллюстрации больше не делают в псевдографике.

Начнём немного с конца — с цели всей цепочки преобразований.

Физический адрес


Конечный результат всех преобразований других типов адресов, перечисленных далее в этой статье — физический адрес. На нём кончается работа внутри центрального процессора по преобразованию адресов.
На самом деле, легко понять, что это ещё не конец. В платформе, которая должна обработать запрос данных от процессора, может быть несколько чипов DRAM, имеющих собственную структуру разбиения на блоки, а также различные периферийные устройства, отображённые на общее пространство физической памяти. Дальнейший путь транзакции с некоторым физическим адресом будет зависеть от конфигурации нескольких декодеров, находящихся на её пути внутри устройств платформы.

Эффективный адрес

Эффективный адрес — это начало пути. Он задаётся в аргументах индивидуальной машинной инструкции, и вычисляется из значений регистров, смещений и масштабирующих коэффициентов, заданных в ней явно или неявно.

Например, для инструкции (ассемблер в AT&T-нотации)

addl %eax, 0x11(%ebp, %edx, 8)

эффективный адрес операнда-назначения будет вычислен по формуле:

eff_addr = EBP + EDX * 8 + 0x11

Логический адрес

Без знания номера и параметров сегмента, в котором указан эффективный адрес, последний бесполезен. Сам сегмент выбирается ещё одним числом, именуемым селектором. Пара чисел, записываемая как selector:offset , получила имя логический адрес. Так как активные селекторы хранятся в группе специальных регистров, чаще всего вместо первого числа в паре записывается имя регистра, например, ds:0x11223344.

Здесь обычно у тех, кто столкнулся с этими понятиями впервые, голова начинает идти кругом. Несколько упростить (или усложнить) ситуацию помогает тот факт, что почти всегда выбор селектора (и связанного с ним сегмента) делается исходя из «смысла» доступа. По умолчанию, если в кодировке машинной инструкции не сказано иного, для получения адресов кода используются логические адреса с селектором CS, для данных — с DS, для стека — с SS.

Линейный адрес

Эффективный адрес — это смещение от начала сегмента — его базы. Если сложить базу и эффективный адрес, то получим число, называемое линейным адресом:

lin_addr = segment.base + eff_addr

Преобразование логический → линейный не всегда может быть успешным, так как при его исполнении проверяется несколько условий на свойства сегмента, записанных в полях его дескриптора. Например, проверяется выход за границы сегмента и права доступа.

Описанное выше верно при включенной сегментации. В 16-битном реальном режиме смысл селекторов другой, они хранят только базу, а преобразование не осуществляет сегментных проверок. Фактически, обозначения CS, DS, FS, GS, ES, SS имеют совершенно разный смысл в этих двух режимах, что добавляет путаницы.

Сегментация была модной на некотором этапе развития вычислительной техники. В настоящее она почти всюду была заменена другими механизмами, и используется только для специфических задач. Так, в режиме IA-32e (64-битном) только два сегмента могут иметь ненулевую базу. Для остальных четырёх в этом режиме всегда линейный адрес == эффективный.

Что такое виртуальный адрес?

В литературе и в документации других архитектур встречается ещё один термин — виртуальный адрес. Он не используется в документации Intel на IA-32, однако встречается, например, в описании Intel® Itanium, в котором сегментация не используется. Можно смело считать, что для IA-32 виртуальный == линейный.
В советской литературе по вычислительной технике этот вид адресов также именовался математическим.

Страничное преобразование


Следующее после сегментации преобразование адресов: линейный → физический — имеет множество вариаций в своём алгоритме, в зависимости от того, в каком режиме (32-битном, PAE или 64-битном) находится процессор.
Примечательно, сколько различных бит из разных системных регистров процессора влияют на процесс страничного преобразования в настоящее время. Я просмотрел свежую сентябрьскую редакцию Intel SDM [1], и вот полный список: CR0.WP, CR0.PG, CR4.PSE, CR4.PAE, CR4.PGE, CR4.PCIDE, CR4.SMEP, CR4.SMAP, IA32_EFER.LME, IA32_EFER.NXE, EFLAGS.AC.

Однако общая идея всегда одна и та же: линейный адрес разбивается на несколько частей, каждая из которых служит индексом в одной из системных таблиц, хранящихся в памяти. Записи в таблицах — это адреса начала таблицы следующего уровня или, для последнего уровня — искомая информация о физическом адресе страницы в памяти и её свойствах. Самые младшие биты не преобразуются, а используются для адресации внутри найденной страницы. Например, для режима PAE с размером страниц 4 кбайт преобразование выглядит так:


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

Гостевой физический

До введения возможностей аппаратной виртуализации в процессорах Intel страничное преобразование было последним в цепочке. Когда же на одной системе работают несколько виртуальных машин, то физические адреса, получаемые в каждой из них, приходится транслировать ещё один раз. Это можно делать программным образом, или же аппаратно, если процессор поддерживает функциональность EPT (англ. Extended Page Table). Адрес, раньше называвшийся физическим, был переименован в гостевой физический для того, чтобы отличать его от настоящего физического. Они связаны с помощью EPT-преобразования. Алгоритм последнего схож с ранее описанным страничным преобразованием: набор связанных таблиц с общим корнем, последний уровень которых определяет, существует ли физическая страница для указанной гостевой физической.

Полная картина

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


Как уже было сказано выше, каждое из преобразований может вернуть ошибку для адресов, не имеющих представления в следующем по цепочке виде. Устранение подобных проблем — это задача операционных систем и мониторов виртуальных машин, реализующих абстракцию виртуальной памяти.

2.1. Процессор.

Самый основной элемент компьютера, это, конечно, процессор. Давайте подробней его рассмотрим. Упрощённая структура процессора (рис. 4):


Рис. 4. Упрощённая структура процессора

Основные элементы процессора:

· Регистры – это специальные ячейки памяти, физически расположенные внутри процессора. В отличие от ОЗУ, где для обращения к данным требуется использовать шину адреса, к регистрам процессор может обращаться напрямую. Это существенно ускорят работу с данными.

· Арифметико-логическое устройство выполняет арифметические операции, такие как сложение, вычитание, а также логические операции.

· Блок управления определяет последовательность микрокоманд, выполняемых при обработке машинных кодов (команд).

· Тактовый генератор , или генератор тактовых импульсов, задаёт рабочую частоту процессора.

2.2. Режимы работы процессора.

Процессор архитектуры x86 может работать в одном из пяти режимов и переключаться между ними очень быстро:

1. Реальный (незащищенный) режим (real address mode) — режим, в котором работал процессор 8086. В современных процессорах этот режим поддерживается в основном для совместимости с древним программным обеспечением (DOS-программами).

2. Защищенный режим (protected mode) — режим, который впервые был реализован в 80286 процессоре. Все современные операционные системы (Windows, Linux и пр.) работают в защищенном режиме. Программы реального режима не могут функционировать в защищенном режиме.

3. Режим виртуального процессора 8086 (virtual-8086 mode, V86) — в этот режим можно перейти только из защищенного режима. Служит для обеспечения функционирования программ реального режима, причем дает возможность одновременной работы нескольких таких программ, что в реальном режиме невозможно. Режим V86 предоставляет аппаратные средства для формирования виртуальной машины, эмулирующей процессор8086. Виртуальная машина формируется программными средствами операционной системы. В Windows такая виртуальная машина называется VDM (Virtual DOS Machine — виртуальная машина DOS). VDM перехватывает и обрабатывает системные вызовы от работающих DOS-приложений.

4. Нереальный режим (unreal mode, он же big real mode) — аналогичен реальному режиму, только позволяет получать доступ ко всей физической памяти, что невозможно в реальном режиме.

5. Режим системного управления System Management Mode (SMM) используется в служебных и отладочных целях.

При загрузке компьютера процессор всегда находится в реальном режиме, в этом режиме работали первые операционные системы, например MS-DOS, однако современные операционные системы, такие как Windows и Linux переводят процессор в защищенный режим. Вам, наверное, интересно, что защищает процессор в защищенном режиме? В защищенном режиме процессор защищает выполняемые программы в памяти от взаимного влияния (умышленно или по ошибке) друг на друга, что легко может произойти в реальном режиме. Поэтому защищенный режим и назвали защищенным.

2.3. Регистры процессора (программная модель процессора).

Для понимания работы команд ассемблера необходимо четко представлять, как выполняется адресация данных, какие регистры процессора и как могут использоваться при выполнении инструкций. Рассмотрим базовую программную модель процессоров Intel 80386, в которую входят:

· 8 регистров общего назначения, служащих для хранения данных и указателей;

· регистры сегментов — они хранят 6 селекторов сегментов;

· регистр управления и контроля EFLAGS, который позволяет управлять состоянием выполнения программы и состоянием (на уровне приложения) процессора;

· регистр-указатель EIP выполняемой следующей инструкции процессора;

· система команд (инструкций) процессора;

· режимы адресации данных в командах процессора.

Начнем с описания базовых регистров процессора Intel 80386.

Базовые регистры процессора Intel 80386 являются основой для разработки программ и позволяют решать основные задачи по обработке данных. Все они показаны на рис. 5.


Рис. 5. Базовые регистры процессора Intel 80386

Среди базового набора регистров выделим отдельные группы и рассмотрим их назначение.

2.4. Регистры общего назначения.

Остальные четыре регистра – ESI (индекс источника), EDI (индекс приемника), ЕВР (указатель базы), ESP (указатель стека) – имеют более конкретное назначение и применяются для хранения всевозможных временных переменных. Регистры ESI и EDI необходимы в строковых операциях, ЕВР и ESP – при работе со стеком. Так же как и в случае с регистрами ЕАХ - EDX, младшие половины этих четырех регистров называются SI, DI, BP и SP соответственно, и в процессорах до 80386 только они и присутствовали.

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

При использовании сегментированных моделей памяти для формирования любого адреса нужны два числа – адрес начала сегмента и смещение искомого байта относительно этого начала (в бессегментной модели памяти flat адреса начал всех сегментов равны). Операционные системы (кроме DOS) могут размещать сегменты, с которыми работает программа пользователя, в разных местах памяти и даже временно записывать их на диск, если памяти не хватает. Так как сегменты способны оказаться где угодно, программа обращается к ним, применяя вместо настоящего адреса начала сегмента 16-битное число, называемое селектором. В процессорах Intel предусмотрено шесть 16-битных регистров - CS, DS, ES, FS, GS, SS , где хранятся селекторы. (Регистры FS и GS отсутствовали в 8086, но появились уже в 80286.) Это означает, что в любой момент можно изменить параметры, записанные в этих регистрах.

В отличие от DS, ES, GS, FS, которые называются регистрами сегментов данных, CS и SS отвечают за сегменты двух особенных типов – сегмент кода и сегмент стека. Первый содержит программу, исполняющуюся в данный момент, следовательно, запись нового селектора в этот регистр приводит к тому, что далее будет исполнена не следующая по тексту программы команда, а команда из кода, находящегося в другом сегменте, с тем же смещением. Смещение очередной выполняемой команды всегда хранится в специальном регистре EIP (указатель инструкции, 16-битная форма IP), запись в который так же приведет к тому, что далее будет исполнена какая-нибудь другая команда. На самом деле все команды передачи управления – перехода, условного перехода, цикла, вызова подпрограммы и т.п. – и осуществляют эту самую запись в CS и EIP.

2.6. Регистр флагов.

Еще один важный регистр, использующийся при выполнении большинства команд, - регистр флагов. Как и раньше, его младшие 16 бит, представлявшие собой весь этот регистр до процессора 80386, называются FLAGS. В EFLAGS каждый бит является флагом, то есть устанавливается в 1 при определенных условиях или установка его в 1 изменяет поведение процессора. Все флаги, расположенные в старшем слове регистра, имеют отношение к управлению защищенным режимом, поэтому здесь рассмотрен только регистр FLAGS (см. рис. 6):


Рис. 6. Регистр флагов FLAGS.

CF – флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании), в противном случае – в 0. Например, после сложения слова 0 FFFFh и 1, если регистр, в который надо поместить результат, – слово, в него будет записано 0000 h и флаг CF = 1.

PF – флаг четности. Устанавливается в 1, если младший байт результата предыдущей команды содержит четное число битов, равных 1, и в 0, если нечетное. Это не то же самое, что делимость на два. Число делится на два без остатка, если его самый младший бит равен нулю, и не делится, когда он равен 1.

AF – флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего бита в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции.

ZF – флаг нуля. Устанавливается в 1, если результат предыдущей команды – ноль.

SF – флаг знака. Он всегда равен старшему биту результата.

TF – флаг ловушки. Он был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой программной команды управление временно передается отладчику.

IF – флаг прерываний. Сброс этого флага в 0 приводит к тому, что процессор перестает обрабатывать прерывания от внешних устройств. Обычно его сбрасывают на короткое время для выполнения критических участков кода.

DF – флаг направления. Он контролирует поведение команд обработки строк: когда он установлен в 1, строки обрабатываются в сторону уменьшения адресов, когда DF =0 – наоборот.

OF – флаг переполнения. Он устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице, то есть отрицательное, и наоборот.

Флаги IOPL (уровень привилегий ввода-вывода) и NT (вложенная задача) применяются в защищенном режиме.

2.7. Цикл выполнения команды

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

Для того чтобы процессор знал, какую команду нужно выполнять в определённый момент, существует счётчик команд – специальный регистр, в котором хранится адрес команды, которая должна быть выполнена после выполнения текущей команды. То есть при запуске программы в этом регистре хранится адрес первой команды. В процессорах Intel в качестве счётчика команд (его ещё называют указатель команды) используется регистр EIP (или IP в 16-разрядных программах).

Счётчик команд работает со сверхоперативной памятью, которая находится внутри процессора. Эта память носит название очередь команд, куда помещается одна или несколько команд непосредственно перед их выполнением. То есть в счётчике команд хранится адрес команды в очереди команд, а не адрес оперативной памяти.

Цикл выполнения команды – это последовательность действий, которая совершается процессором при выполнении одной машинной команды. При выполнении каждой машинной команды процессор должен выполнить как минимум три действия: выборку, декодирование и выполнение. Если в команде используется операнд, расположенный в оперативной памяти, то процессору придётся выполнить ещё две операции: выборку операнда из памяти и запись результата в память. Ниже описаны эти пять операций.

  • Выборка команды . Блок управления извлекает команду из памяти (из очереди команд), копирует её во внутреннюю память процессора и увеличивает значение счётчика команд на длину этой команды (разные команды могут иметь разный размер).
  • Декодирование команды . Блок управления определяет тип выполняемой команды, пересылает указанные в ней операнды в АЛУ и генерирует электрические сигналы управления АЛУ, которые соответствуют типу выполняемой операции.
  • Выборка операндов . Если в команде используется операнд, расположенный в оперативной памяти, то блок управления начинает операцию по его выборке из памяти.
  • Выполнение команды . АЛУ выполняет указанную в команде операцию, сохраняет полученный результат в заданном месте и обновляет состояние флагов, по значению которых программа может судить о результате выполнения команды.
  • Запись результата в память . Если результат выполнения команды должен быть сохранён в памяти, блок управления начинает операцию сохранения данных в памяти.

Суммируем полученные знания и составим цикл выполнения команды:

  1. Выбрать из очереди команд команду, на которую указывает счётчик команд.
  2. Определить адрес следующей команды в очереди команд и записать адрес следующей команды в счётчик команд.
  3. Декодировать команду.
  4. Если в команде есть операнды, находящиеся в памяти, то выбрать операнды.
  5. Выполнить команду и установить флаги.
  6. Записать результат в память (по необходимости).
  7. Начать выполнение следующей команды с п.1.

Это упрощённый цикл выполнения команды. К тому же действия могут отличаться в зависимости от процессора. Однако это даёт общее представление о том, как процессор выполняет одну машинную команду, а значит и программу в целом.

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

До выпуска 80286 , который вводил защищенный режим , реальный режим был единственным доступным режимом для процессоров x86; и для обратной совместимости все процессоры x86 запускаются в реальном режиме при сбросе, хотя можно эмулировать реальный режим в других системах при запуске в других режимах.

СОДЕРЖАНИЕ

История

В архитектуре 286 введен защищенный режим , позволяющий (среди прочего) защитить память на аппаратном уровне. Однако для использования этих новых функций требовалась новая операционная система , специально разработанная для защищенного режима. Поскольку основная спецификация конструкции микропроцессоров x86 заключается в том, что они полностью обратно совместимы с программным обеспечением, написанным для всех чипов x86 до них, чип 286 был настроен для запуска в `` реальном режиме '', то есть в режиме, при котором новая память отключалась. функции защиты, чтобы он мог запускать операционные системы, написанные для 8086 и 8088 . По состоянию на 2018 год текущие процессоры x86 (включая процессоры x86-64 ) могут загружать операционные системы в реальном режиме и могут запускать программное обеспечение, написанное практически для любого предыдущего чипа x86, без эмуляции или виртуализации.

BIOS ПК, представленный IBM, работает в реальном режиме, как и операционные системы DOS ( MS-DOS , DR-DOS и т. Д.). Ранние версии Microsoft Windows работали в реальном режиме. Windows / 386 позволила частично использовать защищенный режим, и это было более полно реализовано в Windows 3.0 , которая могла работать либо в реальном режиме, либо в защищенном режиме, как в Windows / 386. В Windows 3.0 на самом деле было несколько режимов: «реальный режим», «стандартный режим» и «386-расширенный режим», последний требовал некоторых функций виртуализации процессора 80386 и, таким образом, не мог работать на 80286. Windows 3.1 удалила поддержку для реального режима, и это была первая основная операционная среда, для которой требовался как минимум процессор 80286. Ни одна из этих версий не могла считаться современной операционной системой x86, поскольку они перешли в защищенный режим только для определенных функций. Unix , Linux , OS / 2 , Windows NT 3.x и более поздние версии Windows NT и т. Д. Считаются современными ОС, поскольку они переключают ЦП в защищенный режим при запуске, никогда не возвращаются в реальный режим и предоставляют все преимущества защищенного режима. Все время. 64-битные операционные системы используют реальный режим только на этапе запуска, а ядро ​​ОС переводит процессор в длительный режим . Стоит отметить, что защищенный режим 80286 значительно более примитивен, чем улучшенный защищенный режим, представленный в 80386; последний иногда называют защищенным режимом 386, и это режим, в котором работают современные 32-разрядные операционные системы x86.

Емкость адресации

8086, 8088 и 80186 имеют 20-битную адресную шину, но необычная схема сегментированной адресации, которую Intel выбрала для этих процессоров, фактически дает эффективные адреса, которые могут иметь 21 значащий бит. Эта схема сдвигает 16-разрядный номер сегмента на четыре бита влево (делая 20-разрядное число с четырьмя младшими нулями) перед добавлением к нему 16-разрядного смещения адреса; максимальная сумма возникает, когда и сегмент, и смещение равны 0xFFFF, что дает 0xFFFF0 + 0xFFFF = 0x10FFEF. На 8086, 8088 и 80186 результат эффективного адреса, который выходит за пределы 20 битов, заключается в том, что адрес "оборачивается" до нулевого конца диапазона адресов, т. Е. Берется по модулю 2 ^ 20 (2 ^ 20 = 1048576 = 0x100000). Однако 80286 имеет 24 бита адреса и вычисляет эффективные адреса до 24 бит даже в реальном режиме. Следовательно, для сегмента 0xFFFF и смещения больше 0x000F 80286 фактически сделает доступ к началу второго мегабайта памяти, тогда как 80186 и более ранние будут обращаться к адресу, равному [offset] -0x10, который находится в начало первого мегабайта. (Обратите внимание, что на 80186 и более ранних версиях первый килобайт адресного пространства, начиная с адреса 0, является постоянным неподвижным местоположением таблицы векторов прерываний.) Итак, фактический объем памяти, адресуемой процессорами 80286 и более поздними версиями x86. в реальном режиме это 1 МБ + 64 КБ - 16 Б = 1,114,096 Б.

Линия A20

Переход в реальный режим

Intel представила защищенный режим в семействе x86 с намерением, чтобы операционные системы, в которых он использовался, работали полностью в новом режиме и чтобы все программы, работающие в операционной системе защищенного режима, также работали в защищенном режиме. Из-за существенных различий между реальным режимом и даже довольно ограниченным 286 защищенным режимом программы, написанные для реального режима, не могут работать в защищенном режиме без перезаписи. Поэтому, имея широкую базу существующих приложений реального режима, от которых зависели пользователи, отказ от реального режима создавал проблемы для отрасли, и программисты искали способ переключаться между режимами по своему желанию. Однако Intel, в соответствии со своими намерениями в отношении использования процессора, предоставила простой способ переключения в защищенный режим на 80286, но не простой способ вернуться в реальный режим. До модели 386 единственным способом переключения из защищенного режима обратно в реальный режим был сброс процессора; после сброса он всегда запускается в реальном режиме, чтобы быть совместимым с более ранними процессорами x86 обратно на 8086. Перезагрузка процессора не очищает ОЗУ системы, поэтому это, хотя и неудобно и неэффективно, на самом деле возможно. В защищенном режиме состояние процессора сохраняется в памяти, затем процессор сбрасывается, перезапускается в реальном режиме и выполняет некоторый код реального режима для восстановления сохраненного состояния из памяти. Затем он может запускать другой код реального режима, пока программа не будет готова вернуться в защищенный режим. Переход в режим реального времени является дорогостоящим с точки зрения времени, но этот метод позволяет защищенный режим программ для служб использования , таких как BIOS, которая работает полностью в режиме реального времени (будучи первоначально разработан для 8088 -На IBM Personal Computer Модель (тип машины) 5150). Этот метод переключения режимов также используется DPMI (под реальной, а не эмулируемой DOS) и расширителями DOS, такими как DOS / 4GW, чтобы позволить программам защищенного режима работать под DOS; система DPMI или расширитель DOS переключается в реальный режим для вызова вызовов DOS или BIOS, а затем переключается обратно, чтобы вернуться к прикладной программе, которая работает в защищенном режиме.

Отклонить

Переход к ядру NT привел к тому, что операционная система не нуждалась в DOS для загрузки компьютера, а также не могла ее использовать. Необходимость перезагрузки компьютера в реальном режиме MS-DOS уменьшилась после Windows 3.1x, пока она больше не поддерживалась в Windows ME . Единственный способ в настоящее время запускать приложения DOS, требующие реального режима из более новых версий Windows, - это использовать эмуляторы, такие как DOSBox или продукты виртуализации x86 .

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