Почему в 8086 процессоре мы не могли использовать линейный физический адрес памяти
Линейный адрес — адрес, формируемый механизмом адресации процессора из логического адреса. Линейный адрес предназначен для обращения к линейному (непрерывному и несегментированному) адресному пространству объемом 2 32 байт (Intel386 …). При отключенном страничном механизме линейный адрес полностью совпадает с физическим адресом. Способ формирования линейного адреса из логического зависит от текущего режима работы процессора (реальный, защищенный, 32 или 16-битная адресация).
Физический адрес — адрес, передаваемый на внешнюю шину для обращения к ячейкам памяти. Типовые 32-разрядные процессоры (Pentium …) позволяют адресовать до 2 32 байт (4 Гб) физической памяти в обычном режиме и до 2 36 байт (64 Гб) в случае поддержки механизма расширения физического адреса (управляется CR4.PAE). Физический адрес образуется из линейного либо напрямую (полное совпадение), либо через механизм страничного преобразования.
Реальный режим
В реальном режиме работа всех современных процессоров происходит аналогично тому, как это делает процессор 8086. Некоторые отличия состоят лишь в поддержке большего количества команд и во много раз более высокой скорости работы. То есть программы, написанные для 8086, в большинстве случаев нормально работают на всех процессорах более поздних модификаций (включая Pentium IV и более поздние). Механизм формирования линейного адреса в реальном режиме работы (см. рис. 2.2.) предельно упрощен и позволяет адресовать адресное пространство объмом 2 20 байт (1 Мб).
Рис. 2.2. Формирование линейного адреса в реальном режиме работы процессора
Полученный таким образом линейный адрес является фактически и физическим адресом. Существует, однако, одна особенность, которая проявляется в процессорах начиная с Intel286, где разрядность физического адреса превышает 20 бит. В случае задания селектора сегмента равным, например, FFFFh сумма базы сегмента и смещения может превысить FFFFFh (может достигать 10FFEFh). В процессоре 8086 в этом случае старший бит теряется и производится обращение к ячейке с адресом 0FFEFh, в более современных процессорах (Intel286 …) старший бит не отбрасывается и весь 21-битный линейный адрес преобразуется в физический и подается на адресную шину. Таким образом, появляется возможность в реальном режиме работы процессора обращаться к дополнительным 64 Кб адресного пространства. Поскольку такой режим работы может вызвать некорректное функционирование программ, написанных для процессора 8086, в процессорах начиная с Intel486 введена возможность маскирования 20-го разряда адресной шины внешним сигналом.
Еще одной особенностью процессоров начиная с Intel386 является возможность использования префикса изменения рамера адреса по умолчанию в реальном режиме работы. Поскольку в реальном режиме по умолчанию используется 16-битная адресация (размер смещения — 16 бит), то ввод данного префикса позволяет переключиться на использование 32-битного смещения. Однако величина этого смещения не должна превышать FFFFh (максимальный размер сегмента в реальном режиме). Для сохранения полной совместимости с процессором Intel286 попытка использования 32-битного смещения, превышающего 0000FFFFh приводит к генерации прерывания 12 (превышение стекового сегмента) или 13 (превышение прочих сегментов).
Защищенный режим
Работа механизма формирования линейного адреса в защищенном режиме работы процессора основана на двух специальных таблицах, размещаемых в памяти. Это глобальная таблица дескрипторов (GDT) и локальная таблица дескрипторов (LDT) (есть еще таблица дескрипторов прерываний, но она используется только при генерации прерываний и особых ситуаций ситуаций). Эти таблицы создаются и заполняются до переключения в защищенный режим, они содержат описания используемых программой сегментов памяти (базовый адрес, размер, тип, привилегии доступа и т.п.). Селектор сегмента, являющийся частью сформированного логического адреса в защищенном режиме содержит не базу физического адреса сегмента, а указатель на описание сегмента (дескриптор сегмента) в какой-либо таблице дескрипторов (LDT или GDT). Из выбранного таким образом дескриптора и смещения (вторая часть логического адреса) процессор автоматически вычисляет требуемый линейный адрес (рис. 2.3.).
Рис. 2.3. Процесс формирования линейного адреса в защищенном режиме работы процессора
Положение таблиц дескрипторов в памяти задается следующим образом: для таблицы GDT — 32-разрядным значением ее линейного адреса в регистре GDTR, для таблицы LDT — специальным дескриптором в таблице GDT, ссылка на который (селектор) помещается в регистр LDTR.
Помимо дескрипторов сегментов кода и данных таблицы LDT и GDT могут содержать и ряд специальных дескрипторов, предназначенных для корректного переключения задач и обработки прерываний.
В защищенном режиме в процессорах Intel386, Intel486 … может использоваться как 32-х, так и 16-битная модель адресации. Режим "по умолчанию" задается в дескрипторе соответствующего сегмента кода. При применении 16-битной адресации разрядность смещения уменьшается до 16 бит. При этом форматы селекторов и дескрипторов остаются такими же, как и при 32-битной адресации.
Влияние и наследие
Стивен Морс, создавая концепцию небольшого «дочернего» процессора в стенах Intel, едва ли мог предположить, что находится на пороге создания исторического микропроцессора. Выход Intel 8086 был скромным и неоднозначным, однако его младший брат 8088 обрел славу в составе IBM PC/XT, позволив компании Intel обрести известность и получить колоссальную прибыль.
Архитектура х86 легла в основу всех дальнейших процессоров Intel, осознавшей удобство и универсальность концепции Морса «сначала ПО — потом начинка». Каждый следующий процессор строился на фундаменте предыдущего, обрастая новыми технологиями, инструкциями и блоками, но по своей сути немногим отличался от 8086.
И даже сегодня, глядя на i7 8086K, нужно понимать, что где-то глубоко внутри него еще находятся корни того самого процессора, увидевшего свет 40 лет назад, ознаменовавшего открытие эпохи х86.
Intel 8086 – один из самых влиятельных из когда-либо созданных компьютерных чипов. Он создал архитектуру x86, доминирующую в современных настольных и серверных компьютерах. Я занимался реверс-инжинирингом 8086 на основе фотографий кристаллов, и в данной статье я опишу реализацию регистрового файла (набора регистров).
Кристалл 8086. Отмечено место хранения регистров. Верхние регистры используются блоком интерфейса шины для доступа к памяти, а нижние регистры общего назначения используются исполнительным блоком. Буфер команд – это 6-байтная очередь, состоящая из заранее запрошенных команд.
На фото дано изображение процессора 8086 под микроскопом. Виден металлический слой сверху чипа, под которым прячется кремний. Расположенные по внешнему краю соединительные провода соединяют площадки на кристалле с 40 внешними контактами чипа.
Рамкой обведены пятнадцать 16-битовых регистров 8086 и шесть байтов очереди предварительного запроса команд (предвыборки кода). Регистры занимают значительную часть кристалла, хотя в сумме их наберётся всего на 36 байт. Из-за ограничений по площади у первых микропроцессоров было относительно небольшое количество регистров. Для сравнения, у современных чипов процессоров есть килобайты регистров и мегабайты кэшей.
8086 был одним из самых ранних микропроцессоров, реализовавших предвыборку кода, однако у Motorola 68000 (1979) немного раньше появился буфер предвыборки на 4 байта. В мейнфреймах предвыборка существовала у IBM Stretch (1961), CDC 6600 (1964) и IBM System/360 Model 91 (1966).
Количество регистров у современного процессора подсчитать сложно. Единственное точное число, найденное мною, содержалось в книге "Анатомия высокоскоростного микропроцессора" (1997), подробно описывающей процессор AMD K6. Из-за переименования регистров у современных процессоров физических регистров гораздо больше, чем архитектурных (тех, что видны программисту), а количество физических регистров в документации не указывается. У K6, кроме восьми регистров х86 общего назначения, было 16 микроархитектурных рабочих регистров для переименования.
У процессоров с поддержкой AVX-512 есть 32 512-битовых регистра, то есть для одной этой функции зарезервировано 2 кБ регистров. В таких случаях размер регистров подсчитать ещё сложнее. Что до размера кэша, то у передовых процессоров его объём доходит до 77 МБ.
Работа с памятью
Для того чтобы адресовать больший, чем i8080, объём памяти, потребовалось изменить способ адресации памяти. Ведь если использовать старые методы, когда адрес к ячейке памяти содержался в указательных регистрах, то пришлось бы увеличивать размер этих самых регистров, чтобы иметь возможность обращаться к большему объёму памяти. Поэтому для адресации 1 Мбайт памяти применили следующую схему. На шину адреса подавался физический адрес размером 20 бит, который формировался путём сложения содержимого одного из сегментных регистров (16 бит), умноженного на 16, с содержимым указательного регистра: таким образом, адресация ячейки памяти производилась по номеру сегмента и эффективному адресу ячейки в сегменте (называемому также смещением). Если результат сложения оказывался больше, чем 2 20 -1, то 21-й бит отбрасывался; такая процедура называется «заворачиванием» адреса (англ. address wraparound). Этот метод назвали реальным режимом адресации процессора, такой режим позволяет адресовать до 1 Мбайт памяти.
Таким образом, память разделяется на сегменты, размером 64 Кбайт каждый и начинающиеся с адреса, кратного 16 (граница параграфа); память в 1 Мбайт разделялась, таким образом, на 16 сегментов. Эти 16 сегментов называют страницами памяти. В компьютере, подобном IBM PC, последние 6 страниц (A, B, C, D, E, F) памяти (т.н. верхняя память – англ. upper memory) использовались для видеопамяти и BIOS-а, это ограничивало память, доступную пользователю, объёмом в 640 Кбайт (т.н. обычная память – англ. conventional memory; страницы 09).
На то время такой режим адресации обеспечивал множество преимуществ: ёмкость памяти могла составлять до 1 Мбайт, хотя команды оперировали 16-битными адресами; упрощалось использование отдельных областей памяти для программы, её данных и стека; упрощалась разработка устройств, совместимых друг с другом.
История
Однако Datapoint отклонила эти процессоры, что стало роковым решением. Хотя TI не смогла найти покупателя на TMX 1795 и отказалась от него, Intel решила вывести 8008 на массовый рынок и следом за 8008 последовали 8080 и 8085.
Datapoint 2200
В 1975 году следующим крупным планом Intel стал процессор 8800, который должен был стать главной архитектурой компании в 80-х годах. Этот процессор был назван «микромейнфреймом» из-за его планируемой высокой производительности. Он должен был иметь совершенно новый набор инструкций, предназначенный для языков программирования высокого уровня, таких как Ада и поддерживать объектно-ориентированное программирование и «сборку мусора» на аппаратном уровне. К сожалению, а может и к счастью, этот чип был слишком амбициозным для того времени и сильно отставал от графика. В конечно итоге он был выпущен в 1981 году как iAPX 432 с разочаровывающими показателями и коммерчески провалился.
IBM PC AT 1984-го года обновился до совместимого, но более мощного процессора 80286. В 1985 году с выходом 80386 линейка х86 перешла на 32-битные вычисления, а затем на 64-битные в 2003 году с выходом AMD64 и первых процессоров Athlon 64. Архитектура х86 до сих пор расширяется множеством дополнительных инструкций, таких как AVX-512, но даже несмотря на все эти изменения, х86 сохраняет совместимость с оригинальным 8086.
Описание
Микрокод
Одной из самых сложных частей компьютерного проектирования является создание управляющей логики, которая диктует каждой части процессора что делать, чтобы выполнить определенную команду. В 1951 году Морису Уилксу пришла в голову идея микрокода: вместо построения управляющей логики из сложных схем логических элементов, управляющая логика может быть заменена специальным кодом – микрокодом. Чтобы выполнить инструкцию, компьютер выполняет несколько простых микроинструкций, которые задаются микрокодом. С помощью микрокода построение управляющей логики процессора становится задачей программирования, а не задачей логического проектирования.
Микрокод был обычным явлением в мэйнфреймах 60-х годов, но ранние микропроцессоры, такие как 6502 и Z-80, не использовали микрокод, поскольку не имели места для его хранения. Однако в более поздних процессорах, таких как 8086 и 68000, применяли микрокод, используя преимущество увеличения плотности чипов. Это позволило 8086 реализовать сложные инструкции (такие как умножение и копирование строк), без усложнения схемы. Недостатком было то, что микрокод занимал бОльшую часть площади кристалла: схема микрокода показана в правом нижнем углу фотографии матрицы.
На фотографии выше показана часть микрокода ПЗУ. Под микроскопом видно содержимое микрокода; биты могут быть считаны в зависимости от наличия или отсутствия транзисторов в каждой позиции. ПЗУ состоит из 512 микроинструкций, каждая шириной в 21 бит. Каждая микроинструкция определяет перемещение данных между источником и получателем. Она также определяет микрооперацию, которая может быть командой перехода, операцией АЛУ, операцией с памятью, вызовом подпрограммы микрокода или его учётом. Микрокод довольно эффективен; простые инструкции, такие как инкреме́нт или декреме́нт (увеличивающие или уменьшающие переменные соответственно), состоят из двух микроинструкций, в то время как более сложная команда копирования строки реализована при помощи восьми микроинструкций.
Транзисторы
Чип 8086 был построен с использованием транзисторов типа N-МОП. Транзистор можно рассматривать в качестве переключателя, управляющим током между двумя областями, называемыми стоком и истоком. Эти транзисторы построены путём легирования областей кремниевой подложки примесями для создания «диффузионных» областей, обладающих различными электрическими свойствами. Транзистор активируется затвором, изготовленным из особого типа кремния, называемого поликремнием, расположенным над кремниевой подложкой. Транзисторы соединены между собой металлическим слоем сверху, образуя цельную интегральную схему. Современные процессоры могут иметь более десятка металлических слоёв, в то время как 8086 имел всего один.
Структура МОП-транзистора
На фотографии кремния ниже крупным планом показаны некоторые транзисторы из АЛУ. Легированный проводящий кремний имеет тёмно-фиолетовый цвет. Белые полосы – это те места, где поликремниевые линии пересекают кремний, образуя затвор транзистора. Можно насчитать 23 транзистора, образующих 7 вентилей. Транзисторы имеют сложную форму для более эффективного использования. Кроме того, транзисторы имеют разные размеры для обеспечения высокой мощности там, где это необходимо. Обратите внимание, что транзисторы, расположенные рядом друг с другом, могут совместно использовать сток или исток. Круги – это соединения между слоем кремния и металлом, в то время как маленькие квадраты – это соединения между слоем кремния и поликремнием.
Фото некоторых транзисторов 8086. На снимке были удалены слои металла и поликремния
Система команд
Система команд процессора i8086 состоит из 98 команд (и более 3800 их вариаций): 19 команд передачи данных, 38 команд их обработки, 24 команд перехода и 17 команд управления процессором. Микропроцессор не содержал команды для работы с числами с плавающей запятой. Данная возможность реализовывалась отдельной микросхемой, называемой математический сопроцессор, который устанавливался на материнской плате. Сопроцессор, вовсе не обязательно должен был произвёден Intel (модель i8087), к примеру, некоторые производители микросхем, такие, как Weitek, выпускали более производительные сопроцессоры, чем Intel.
В микропроцессоре i8086 была использована примитивная форма конвейерной обработки. Блок интерфейса с шиной подавал поток команд к исполнительному устройству через 6-байтовую очередь команд. Таким образом, выборка и выполнение новых команд могли происходить одновременно. Это значительно увеличивало пропускную способность процессора и лишало необходимости считывать команды из медленной памяти.
Микрокомпьютеры на основе i8086
Но всё же в некоторых микрокомпьютерах применялся и i8086, одним из таких является Mycron 2000 — первый коммерческий микрокомпьютер на базе i8086. Машина для обработки текстов IBM Displaywriter, Compaq DeskPro и Wang Professional Computer также использовали i8086.
Как регистры реализуются в кремнии
Начну с описания того, как 8086 создаётся из N-МОП транзисторов. Затем объясню, как делается инвертор, как при помощи инверторов хранятся одиночные биты, и как делается регистр.
8086, как и другие чипы той эпохи, создавались на основе транзисторов типа N-МОП. Эти чипы состояли из кремниевой подложки, в которую при помощи диффузии внедряли примеси из мышьяка или бора, формировавшие транзисторы. Находящиеся над кремнием проводники из поликремния формировали вентили транзисторов и соединяли все компоненты друг с другом. Находившийся ещё выше металлический слой содержал дополнительные проводники. Для сравнения, современные процессоры используют технологию КМОП, комбинирующую N-МОП и P-МОП транзисторы, и содержат множество металлических слоёв.
На схеме ниже показан инвертор, состоящий из N-МОП транзистора и резистора. При низком входном напряжении транзистор выключен, поэтому подтягивающий резистор подтягивает выход вверх. При высоком входном напряжении транзистор включается, соединяет землю и выход, подтягивая выход вниз. Таким образом входящий сигнал инвертируется.
На самом деле, подтягивающий резистор в вентиле N-МОП представляет собой транзистор особого рода. Работающий в режиме обеднения транзистор ведёт себя, как резистор, будучи при этом более компактным и эффективным.
На схеме показано, как из транзистора и резистора получается инвертор. На фото показана реализация на чипе. Металлический слой удалён, чтобы было видно кремний и поликремний.
На фото выше видно, как физически сделан инвертор у 8086. Розоватые участки – это кремний с примесями, делающими его токопроводящим, а линии медного цвета – это поликремний сверху. Транзистор появляется там, где поликремний пересекается с кремнием. Поликремний формирует вентиль транзистора, а участки кремния с двух сторон дают исток и сток. Большой прямоугольник поликремния формирует подтягивающий резистор между +5 В и выходом. Таким образом, схема чипа совпадает со схемой инвертора. Подобные цепи можно рассмотреть под микроскопом и подвергнуть реверс-инжинирингу.
Строительный блок регистра – два инвертора в цепи обратной связи, хранящих один бит (см. ниже). Если на верхнем проводнике 0, правый инвертор выдаст 1 на нижний проводник. Затем левый инвертор выдаст 0 на верхний проводник, завершая цикл. Таким образом цепь оказывается стабильной и «помнит» 0. И наоборот, если на верхнем проводнике 1, она превратится в 0 на нижнем проводнике, и обратно в 1 на верхнем. В итоге цепь может хранить 0 или 1, формируя однобитную память.
У 8086 два спаренных инвертора хранят в регистре один бит. Схема стабильно находится в состоянии 0 или 1.
К паре инверторов добавляются три транзистора, чтобы получилась пригодная для использования ячейка регистра. Один транзистор выбирает ячейку для чтения, второй выбирает ячейку для записи, третий усиливает сигнал при чтении. В центре схемы ниже два инвертора хранят бит. Для чтения бита ток подаётся на красную шину. Это соединяет выход инвертора с разрядной шиной через усиливающий транзистор. Для записи бита ток подаётся на красную шину, соединяющую разрядную шину с инверторами. Подавая высокотоковые сигналы 0 или 1 на разрядную шину (и, соответственно, на хранящийся бит), мы заставляем инверторы переключаться на нужное значение. Отметьте, что разрядная шина используется и для чтения, и для записи.
В других процессорах используются несколько другие ячейки для хранения регистров. 6502 использует дополнительный транзистор в цепи обратной связи инвертора, чтобы разбивать цепь при записи нового значения. Z80 пишет одновременно в оба инвертора, что «облегчает» изменение, однако требует наличия двух проводников для записи. У 8086 есть усиливающий транзистор в каждой ячейке регистра для чтения, а другие процессоры считывают выходной сигнал с обоих инверторов и используют внешний дифференциальный усилитель для усиления сигнала. Базовая ячейка регистра 8086 состоит из 7 транзисторов (7Т), что больше, чем в типичной статичной ячейке RAM, использующей 6 или 4 транзистора, однако она использует только одну разрядную шину, а не две разных. Динамическая память (DRAM) работает гораздо эффективнее, и использует один транзистор и конденсатор, однако без обновления данных они будут утеряны.
Принципиальная схема хранящей бит ячейки регистра. Регистровый файл делается из массива таких ячеек.
Регистровый файл состоит из матрицы ячеек регистров, подобных описанному выше. Ширина матрицы составляет 16 ячеек, поскольку в регистрах хранятся 16-битные значения. Каждый регистр расположен по горизонтали, поэтому шина чтения или записи выбирает все ячейки определённого регистра. 16 вертикальных разрядных шин формируют единую шину, поэтому все 16 битов в выбранном регистре читаются и записываются параллельно.
На фото ниже показан увеличенный регистровый файл 8086 общего назначения, и видна матрица регистровых ячеек: 16 столбцов и 8 строк, 8 16-битных регистров. Затем дано увеличение одной регистровой ячейки в файле. Объясню, как реализована эта ячейка.
Фото кристалла 8086 с увеличением нижнего регистрового файла (восьми 16-битовых регистров), а потом и отдельной регистровой ячейки. Чтобы было видно кремниевые структуры, металлический и поликремниевый слои удалены.
8086 делается из кремния с примесями и поликремниевых проводников с металлическими проводниками сверху. На левом фото ниже показаны вертикальные металлические проводники регистровой ячейки. Отмечены земля, питание и проводники разрядной шины (оставшийся проводник пересекает регистровый файл, но не контачит с ним). На фото справа металлический слой растворён, чтобы было видно поликремний и кремний. Шины чтения и записи – это горизонтальные поликремниевые проводники. Поскольку у чипа только один металлический слой, в регистрах для вертикальных шин используется металл, а для горизонтальных – поликремний, чтобы они не пересекались друг с другом). Сквозные соединения металла и кремния видны как более яркие круги на фото с металлом и как кружки на фото с кремнием.
Ячейка хранения регистра. На фото слева показан металлический слой, а справа – соответствующие слои поликремния и кремния.
На диаграмме ниже показано соответствие физической схемы регистровой ячейки с принципиальной. Инверторы состоят из транзистора А и В и регистров. Транзисторы C, D и E формируются отмеченными кусочками поликремния. Разрядная шина не видна, поскольку располагается в металлическом слое. Отметьте, что схема ячейки памяти сильно оптимизирована для минимизации размера. Также отметьте, что транзистор А гораздо меньше других. У инвертора А довольно слабый выходной ток, поэтому разрядная шина может преодолеть его при записи.
Регистровая ячейка от 8086 с соответствующей схемой
Регистровая ячейка на кристалле повторяются не единообразно – каждая вторая ячейка является зеркальным отражением предыдущей. Это увеличивает плотность регистровой ячейки – шина питания, идущая между двумя зеркальными ячейками, может питать их обе (то же касается и земли). Зеркальные повторения уменьшают количество требуемых шин питания и земли в два раза.
Две пары ячеек памяти с разными цепями. У ячеек слева одна шина записи, а справа – отдельные шины записи для левых и правых битов.
Режим V86
Режим V86 (виртуальный-8086) введен в процессорах начиная с Intel386 и является специальным подмножеством защищенного режима. Этот режим предназначен для выполнения программ, предназначенных для процессора 8086 или для реального режима работы более поздих процессоров архитектуры x86, в более гибком, поддерживающем многозадачность защищенном режиме.
Механизм формирования линейного адреса в режиме V86 работает аналогично тому, как это происходит в реальном режиме. Т.е. 16-битный селектор и 16-битное смещение формируют 20-битный логический адрес, который затем расширяется нулями для получения полного 32-битного линейного адреса. Возможно и применение префиксов изменения рамера адреса (смещение в этом случае не должно превышать FFFFFh).
В режиме V86 (также как и в реальном режиме работы процессоров Intel286 …) возможна адресация памяти старше 1Мб (10000h:1FFFEFh), при встрече такого адреса перехода на младшие адреса не происходит. Для эмуляции такого перехода может быть использован страничный механизм (адреса 100000h:110000h отображаются на адреса 00000h:10000h).
При отключенном страничном механизме в режиме V86 возможна адресация только младшей области линейного адресного пространства, т.е. все исполняемые задачи 8086 должны располагаться только в этой области. Однако при включении страничного механизма это ограничение снимается, чем достигается возможность параллельного исполнения нескольких задач 8086, размещенных в любой части доступного адресного пространства, причем возможно совместное использование одного кода.
Сегодня, в 2018 году, мы отмечаем сорокалетие, пожалуй, ключевого в истории персональных компьютеров процессора, а именно – Intel 8086.
Именно с него началась эпоха архитектуры x86, заложившей основы развития процессоров на многие годы и десятилетия вперед, именно ему мы обязаны взлету популярности компьютера как индивидуальной единицы, доступной каждому пользователю. В честь 40-летнего юбилея процессора, с которого началось превращение Intel в многомиллиардную корпорацию, компания представила небольшой символический подарок своим поклонникам — им стал юбилейный i7-8086K, первым процессором в истории Intel, способным работать на частоте 5 ГГц прямо из коробки.
Но сегодня мы не будем петь дифирамбы инженерам современных процессоров-лидеров, а вернемся в далекое прошлое, в 1976 год, где и началась история Intel 8086. И началась она с совершенно другого процессора.
Но как оказалось позже, они были крайне полезными – уже в июле 1976 года небольшая компания Zilog, основанная изобретателем Intel 4004 и Intel 8008 Федерико Фаджином, а также менеджером Intel Ральфом Унгерманном и еще одним разработчиком 4004, японцем Масатоси Сима, представила на рынке свой процессор Z-80, ставший фактической работой над ошибками на базе Intel 8080.
Усовершенствовав архитектуру оригинального процессора Intel, команда Zilog предложила недорогой и производительный процессор, сразу же полюбившийся многим производителям техники и ведущих платформ того времени. Именно Z-80 лег в основу легендарного ZX Spectrum, а также был установлен в не менее известный Commodore 128 в качестве сопроцессора. Z-80 стал невероятно успешным во многих уголках мира, и этот успех не мог остаться незамеченным – в Intel срочно решили, что Z-80 нужен достойный конкурент.
Именно здесь руководители компании вспомнили о замечаниях Стивена Морса, и предложили тому возглавить создание принципиально нового процессора, призванного составить конкуренцию новинке от Zilog. Intel не видели особенных причин задавать рамки в этом проекте – тогда всем казалось, что новый процессор будет быстрым ответом на Z-80, и забудется в течение следующих лет, поэтому Морс получил зеленый свет на любые эксперименты. Именно навязчивая мысль о том, что процессор должен строиться вокруг эффективности работы с ПО, как выяснилось позже, стала ключевой для развития всей индустрии.
Морсу приходилось отталкиваться от проекта 8080, в соответствии с которым процессор назначал «адрес» каждому месту, где хранились числа, подобно ярлыкам классификатора. Адреса представляли собой 16-битные двоичные числа, что позволяло обозначить 65536 различных адресов. Этот потолок был приемлем, когда разработчикам требовалось экономно использовать память. Однако теперь потребителям понадобился больший объем, они настаивали на преодолении барьера в 64 Кбайт.
В июле 1978 года новый процессор, получивший название Intel 8086, появился на рынке.
Его выход не стал фурором или невероятным успехом. Впервые процессор попал на прилавки в составе нескольких бюджетных компьютеров, не пользующихся популярностью, а также использовался в различных терминалах. Чуть позже он лег в основу микроконтроллера NASA, где использовался для контроля над диагностическими системами ракетного пуска вплоть до начала 2000-х годов.
Легендарный статус 8088 получил позже, когда в 1980 году IBM впервые задумалась о покорении рынка персональных компьютеров и создании компьютера, который был бы достаточно недорогим, и включал в себя комплектующие среднего класса. Именно IBM 5150, более известный под брендом IBM PC, и получил в основу процессор 8088 (по сути, все тот же 8086), благодаря чему Intel стала широко известной даже в кругах рядовых пользователей. А ведь на место 8088 претендовала и Motorola 68000 (основа первого Apple Macintosh), но руководство IBM отдала предпочтение Intel.
IBM PC быстро превратился в главную силу на рынке компьютерных систем, и Intel, следуя логике «дальше-лучше», продолжила выпускать процессоры – 80186, 80286, 80386, 80486, Pentium и так далее – на базе все той же основы Стивена Морса, заложенной им еще в 8086. Именно благодаря двум последним цифрам архитектура стала известна как «х86», а невероятная популярность компьютеров IBM обеспечила Intel огромные прибыли и узнаваемость в качестве бренда.
Многопортовые регистры
Пока что мы рассмотрели восемь «нижних регистров» общего назначения. У 8086 есть также семь «верхних регистров», используемых для доступа к памяти, включая печально известные сегментные регистры. У этих регистров схема работы более сложная, многопортовая, позволяющая одновременно вести несколько процессов чтения и записи. К примеру, многопортовый регистровый файл позволяет прочесть счётчик программы, сегментный регистр и записать другой сегментный регистр – и всё это одновременно.
Приведённая ниже блок-схема отличается от большинства блок-схем для 8086, поскольку показывает реальную физическую реализацию процессора, а не ту, что представляет себе программист. В частности, на диаграмме показано два «регистра внутренних коммуникаций» среди регистров модуля интерфейса шины (справа) вместе с сегментными регистрами, совпадающими с 7 регистрами, которые можно рассмотреть на кристалле. Временные регистры, показанные ниже, физически являются частью АЛУ, поэтому в данной статье я их не рассматриваю.
В книжке "Разработка современных процессоров" обсуждаются сложные системы регистров в процессоре, начиная с 2000-х годов. Там написано, что сложность цепей быстро выходит за рамки трёх портов, а в некоторых передовых процессорах существуют регистровые файлы с 20 или более портами.
Многопортовая регистровая ячейка ниже создана на основе той же схемы из двух инверторов, однако у неё есть три разрядных шины (а не одна, как в предыдущем случае) и пять управляющих шин (вместо двух). Три шины чтения позволяют читать содержимое регистровой ячейки по любой из трёх разрядных шин, а две шины записи позволяют разрядной шине А или С вести запись в регистровую ячейку.
Многопортовая регистровая ячейка в процессоре 8086
У верхних регистров есть разное количество портов для чтения и записи: два регистра с 3 шинами чтения и 2 шинами записи, один регистр с 2 шинами чтения и 2 шинами записи, четыре регистра с 2 шинами чтения и 1 шиной записи. Три первых регистра – это, вероятно, счётчик программы, непрямой временный регистр и временный регистр операнда. Последние четыре – вероятно, сегментные регистры SS, DS, SS и ES. Также там есть три регистра буфера предварительной выборки команд, каждый с одной шиной для чтения и одной для записи.
Файл верхних регистров, состоящий из десяти 16-битных регистров. На фото видно кремний и поликремний. Вертикальные красные линии – остатки удалённого металлического слоя. Кликабельно.
Заключение
Хотя 8086 процессору уже 42 года, он до сих пор оказывает значительное влияние на современные компьютеры, поскольку архитектура х86 до сих пор очень часто используется. Регистры 8086 до сих пор существуют в современных компьютерах х86, хотя сегодня они уже имеют длину в 64 бита, а кроме этих регистров существует и множество других.
Кристалл 8086-го очень интересно изучать, поскольку его транзисторы можно рассмотреть под микроскопом. В своё время это был сложный процессор, поскольку на нём расположено 29 000 транзисторов, однако достаточно простой для того, чтобы отследить все цепи и понять, как они работают.
В июне 1978 года был представлен один из самых влиятельных чипов в полупроводниковой индустрии – Intel 8086. Он положил начало архитектуре х86, которая до сих пор доминирует сегодня в настольных и серверных вычислениях. Давайте заглянем вглубь чипа и разберём внутреннее строение и архитектурные особенности этого микропроцессора.
На фото ниже изображён кристалл процессора Intel 8086. На фото виден металлический слой чипа, скрывающий кремний под ним. По краям матрицы расположены тонкие провода, обеспечивающие соединение между площадками на чипе и внешними контактами. Силовые и заземляющие площадки имеют по два соединительных провода для поддержания более высокого тока. Микросхема была очень сложной для своего времени и содержала 29 тысяч транзисторов. Обратите внимание на маркировку кристалла в самом низу – на ней указан логотип Intel, модель процессора и год изготовления микросхемы.
Кристалл процессора Intel 8086
Для исследования кристалла необходимо аккуратно препарировать процессор. Большинство интегральных схем упакованы в эпоксидную смолу, поэтому для растворения корпуса необходимы опасные кислоты. Чтобы избежать повреждения кристалла был использован 8086 с керамическим корпусом, крышка которого легко открывается, обнажая бесстыдную красоту всех его внутренностей.
На фотографии видна кремниевая матрица, расположенная в центре. Матрица подключена к металлическим контактами микросхемы с помощью крошечных соединительных проводов. Это 40-контактный DIP-корпус, стандартный форм-фактор для микропроцессоров того времени. Обратите внимание, что сама кремниевая матрица занимает небольшую часть размера корпуса.
С помощью металлургического микроскопа были сделаны десятки фотографий матрицы чипа, сшитые в одно изображение высокого разрешения с помощью программы Hugin.
Ниже показана фотография кристалла, на которой были удалены слои металла и поликремния, обнажая лежащий под ними кремний с его 29 000 транзисторов. На чипе обозначены основные функциональные блоки, основанные на реверс-инжиниринге Кена Ширриффа. Левая сторона чипа содержит 16-битный канал передачи данных: регистры чипа и арифметические схемы. Сумматор и верхние регистры образуют модуль интерфейса шины, который взаимодействует с внешней памятью, в то время как нижние регистры и АЛУ образуют исполнительный блок, который обрабатывает данные. Правая сторона чипа имеет схему управления и декодирования команд, а также микрокод ROM, который управляет каждой инструкцией.
Основные функциональные блоки 8086
Одной из особенностей 8086 была предварительная выборка инструкций, которая улучшает производительность, извлекая инструкции из памяти до того, как они будут использованы. Это было реализовано блоком интерфейса шины в левом верхнем углу, который обращался к внешней памяти. Верхние регистры включают в себя сегментные регистры 8086, которые обеспечивают доступ к бОльшему адресному пространству, чем 64 килобайта, разрешенные 16-битным адресом. Для каждого доступа к памяти были добавлены сегментный регистр и смещение памяти, чтобы сформировать конечный адрес памяти. 8086 вместо АЛУ использовал отдельный сумматор для вычисления адресов памяти, что повышало его производительность. Верхние регистры также включают шесть байт буфера предварительной выборки команд и счётчик команд.
В левом нижнем углу микросхемы находится исполнительный блок, который выполняет операции с данными. Нижние регистры включают в себя регистры общего назначения и индексные регистры, такие как указатель стека. 16-разрядный АЛУ выполняет арифметические операции (сложение и вычитание), булевы логические операции и сдвиги. АЛУ не осуществляет умножение или деление; эти операции выполняются через последовательность сдвигов и сложения/вычитания, поэтому они относительно медленны.
Реальный режим
В реальном режиме работа всех современных процессоров происходит аналогично тому, как это делает процессор 8086. Некоторые отличия состоят лишь в поддержке большего количества команд и во много раз более высокой скорости работы. То есть программы, написанные для 8086, в большинстве случаев нормально работают на всех процессорах более поздних модификаций (включая Pentium IV и более поздние). Механизм формирования линейного адреса в реальном режиме работы (см. рис. 2.2.) предельно упрощен и позволяет адресовать адресное пространство объмом 2 20 байт (1 Мб).
Рис. 2.2. Формирование линейного адреса в реальном режиме работы процессора
Полученный таким образом линейный адрес является фактически и физическим адресом. Существует, однако, одна особенность, которая проявляется в процессорах начиная с Intel286, где разрядность физического адреса превышает 20 бит. В случае задания селектора сегмента равным, например, FFFFh сумма базы сегмента и смещения может превысить FFFFFh (может достигать 10FFEFh). В процессоре 8086 в этом случае старший бит теряется и производится обращение к ячейке с адресом 0FFEFh, в более современных процессорах (Intel286 …) старший бит не отбрасывается и весь 21-битный линейный адрес преобразуется в физический и подается на адресную шину. Таким образом, появляется возможность в реальном режиме работы процессора обращаться к дополнительным 64 Кб адресного пространства. Поскольку такой режим работы может вызвать некорректное функционирование программ, написанных для процессора 8086, в процессорах начиная с Intel486 введена возможность маскирования 20-го разряда адресной шины внешним сигналом.
Еще одной особенностью процессоров начиная с Intel386 является возможность использования префикса изменения рамера адреса по умолчанию в реальном режиме работы. Поскольку в реальном режиме по умолчанию используется 16-битная адресация (размер смещения — 16 бит), то ввод данного префикса позволяет переключиться на использование 32-битного смещения. Однако величина этого смещения не должна превышать FFFFh (максимальный размер сегмента в реальном режиме). Для сохранения полной совместимости с процессором Intel286 попытка использования 32-битного смещения, превышающего 0000FFFFh приводит к генерации прерывания 12 (превышение стекового сегмента) или 13 (превышение прочих сегментов).
Регистры
Всего в процессоре i8086 было 14 16-разрядных регистров: 4 регистра общего назначения (AX, BX, CX, DX), 2 индексных регистра (SI, DI), 2 указательных (BP, SP), 4 сегментных регистра (CS, SS, DS, ES), программный счётчик или указатель команды (IP) и регистр флагов (FLAGS, включает в себя 9 флагов). При этом регистры данных (AX, BX, CX, DX) допускали адресацию не только целых регистров, но и их младшей половины (регистры AL, BL, CL, DL) и старшей половины (регистры AH, BH, CH, DH), что позволяло использовать не только новое 16-разрядное ПО, но сохраняло совместимость и со старыми программами (правда, их необходимо было, по крайней мере, перекомпилировать).
Размер шины адреса был увеличен с 16 бит до 20 бит, что позволило адресовать 1 Мбайт (2 20 байт) памяти. Шина данных была 16-разрядной. Однако в микропроцессоре шина данных и шина адреса использовали одни и те же контакты на корпусе. Это привело к тому, что нельзя одновременно подавать на системную шину адреса и данные. Мультиплексирование адресов и данных во времени сокращает число контактов корпуса до 40, но и замедляет скорость передачи данных.
Архитектурные особенности 8086
В плане архитектурных особенностей Intel 8086 во многом опирался на опыт разработки процессора 8080, и его усовершенствованного собрата 8085, вышедшего на рынок летом 1976 года. Несмотря на некоторые параллели, 8086 стал первым 16-битным процессором компании, располагавшим 16 каналами данных и 20 адресными каналами, способными обрабатывать до 1 Мб данных, а также имел широкий набор инструкций, позволявших, среди всего прочего, проводить операции деления/умножения. Особенностью работы 8086 было наличие двух режимов – Минимального и Максимального, последний из которых предполагал использование процессора в системе с несколькими процессорами, а первый – в классических системах с одним процессором.
В Intel 8086 впервые появилась очередь инструкций, позволяющая хранить до шести байт инструкций напрямую из памяти, значительно сокращая время на их обработку. 16-битная природа процессора не была основана лишь на нескольких компонентах, ведь 8086 составляли 16-битный ALU, 16-битные регистры, а также внутренняя и внешняя шина данных, обрабатывающие данные по 16-битным инструкциям, благодаря чему система работала значительно быстрее, чем с более ранними процессорами Intel.
Конечно, из-за такого масштабного набора инноваций 8086 был значительно дороже предшественника, но и в подобном ключе у потребителя был выбор — Intel предлагала купить новинку в нескольких вариантах, зависевших от частот процессора – они варьировались от 5 до 10 МГц.
С точки зрения архитектуры микропроцессор Intel 8086 состоял из двух аппаратных модулей – модуля выполнения и модуля интерфейса шины. Модуль выполнения указывал модулю интерфейса шины, откуда получать данные инструкций, а после этого приступал к их подготовке и выполнению. Его суть сводилась к управлению данными с помощью декодера инструкций и блока ALU, при этом сам модуль не имел прямого соединения с шинами данных, и работал исключительно через модуль интерфейса шины.
Модуль выполнения содержал блок АЛУ, предназначенный для выполнения логических и арифметических операций, таких как умножение, деление, сложение, вычитание или операции по типу OR, AND и NOT. Также здесь был 16-битный регистр флагов, хранивший различные состояния операций в аккумуляторе – всего их было 9, 6 из которых были флагами состояния, а 3 являлись системными флагами, отражающими статус работы устройства.
К первым относились: флаг переноса, флаг четности, вспомогательный флаг переноса, флаг нуля, флаг знака и флаг переполнения. К системным флагам относились: флаг трассировки, флаг разрешения прерываний, а также флаг направления.
Наконец, последним из регистров в модуле стал 16-битный указательный регистр, который сохранял адрес сегмента данных в буфере памяти, необходимый для выполнения операции. Остальные функциональные части относились к соседнему модулю интерфейса шины.
Модуль интерфейса шины содержал в себе значительно больше функциональных компонентов – он отвечал на обработку всех данных и отправку инструкций в модуль выполнения, считывание адресов из памяти компьютера и информации со всех доступных портов ввода-вывода, а также за запись данных в доступную память и через вышеуказанные порты. Из-за того, что модуль выполнения не имел прямого соединения с модулем интерфейса шины, взаимодействие блоков происходило посредством внутренней шины данных.
В данном модуле содержится одна из ключевых архитектурных особенностей процессора 8086 – очередь инструкций. Модуль интерфейса шины включает очередь инструкций, способную хранить до 6 байт инструкций в буфере, отсылая новые инструкции по конвейеру после того, как от модуля выполнения поступит соответствующий запрос. Термин pipelining появился именно с выходом на рынок процессора 8086, так как он означает подготовку следующей инструкции в момент, когда предыдущая находится в процессе выполнения.
Здесь же располагается 4 сегментных регистра, отвечающих за буферизацию адресов инструкций и сопутствующих им данных в памяти компьютера, и тем самым обеспечивающих доступ к нужным сегментам центральному процессору. В регистре также содержится указатель команды (IP), содержащий адрес следующей инструкции, предназначенной для модуля выполнения.
Наконец, последним из регистров является 16-битный указатель команды, содержащий адрес следующей для выполнения инструкции.
Intel 8086 стал первым 16-битным процессором компании, доступном в 40-контактном DIP (ди ай пи) корпусе, который наряду со множеством прочих особенностей, стал одним из стандартов в микроэлектронике последующих лет.
Заключение
8086 был изначально задуман как процессор-затычка во время, пока Intel не выпустит свой флагманский чип iAPX 432, и был потомком процессора, построенного из платы, полной ТТЛ-микросхем. Но с этого скромного начала архитектура х86 неожиданно оказалась доминирующей в настольных и серверных вычислениях до настоящего времени.
Intel 8086 — первый 16-битный процессор компании Intel, выпущенный 8 июня 1978 года. Процессор имел набор команд, который применяется и в современных процессорах, именно от этого процессора берёт своё начало известная на сегодня архитектура x86.
Конкурентами микропроцессора i8086 являются такие разработки, как NEC V30, который был на 5% производительнее i8086, но при этом был полностью с ним совместим. Отечественным аналогом является микропроцессор К1810ВМ86, входивший в серию микросхем К1810.
Оглавление документа
Читайте также: