Intel 80386 (также известный как i386 или просто 386) — 32-битный микропроцессор с архитектурой x86 третьего поколения фирмы Intel, выпущенный 17 октября 1985 года. Данный процессор был первым 32-разрядным процессором для PC. Применялся, преимущественно, в настольных и портативных ПК. В настоящее время в основном используется в контроллерах.
Описание
Процессор i386 полностью совместим со своими предшественниками — процессорами 8086—80186—80286. Он выполняет программы, предназначенные для них, без необходимости модификации кода и перекомпиляции (или с минимальными модификациями), и делает это более эффективно: затрачивает на выполнение меньшее число тактов синхронизации; имеет более высокие тактовые частоты за счёт использования новых технологий; имеет увеличенный, по сравнению с предыдущими процессорами, буфер предвыборки команд — 16 байт (которых хватает примерно на пять команд); буфер предвыборки обеспечивает меньшее количество обращений за командами и исключает лишние обращения в память в коротких циклах и выполнении строковых команд.
Вместе с тем i386 является серьёзной переработкой процессора 80286. По некоторым оценкам, ни до, ни после i386 архитектура процессоров x86 ни разу не переделывалась столь кардинально. В процессорах этой архитектуры впервые были введены основные механизмы поддержки современных 32-разрядных операционных систем для PC-совместимых платформ.
Основные изменения:
32 бита Вся архитектура x86 была расширена до 32 бит — все регистры (за исключением сегментных) стали 32-битными, получив в названии префикс «E» (EAX, EBX, EIP, EFLAGS и т. п.), с сохранением полного набора команд для работы с ними. В том числе: регистр флагов, получивший множество новых флагов для управления многозадачностью регистр управления процессором MSW процессора 80286, названный в i386 «CR0»
32-битной стала и адресация в защищённом режиме (с возможностью создания 16-битных сегментов для совместимости с 80286). Она позволила впервые со времени появления 8086 забыть о сегментации, а точнее, ограничении размера сегмента 64 килобайтами (ограничение 16-битного адреса), которое давно перестало устраивать программистов.
До появления i386 программы и операционные системы использовали несколько головоломных моделей организации памяти (крохотная — tiny, малая — small, большая — large, огромная — huge), различающихся по организации в памяти сегментов кода, стека и данных. 32-битный адрес позволил использовать вместо них одну простую плоскую модель () — 32-битный вариант крохотной модели, в которой все сегменты задачи находятся в одном адресном пространстве. Плоская модель обеспечивает размер такого «общего» сегмента до почти 4 гигабайт, которых по тем временам хватало для любой мыслимой задачи.
Плоская модель имеет и недостатки: в ней появляются проблемы перемещаемости машинного кода, которые ранее легко обходились сегментацией, обеспечение перемещаемости легло на плечи операционных систем с новыми форматами дискового образа программы. плоская модель практически сводит на нет управление памятью в защищённом режиме (ограничение доступа и поддержка виртуальной памяти), которое до i386 могло выполняться только на уровне сегментации. Только появление новой модели управления памятью — страничного преобразования — обеспечило плоской модели её сегодняшнюю популярность.
Плоская модель вошла в обиход столь широко, что современные программисты зачастую и не подозревают, что программы обращаются в память через сегменты.
Страничное преобразование
В i386 был введён новый механизм управления памятью — адресное пространство, к которому обращается процессор за данными и кодом, в котором располагаются сегменты (названное линейным адресным пространством) может не соответствовать реальной физической памяти. Физическая память (включая буфера внешних устройств, например, видеобуфер) может быть отображена в линейное адресное пространство произвольным образом — каждая страница (размером 4 килобайта) линейного пространства может быть переадресована на любую страницу физической памяти через каталог страниц, располагающийся в оперативной памяти (адрес каталога страниц определяется значением нового регистра управления «CR3»).
Как и сегменты, страницы линейного адресного пространства могут быть объявлены неприсутствующими (обращение к таким страницам вызывает обработчик страничного нарушения операционной системы). Неприсутствующие страницы, в первую очередь, используются для организации виртуальной памяти — обработчик страничного нарушения осуществляет свопинг страниц памяти со внешними запоминающими устройствами. Также неприсутствующие страницы используются в плоской модели памяти (где размер сегмента обычно имеет размер от 2 до 4 гигабайт, даже если у компьютера не имеется столько физической памяти) для маркировки страниц сегмента, в которые операционная система не выделила памяти. В этом случае страничное нарушение обычно завершает задачу или начинает её отладку.
Через страничное преобразование i386 может адресовать до 4 Гбайт физической памяти и до 64 Гбайт виртуальной памяти.
Улучшенная поддержка многозадачности и защиты
Поддержка многозадачности в процессорах x86 обозначает аппаратную поддержку «прозрачного» переключения с одной обычной программы (задачи) на другую. При переключении процессор сохраняет своё состояние (включая адрес следующей команды, селекторы сегментов) в сегменте состояния (TSS; сегмент памяти, с селектором из регистра TR) одной задачи, после чего восстанавливает состояние другой задачи из её сегмента состояния (селектор сегмента состояния новой задачи загружается из дескриптора её сегмента кода).
Переключение между задачами обычно осуществляется: прерыванием таймера; время, на которое настроен таймер, называется квантом времени для задачи системным вызовом (вызовом функции операционной системы) исключением — например, при попытке выполнить недопустимую команду или обращении к неприсутствующей памяти отладкой
В i386 механизмы защиты и многозадачности были значительно расширены и улучшены. В зависимости от характера нарушений они могут тихо игнорироваться (например, некоторые биты регистра EFLAGS нельзя изменить загрузкой флагов из стека), вызывать обработчик исключения (операционной системы). Серьёзные ошибки на уровне операционной системы (или в реальном режиме) могут привести процессор в режим аварийной остановки (например, при нарушении в обработчике двойного нарушения), из которого можно выйти только аппаратным сбросом () процессора.
Например, i386 поддерживает ограничение доступа к портам ввода-вывода и флагу запрещения прерываний через: назначение необходимого уровня привилегий для выполнения таких команд (двухбитным полем IOPL регистра флагов) разрешением задаче выборочного доступа к портам ввода-вывода через битовую карту в сегменте состояния задачи
Попытка исполнения неразрешённой команды ввода-вывода приводит к исключению, обработчик которого (принадлежащий операционной системе) может завершить задачу по ошибке, игнорировать (возобновить выполнение со следующей команды) или эмулировать ввод-вывод.
Кроме всего, многозадачность i386 полностью поддерживает все новые возможности — для 32-битных задач сегмент состояния содержит все 32-битные и необходимые новые регистры (например, регистр CR3 с адресом каталога страниц для этой задачи).
Виртуальный режим
В процессоре i386 компания Intel учла необходимость лучшей поддержки реального режима, потому что программное обеспечение времени его появления не было готово полностью работать в защищённом режиме. Поэтому, например, в i386 возможно переключение из защищённого режима обратно в реальный (при разработке 80286 считалось, что это не потребуется, поэтому на компьютерах с процессором 80286 возврат в реальный режим осуществляется схемно — через сброс процессора).
В качестве расширенной поддержки реального режима i386 позволяет одной или нескольким задачам работать в виртуальном режиме — режиме эмуляции режима реального адреса.
Важно понимать, что «виртуальный режим», несмотря на похожесть названия, является не «третьим режимом работы процессора» (то есть реальный, защищённый и виртуальный), а лишь режимом работы задачи в многозадачном окружении защищённого режима.
Виртуальный режим предназначается для одновременного выполнения программ реального режима (например, программы для DOS) под многозадачной операционной системой защищённого режима.
Выполнение в виртуальном режиме практически идентично реальному, за несколькими исключениями, обусловленными тем, что виртуальная задача выполняется в защищённом режиме: виртуальная задача не может выполнять привилегированные команды, потому что имеет низший уровень привилегий все прерывания и исключения обрабатываются операционной системой защищённого режима (которая, впрочем, может инициировать обработчик прерывания виртуальной задачи), вместе с тем в задаче виртуального режима можно использовать: страничное преобразование, например, для: расширения памяти путём включения страниц в неиспользуемое адресное пространство эмуляции расширений с переключением банков (например, EMS-памяти) виртуальной развёртки или свёртки буферов внешних устройств (видеопамять, аппаратная EMS-память) эмуляцию внешних устройств через эмуляцию портов ввода-вывода отладку при выполнении нескольких задач виртуального режима каждая из них может выполняться совершенно отдельно друг от друга, чего нельзя достигнуть в реальном режиме
Например, начиная с версий 4.01 — 5.0 при использовании менеджера памяти EMM386 (и его аналогов других разработчиков) операционная система MS-DOS работает как задача в виртуальном режиме. EMM386 в этом случае является подобием операционной системы защищённого режима (передавая большинство системных прерываний ядру MS-DOS в виртуальной задаче).
Режим виртуального 8086 поддерживается и в последующих 32-битных процессорах x86 вплоть до режима совместимости в x86-64.
Аппаратная отладка
Как и в предыдущих процессорах (начиная с 8086), отладка в i386 осуществляется вызовом отладочного прерывания, обработчик которого передаёт управление программе-отладчику. В предыдущих процессорах отладка могла быть вызвана двумя событиями: пошаговое выполнение программные точки останова в i386 отладку также могут начать: аппаратные точки останова ловушка переключения задачи
Пошаговое выполнение
Пошаговое выполнение или трассировка (вызов отладочного прерывания после выполнения каждой команды при установленном флаге TF) в i386 осталось таким же, как и в предыдущих процессорах, работая во всех новых режимах (32-битной адресации и режиме виртуальной задачи).
Точки останова
Точка останова () — прерывание выполнения программы по достижении определённого адреса.
В ранних процессорах x86 для организации точки останова было необходимо заменить первый байт команды на команду вызова отладочного прерывания (int 3), вызов прерывания возвращал управление отладчику, который возвращал исходное значение первого байта команды. Кроме всего, точки останова такого рода было невозможно устанавливать в ПЗУ. i386 поддерживает такие точки останова для совместимости.
Точки останова i386 определяются адресом в регистрах отладки. Обработчик отладки вызывается, если адрес следующей команды совпадает с адресом в регистре. В связи с тем, что такие точки останова не требуют записи в память, они могут использоваться для отладки программ в ПЗУ. i386 позволяет одновременно устанавливать до четырёх точек останова.
Точки останова i386 также могут быть установлены на обращение (чтение или запись) к переменной по заданному адресу в памяти. Процессор вызывает обработчик отладки при обращении команды к памяти по заданному адресу.
Ловушка переключения задачи Отладочное прерывание может быть вызвано при переключении на задачу (для этого в сегменте состояния задачи предусмотрен специальный бит).
Другие изменения Линии данных и адресов в процессоре 80386, как и в процессоре 80286, не мультиплексируются: имеется 32 линии данных и 32 не зависимых от них линии адреса.
Регистры