Особенности архитектуры 64 разрядных процессоров. Процессоры изнутри

Статья раскрывает смысл термина «64 бита». В статье кратко рассмотрена история развития 64-битных систем, описаны наиболее распространенные на данный момент 64-битные процессоры архитектуры Intel 64 и 64-битная операционная система Windows.

Введение

В рамках архитектуры вычислительной техники под термином «64-битный» понимают 64-битные целые и другие типы данных, имеющих размер 64 бита. Под «64-битными» системами могут пониматься 64-битные архитектуры микропроцессоров (например, EM64T, IA-64) или 64-битные операционные системы (например, Windows XP Professional x64 Edition). Можно говорить о компиляторах, генерирующих 64-битный программный код.

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

История 64-битных систем

64-битность только недавно вошла в жизнь большинства пользователей и прикладных программистов. Однако работа с 64-битными данными имеет уже длинную историю.

1961: IBM выпускает суперкомпьютер IBM 7030 Stretch, в котором используются 64-битные слова данных, 32-битные или 64-битные машинные инструкции.

1974: Control Data Corporation запускает векторный суперкомпьютер CDC Star-100, в котором используется архитектура 64-битных слов (предыдущие системы CDC имели 60-битную архитектуру).

1976: Cray Research выпускает первый суперкомпьютер Cray-1, в котором реализована архитектура 64-битных слов и который послужит основой для всех последующих векторных суперкомпьютеров Cray.

1985: Cray выпускает UNICOS - первую 64-битную реализацию операционной системы Unix.

1991: MIPS Technologies производит первый 64-битный процессор, R4000, в котором реализована третья модификация разработанной в их компании архитектуры MIPS. Этот процессор используется в графических рабочих станциях SGI начиная с модели IRIS Crimson. Kendall Square Research выпускает свой первый суперкомпьютер KSR1, построенный на основе их собственной запатентованной 64-битной архитектуры RISC под операционной системой OSF/1.

1992: Digital Equipment Corporation (DEC) представляет полностью 64-битную архитектуру Alpha - детище проекта PRISM.

1993: DEC выпускает 64-битную Unix-подобную операционную систему DEC OSF/1 AXP (позже переименованную в Tru64 UNIX) для своих систем, построенных на архитектуре Alpha.

1994: Intel объявляет о своих планах по разработке 64-битной архитектуры IA-64 (совместно с компанией Hewlett-Packard) - преемника их 32-битных процессоров IA-32. Дата выпуска назначена на 1998-1999 годы. SGI выпускает IRIX 6.0 с 64-битной поддержкой чипсета R8000.

1995: Sun запускает 64-битный процессор семейства SPARC UltraSPARC. HAL Computer Systems, подчиненная Fujitsu, запускает рабочие станции, созданные на основе 64-битного процессора SPARC64 первого поколения, независимо разработанного компанией HAL. IBM выпускает микропроцессоры A10 и A30, а также 64-битные процессоры PowerPC AS. IBM также выпускает 64-битное обновление для системы AS/400, способное преобразовывать операционную систему, базы данных и приложения.

1996: Nintendo представляет игровую консоль Nintendo 64, созданную на основе более дешевого варианта MIPS R4000. HP выпускает реализацию 64-битной 2.0 версии собственной архитектуры PA-RISC PA-8000.

1997: IBM запускает линейку RS64 64-битных процессоров PowerPC/PowerPC AS.

1998: Sun выпускает Solaris 7 с полной 64-битной поддержкой UltraSPARC.

1999: Intel выпускает набор команд для архитектуры IA-64. AMD публично объявляет о своем наборе 64-битных расширений для IA-32, который был назван x86-64 (позже переименован в AMD64).

2000: IBM выпускает свой первый 64-битный мэйнфрейм zSeries z900, совместимый с ESA/390, а также новую операционную систему z/OS.

2001: Intel наконец запускает линейку 64-битных процессоров, которые теперь получают название Itanium и рассчитаны на высокопроизводительные серверы. Проект не соответствует ожиданиям из-за многочисленных задержек при выпуске IA-64 на рынок. NetBSD становится первой операционной системой, которая запускается на процессоре Intel Itanium после его выхода. Кроме того, Microsoft также выпускает Windows XP 64-Bit Edition для архитектуры IA-64 семейства Itanium, хотя в ней сохраняется возможность запускать 32-битные приложения при помощи прослойки WoW64.

2003: AMD представляет линейки процессоров Opteron и Athlon 64, созданные на основе архитектуры AMD64, которая является первой 64-битной процессорной архитектурой, основанной на архитектуре x86. Apple начинает использовать 64-битный процессор «G5» PowerPC 970 производства IBM. Intel утверждает, что процессорные чипы семейства Itanium останутся единственными 64-битными процессорами, разработанными в их компании.

2004: В ответ на коммерческий успех AMD, Intel признается, что они разрабатывали клон расширений AMD64, которому дали название IA-32e (позже переименован в EM64T, и затем еще раз в Intel 64). Intel также выпускает обновленные версии семейств процессоров Xeon и Pentium 4 с поддержкой новых команд.

2004: VIA Technologies представляет свой 64-битный процессор Isaiah.

2005: 31 января Sun выпускает Solaris 10 с поддержкой процессоров AMD64 / Intel 64. 30 апреля Microsoft выпускает Windows XP Professional x64 Edition для процессоров AMD64 / Intel 64.

2006: Sony, IBM и Toshiba начинают выпуск 64-битного процессора Cell для PlayStation 3, серверов, рабочих станций и других устройств. Microsoft выпускает Windows Vista с включенной 64-битной версией для процессоров AMD64 / Intel 64, которая поддерживает 32-битную совместимость. Все Windows-приложения и компоненты являются 64-битными, однако многие из них имеют 32-битные версии, включенные в систему в виде плагинов в целях совместимости.

2009: Как и Windows Vista, Windows 7 компании Microsoft включает полную 64-битную версию для процессоров AMD64 / Intel 64, и на большинство новых компьютеров по умолчанию устанавливается 64-битная версия. Выходит операционная система компании Apple Mac OS X 10.6, «Snow Leopard» которая имеет 64-битное ядро и предназначена для процессоров AMD64 / Intel 64, однако по умолчанию эта система устанавливается только на некоторые из последних моделей компьютеров компании Apple. Большинство приложений, поставляемых с Mac OS X 10.6, теперь также являются 64-битными.

Более подробно с историей развития 64-битных систем можно познакомиться в статье Джона Машей "Долгая дорога к 64 битам " и в энциклопедической статье в Wikipedia "64-bit " .

Прикладное программирование и 64-битные системы

На момент написания статьи в 2010 году, наиболее известными и распространенными являются две 64-битные архитектуры микропроцессоров: IA64 и Intel 64.
  1. IA-64 64-битная микропроцессорная архитектура, разработанная совместно компаниями Intel и Hewlett Packard. Реализована в микропроцессорах Itanium и Itanium 2. Для более подробного знакомства с архитектурой IA-64 можно обратиться к следующим статьям в Wikipedia: "IA-64 ", "Itanium ", "Itanium 2 ". Архитектуру Itanium поддерживает большое количество производителей серверов: Bull, Fujitsu, Fujitsu Siemens Computers, Hitachi, HP, NEC, SGI и Unisys. Эти производители присоединились к Intel и множеству разработчиков ПО для создания Itanium Solutions Alliance , с целью продвижения архитектуры и ускорения темпов портирования ПО.
  2. Intel 64 (AMD64 / x86-64 / x64 / EM64T) - данная архитектура представляет собой расширение архитектуры x86 с полной обратной совместимостью. Существует множество вариантов названия данной архитектуры, что приводит к путанице, хотя, по сути, все эти названия обозначают одно и тоже: x86-64, AA-64, Hammer Architecture, AMD64, Yamhill Technology, EM64T, IA-32e, Intel 64, x64. Более подробно узнать о том, как появилось так много названий, можно в статье из Wikipedia: "X86-64 ". Процессоры с архитектурой Intel 64 нашли широкое распространение персональных компьютерах. И скорее всего ваш компьютер оснащен именно процессором с данной архитектурой.
Важно понимать, что IA-64 и Intel 64 (AMD64) это совершенно разные, несовместимые друг с другом, микропроцессорные архитектуры. Далее в статье мы будем рассматривать только архитектуру Intel 64 (x64 / AMD64), как более популярную среди разработчиков прикладного программного обеспечения для операционной системы Windows. Для краткости программную модель Intel 64, доступную программисту в 64-битной системе Windows, называют Win64 .

Архитектура Intel 64 (AMD64)

Рассматриваемая архитектура Intel 64 простое, но в то же время мощное обратно совместимое расширение устаревшей промышленной архитектуры x86. Она добавляет 64-битное адресное пространство и расширяет регистровые ресурсы для поддержки большей производительности перекомпилированных 64-битных программ. Архитектура обеспечивает поддержку устаревшего 16-битного и 32-битного кода приложений и операционных систем без их модификации или перекомпиляции.

Отличительной особенностью Intel 64 является поддержка шестнадцати 64-битных регистров общего назначения (в x86-32 имелось восемь 32-битных регистров). Поддерживаются 64-битные арифметические и логические операции над целыми числами. Поддерживаются 64-битные виртуальные адреса. Для адресации новых регистров для команд введены «префиксы расширения регистра», для которых был выбран диапазон кодов 40h-4Fh, использующихся для команд INC <регистр> и DEC <регистр> в 32- и 16-битных режимах. Команды INC и DEC в 64-битном режиме должны кодироваться в более общей, двухбайтовой форме.

Регистры:

16 целочисленных 64-битных регистра общего назначения (RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8 - R15),
8 80-битных регистров с плавающей точкой (ST0 - ST7),
8 64-битных регистров Multimedia Extensions (MM0 - MM7, имеют общее пространство с регистрами ST0 - ST7),
16 128-битных регистров SSE (XMM0 - XMM15),
64-битный указатель RIP и 64-битный регистр флагов RFLAGS.

Необходимость 64-битной архитектуры определяется приложениями, которым необходимо большое адресное пространство. В первую очередь это высокопроизводительные серверы, системы управления базами данных, САПР и, конечно, игры. Такие приложения получат существенные преимущества от 64-битного адресного пространства и увеличения количества регистров. Малое количество регистров, доступное в устаревшей x86 архитектуре, ограничивает производительность в вычислительных задачах. Увеличенное количество регистров обеспечивает достаточную производительность для многих приложений.

Подчеркнем основные достоинства архитектуры x86-64:

  • 64-битное адресное пространство;
  • расширенный набор регистров;
  • привычный для разработчиков набор команд;
  • возможность запуска старых 32-битных приложений в 64-битной операционной системе;
  • возможность использования 32-битных операционных систем.

64-битные операционные системы

Практически все современные операционные системы сейчас имеют версии для архитектуры Intel 64. Например, Microsoft предоставляет Windows XP x64. Крупнейшие разработчики UNIX систем также поставляют 64-битные версии, как например Linux Debian 3.5 x86-64. Однако это не означает, что весь код такой системы является полностью 64-битным. Часть кода ОС и многие приложения вполне могут оставаться 32-битными, так как Intel 64 обеспечивает обратную совместимость с 32-битными приложениями. Например, 64-битная версия Windows использует специальный режим WoW64 (Windows-on-Windows 64), который транслирует вызовы 32-битных приложений к ресурсам 64-битной операционной системы.

WoW64

Windows-on-Windows 64-bit (WoW64) - подсистема операционной системы Windows, позволяющая запускать 32-битные приложения на всех 64-битных версиях Windows.

Подсистема WoW64 не поддерживает следующие программы:

  • программы, скомпилированные для 16-разрядных операционных систем;
  • программы режима ядра, скомпилированные для 32-разрядных операционных систем.
Существуют различия WoW64 в зависимости от архитектуры процессора. Например, 64-битная версия Windows разработанная для процессора Intel Itanium 2 использует WoW64 для эмуляции x86 инструкций. Такая эмуляция весьма ресурсоемка по сравнению с WoW64 для архитектуры Intel 64, так как происходит переключение с 64-битного режима в режим совместимости, при выполнении 32-битных программ.

WoW64 на архитектуре Intel 64 (AMD64 / x64) не требует эмуляции инструкций. Здесь подсистема WoW64 эмулирует только 32-битное окружение, за счет дополнительной прослойки между 32-битным приложением и 64-битным Windows API. Где-то эта прослойка тонкая, где-то не очень. Для средней программы потери в производительности из-за наличия такой прослойки составят около 2%. Для некоторых программ это значение может быть больше. Два процента это немного, но следует учитывать, что 32-битные приложения работают немного медленнее под управлением 64-битной операционной системы Windows, чем в 32-битной среде.

Компиляция 64-битного кода не только исключает необходимость в WoW64, но и дает дополнительный прирост производительности. Это связано с архитектурными изменениями в микропроцессоре, такими как увеличение количества регистров общего назначения. Для средней программы можно ожидать в пределах 5-15% прироста производительности от простой перекомпиляции.

Из-за наличия прослойки WoW64 32-битные программы работают менее эффективно в 64-битной среде, чем в 32-битной. Но все-таки, простые 32-битные приложения могут получить одно преимущество от их запуска в 64-битной среде. Вы, наверное, знаете, что программа, собранная с ключом /LARGEADDRESSAWARE:YES может выделять до 3-х гигабайт памяти, если 32-битная операционная система Windows запущена с ключом /3gb. Так вот, эта же 32-битная программа, запущенная на 64-битной системе, может выделить почти 4 GB памяти (на практике около 3.5 GB).

Подсистема WoW64 изолирует 32-разрядные программы от 64-разрядных путем перенаправления обращений к файлам и реестру. Это предотвращает случайный доступ 32-битных программ к данным 64-битных приложений. Например, 32-битное приложение, которое запускает файл DLL из каталога %systemroot%\System32, может случайно обратиться к 64-разрядному файлу DLL, который несовместим с 32-битной программой. Во избежание этого подсистема WoW64 перенаправляет доступ из папки %systemroot%\System32 в папку %systemroot%\SysWOW64. Это перенаправление позволяет предотвратить ошибки совместимости, поскольку при этом требуется файл DLL, созданный специально для работы с 32-разрядными приложениями.

Подробнее с механизмами перенаправления файловой системы и реестра можно познакомиться в разделе MSDN "Running 32-bit Applications ".

Программная модель Win64

Также как и в Win32 размер страниц в Win64 составляет 4Кб. Первые 64Кб адресного пространства никогда не отображаются, то есть наименьший правильный адрес это 0x10000. В отличие от Win32, системные DLL загружаются выше 4Гб.

Особенность компиляторов для Intel 64 в том, что они могут наиболее эффективно использовать регистры для передачи параметров в функции, вместо использования стека. Это позволило разработчикам Win64 архитектуры избавиться от такого понятия как соглашение о вызовах (calling convention). В Win32 можно использовать разные соглашения: __stdcall, __cdecl, __fastcall и так далее. В Win64 есть только одно соглашение о вызовах. Рассмотрим пример, как передаются в регистрах четыре аргумента типа integer:

  • RCX: первый аргумент
  • RDX: второй аргумент
  • R8: третий аргумент
  • R9: четвертый аргумент
Аргументы после первых четырех integer передаются на стеке. Для float аргументов используются XMM0-XMM3 регистры, а также стек.

Разница в соглашениях о вызове приводит к тому, что в одной программе нельзя использовать и 64-битный, и 32-битный код. Другими словами, если приложение скомпилировано для 64-битного режима, то все используемые библиотеки (DLL) также должны быть 64-битными.

Передача параметров через регистры является одним из новшеств, делающих 64-битные программы более производительными, чем 32-битные. Дополнительный выигрыш в производительности можно получить, используя 64-битные типы данных.

Адресное пространство

Хотя 64-битный процессор теоретически может адресовать 16 экзабайт памяти (2^64), Win64 в настоящий момент поддерживает 16 терабайт (2^44). Этому есть несколько причин. Текущие процессоры могут обеспечивать доступ лишь к 1 терабайту (2^40) физической памяти. Архитектура (но не аппаратная часть) может расширить это пространство до 4 петабайт (2^52). Однако в этом случае необходимо огромное количество памяти для страничных таблиц, отображающих память.

Помимо перечисленных ограничений, объем памяти, который доступен в той или иной версии 64-битной операционной системе Windows зависит также от коммерческих соображений компании Microsoft. Ниже приведена информация по объему памяти, поддерживаемой различными версиями 64-биными версиями Windows:

Windows XP Professional - 128 Gbyte;
Windows Server 2003, Standard - 32 Gbyte;
Windows Server 2003, Enterprise - 1 Tbyte;
Windows Server 2003, Datacenter - 1 Tbyte;
Windows Server 2008, Datacenter - 2 Tbyte;
Windows Server 2008, Enterprise - 2 Tbyte;
Windows Server 2008, Standard - 32 Gbyte;
Windows Server 2008, Web Server - 32 Gbyte;
Vista Home Basic - 8 Gbyte;
Vista Home Premium - 16 Gbyte;
Vista Business - 128 Gbyte;
Vista Enterprise - 128 Gbyte;
Vista Ultimate - 128 Gbyte;
Windows 7 Home Basic - 8 Gbyte;
Windows 7 Home Premium - 16 Gbyte;
Windows 7 Professional - 192 Gbyte;
Windows 7 Enterprise - 192 Gbyte;
Windows 7 Ultimate - 192 Gbyte;

Разработка 64-битных приложений

Наиболее полно вопросы разработки 64-битных приложений рассмотрены в курсе "

Для компаний Intel и Hewlett-Packard не существует "проблемы 2000 года" - для них это год новых возможностей. В конце 1999 года Intel планирует представить Merced - первый процессор, построенный с использованием архитектуры нового поколения, совместно разработанной двумя компаниями. Хотя эта 64-разрядная архитектура основана на многолетних исследованиях Intel, HP, других компаний и университетов, она радикально отличается от всего, что было до сих пор представлено на рынке. Достигнет эта архитектура успеха или нет, одно очевидно уже сейчас: она изменит всю компьютерную индустрию.

Эта архитектура, известная под названием Intel Architecture-64 (IA-64), полностью "порывает с прошлым". IA-64 не является как 64-разрядным расширением 32-разрядной архитектуры х86 компании Intel, так и переработкой 64-разрядной архитектуры PA-RISC компании HP. IA-64 представляет собой нечто абсолютно новое - передовую архитектуру, использующую длинные слова команд (long instruction words - LIW), предикаты команд (instruction predication), устранение ветвлений (branch elimination), предварительную загрузку данных (speculative loading) и другие ухищрения для того, чтобы "извлечь больше параллелизма" из кода программ.

Несмотря на то, что Intel и HP обещали добиться обратной совместимости с существующим программным обеспечением, работающим на процессорах архитектур х86 и PA-RISC, они до сих пор не разглашают, каким образом это будет сделано. На самом деле обеспечить такую совместимость совсем не просто; достаточно вспомнить гораздо менее кардинальный переход с 16-разрядной на 32-разрядную архитектуру х86, продолжавшийся 12 лет и до сих пор не завершённый.

По поводу совместимости, стоит заметить, что но в Merced на самом деле существует два режима декодирования команд VLIW и старый CISC. Т.е. программы переключаются в необходимый режим исполнения. В архитектуре х86 были добавлен ряд команд для перехода в новый режим, а также для передачи данных. В IA-64 такие команды есть изначально. Так что теперь ОС будут содержать и 64-х разрядную часть на IA-64 и старую 32-х разрядную.

Правда, переход к архитектуре IA-64 в ближайшее время вряд ли затронет большинство пользователей, поскольку Intel заявила, что Merced разрабатывается для серверов и рабочих станций класса high-end, а не для компьютеров среднего уровня. Фактически, компания заявила, что IA-64 не заменит х86 в ближайшем будущем. Похоже на то, что Intel и другие поставщики продолжат разрабатывать чипы х86.

Перед тем, как углубиться в технические детали, попробуем понять, почему Intel и HP рискнули пойти на столь кардинальные перемены. Причина сводится к следующему: они считают, что как CISC, так и RISC-архитектуры исчерпали себя.

Небольшой экскурс в прошлое. Архитектура х86 компании Intel - CISC архитектура, появившаяся в 1978 году. В те времена процессоры представляли собой скалярные устройства (то есть могли в каждый момент времени выполнять только одну команду), при этом конвейеров практически не было. Процессоры содержали десятки тысяч транзисторов. PA-RISC компании HP была разработана в 1986 году, когда технология суперскалярных (с возможностью выполнения нескольких команд одновременно) конвейеров только начала развиваться. Процессоры содержали сотни тысяч транзисторов. В конце 90-х наиболее совершенные процессоры содержат миллионы транзисторов. К моменту начала выпуска Merced компания Intel планирует перейти на 0.18-микронную технологию вместо нынешней 0.25-микронной. Уже первые чипы архитектуры IA-64 будут содержать десятки миллионов транзисторов. В дальнейших модификациях их число увеличится до сотен миллионов.

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

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

Проблему ещё осложняет тот факт, что микросхемы памяти не успевают за тактовой частотой процессоров. Когда Intel разработала архитектуру х86, процессор мог извлекать данные из памяти с такой же скоростью, с какой он их обрабатывал. Сегодня процессор тратит сотни тактов на ожидание загрузки данных из памяти, даже несмотря на наличие большой и быстрой кэш-памяти.

Говоря о том, что CISC- и RISC-архитектуры исчерпали себя, Intel и HP имеют в виду обе эти проблемы. В двух пространных интервью журналу BYTE они раскрыли некоторые детали архитектуры IA-64.

  • Команды в формате IA-64 упакованы по три в 128-битный пакет для быстрейшей обработки. Обычно это называют "LIW encoding". (Русский аналог подобрать сложно. Наиболее адекватно, на мой взгляд, перевести как "кодирование в длинные слова команд".) Однако компания Intel избегает такого названия, заявляя, что с ним связаны "негативные ассоциации" (negative connotation). По той же причине Intel не любит называть сами команды RISC-подобными (RISC-like), даже несмотря на то, что они имеют фиксированную длину и предположительно оптимизированы для исполнения за один такт в ядре, не нуждающемся в микрокоде. Intel предпочитает называть свою новую LIW-технологию Explicitly Parallel Instruction Computing или EPIC (Вычисления с Явной Параллельностью Инструкций, где "явной" означае явно указанной при трансляции). В любом случае формат команд IA-64 не имеет ничего общего с х86. Команды х86 могут иметь длину от 8 до 108 бит, и процессор должен последовательно декодировать каждую команду после определения её границ.
  • Каждый 128-битный пакет содержит шаблон (template) длиной в несколько бит, помещаемый в него компилятором, который указывает процессору, какие из команд могут выполняться параллельно. Теперь процессору не нужно будет анализировать поток команд в процессе выполнения для выявления "скрытого параллелизма". Вместо этого наличие параллелизма определяет компилятор и помещает информацию в код программы. Каждая команда (как для целочисленных вычислений, так и для вычислений с плавающей точкой) содержит три 7-битных поля регистра общего назначения (РОН). Из этого следует, что процессоры архитектуры IA-64 содержат 128 целочисленных РОН и 128 регистров для вычислений с плавающей точкой. Все они доступны программисту и являются регистрами с произвольным доступом (programmer-visible random-access registers). По сравнению с процессорами х86, у которых всего восемь целочисленных РОН и стек глубины 8 для вычислений с плавающей точкой, IA-64 намного "шире" и, соответственно, будет намного реже простаивать из-за "нехватки регистров".
  • Компиляторы для IA-64 будут использовать технологию "отмеченных команд" (predication) для устранения потерь производительности из-за неправильно предсказанных переходов и необходимости пропуска участков кода после ветвлений. Когда процессор встречает "отмеченное" ветвление в процессе выполнения программы, он начинает одновременно выполнять все ветви. После того, как будет определена "истинная" ветвь, процессор сохраняет необходимые результаты и сбрасывает остальные.
  • Компиляторы для IA-64 будут также просматривать исходный код с целью поиска команд, использующих данные из памяти. Найдя такую команду, они будут добавлять пару команд - команду предварительной загрузки (speculative loading) и проверки загрузки (speculative check). Во время выполнения программы первая из команд загружает данные в память до того, как они понадобятся программе. Вторая команда проверяет, успешно ли произошла загрузка, перед тем, как разрешить программе использовать эти данные. Предварительная загрузка позволяет уменьшить потери производительности из-за задержек при доступе к памяти, а также повысить параллелизм.

Из всего вышесказанного следует, что компиляторы для процессоров архитектуры IA-64 должны быть намного "умнее" и лучше знать микроархитектуру процессора, код для которого они вырабатывают. Существующие чипы, в том числе и RISC-процессоры, производят гораздо больше оптимизации на этапе выполнения программ, даже при использовании оптимизирующих компиляторов. IA-64 перекладывает практически всю работу по оптимизации потока команд на компилятор. Таким образом, программы, скомпилированные для одного поколения процессоров архитектуры IA-64, на процессорах следующего поколения без перекомпиляции могут выполняться неэффективно. Это ставит перед поставщиками нелёгкую задачу по выпуску нескольких версий исполняемых файлов для достижения максимальной производительности.

Другим не очень приятным следствием будет увеличение размеров кода, так как команды IA-64 длиннее, чем 32-битные RISC-команды (порядка 40 бит). Компиляция при этом будет занимать больше времени, поскольку IA-64, как уже было сказано, требует от компилятора гораздо больше действий. Intel и HP заявили, что уже работают совместно с поставщиками средств разработки над переработкой этих программных продуктов.

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

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

Когда компилятор для IA-64 находит оператор ветвления в исходном коде, он исследует ветвление, определяя, стоит ли его "отмечать". Если такое решение принято, компилятор помечает все команды, относящиеся к одному пути ветвления, уникальным идентификатором, называемым предикатом (predicate). Например, путь, соответствующий значению условия ветвления TRUE, помечается предикатом Р1, а каждая команда пути, соответствующего значению условия ветвления FALSE - предикатом Р2. Система команд IA-64 определяет для каждой команды 6-битное поле для хранения этого предиката. Таким образом, одновременно могут быть использованы 64 различных предиката. После того, как команды "отмечены", компилятор определяет, какие из них могут выполняться параллельно. Это опять требует от компилятора знания архитектуры конкретного процессора, поскольку различные чипы архитектуры IA-64 могут иметь различное число и тип функциональных узлов. Кроме того, компилятор, естественно, должен учитывать зависимости в данных (две команды, одна из которых использует результат другой, не могут выполняться параллельно). Поскольку каждый путь ветвления заведомо не зависит от других, какое-то "количество параллелизма" почти всегда будет найдено.

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

После этого компилятор транслирует исходный код в машинный и упаковывает команды в 128-битные пакеты. Шаблон пакета (bundle"s template field) указывает не только на то, какие команды в пакете могут выполняться независимо, но и какие команды из следующего пакета могут выполняться параллельно. Команды в пакетах не обязательно должны быть расположены в том же порядке, что и в машинном коде, и могут принадлежать к различным путям ветвления. Компилятор может также помещать в один пакет зависимые и независимые команды, поскольку возможность параллельного выполнения определяется шаблоном пакета. В отличие от некоторых ранее существовавших архитектур со сверхдлинными словами команд (VLIW), IA-64 не добавляет команд "нет операции" (NOPS) для дополнения пакетов.

Во время выполнения программы IA-64 просматривает шаблоны, выбирает взаимно независимые команды и распределяет их по функциональным узлам. После этого производится распределение зависимых команд. Когда процессор обнаруживает "отмеченное" ветвление, вместо попытки предсказать значение условия ветвления и перехода к блоку, соответствующему предсказанному пути, процессор начинает параллельно выполнять блоки, соответствующие всем возможным путям ветвления. Таким образом, на машинном уровне ветвления нет.

Разумеется, в какой-то момент процессор наконец вычислит значение условия ветвления в нашем операторе IF-THEN-ELSE. Предположим, оно равно TRUE, следовательно, правильный путь отмечен предикатом Р1. 6-битному полю предиката соответствует набор из 64 предикатных регистров (predicate registers) Р0-Р63 длиной 1 бит. Процессор записывает 1 в регистр Р1 и 0 во все остальные.

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

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

Другой ключевой особенностью IA-64 является предварительная загрузка данных. Она позволяет не только загружать данные из памяти до того, как они понадобятся программе, но и генерировать исключение только в случае, если загрузка прошла неудачно. Цель предварительной загрузки - разделить собственно загрузку и использование данных, что позволяет избежать простоя процессора. Как и в технологии "отмеченных команд" здесь также сочетается оптимизация на этапе компиляции и на этапе выполнения.

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

На этапе выполнения процессор сначала обнаруживает команду предварительной загрузки и, соответственно, пытается загрузить данные из памяти. Иногда попытка оказывается неудачной - например, команда, требующая данные, находится после ветвления, условия которого ещё не вычислены. "Обычный" процессор тут же генерирует исключение. IA-64 откладывает генерацию исключения до того момента, когда встретит соответствующую команду проверки загрузки. Но к этому времени условия ветвления, вызывавшего исключение, уже будут вычислены. Если команда, инициировавшая предварительную загрузку, относится к неверному пути, загрузка признается неудачной и генерируется исключение. Если же путь верен, то исключение вообще не генерируется. Таким образом, предварительная загрузка в архитектуре IA-64 работает аналогично структуре типа TRY-CATCH.

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

В 80-е годы некоторые разработчики RISC-процессоров высмеивали CISC-архитектуру и предрекали скорую погибель семейству х86. Но технологии и бизнес - разные вещи. Несмотря на технологические преимущества RISC-архитектуры, огромные ресурсы корпорации Intel и господство операционных систем DОS и Windows привели к тому, что процессоры архитектуры х86 остаются конкурентоспособными до сих пор. Теперь уже Intel заявляет, что RISC- архитектура устарела. Не совершает ли корпорация той же ошибки? В любом случае, до выхода в свет первого процессора архитектуры IA-64 остаётся ещё два года, и у конкурентов есть время принять ответные меры.

Особенности архитектуры 64 – разрядных МП


5.1. Itanium 2 Intel

Процессор разрабатывался с нуля, причем, параллельно сразу в двух версиях: инженерами Intel и Hewlett-Packard. Впро-чем, в основе обоих чипов лежали, естественно, одни и те же идеи, поскольку создавались они все же совместно, и должны были оба стать родоначальниками одного и того же семейства. Цементирующим составом были, естественно, единая идеология, при-шедшая на смену CISC - EPIC (Explicitly Parallel Instruction Computing), и новая архитектура - IA-64, включающая в себя на-бор инструкций, описание регистров, и прочие подобные вещи. Впрочем, архитектура как раз - вещь изменчивая, достаточно вспомнить как отличаются между собой такие CISC процессоры, как 8086 и i80486, оба созданные на базе 80x86.
Точно так же и с Merced и McKinley, Itanium и Itanium 2 - оба построены на базе одной идеологии, но в разных разновидно-стях архитектуры. В свое время та же история, в общем то, была и с Pentium и Pentium Pro. Впрочем, общие черты были и у тех, есть и у этих, за это "отвечает" EPIC. В первую очередь речь идет о полноценной масштабной суперскалярности, то есть, способности выполнять одновременно несколько инструкций. Для чего, естест-венно, процессор содержит исполнительные модули - для опера-ций с целыми числами, с числами с плавающей запятой, и т.д.
В отличие от Pentium и его последователей, разбирающихся в коде самостоятельно, EPIC-процессоры сильно полагаются на компилятор, который должен сам проанализировать код на пред-мет нахождения оптимальных мест для распараллеливания его вы-полнения, и снабдить процессор этой информацией. Поэтому и используется «explicitly» - процессор не должен сам пытаться по-нять, что можно исполнять параллельно, а что нет, и т.д. - все это ему уже заранее объяснит компилятор. Плюс, мощные механизмы по предсказанию переходов, предварительному выполнению кус-ков кода, предварительной загрузке данных, и тому подобные ве-щи - загрузка исполнительных блоков должна быть распределена максимально равномерно.
Кардинально решен вопрос с регистрами, количество кото-рых увеличено в несколько раз: у Itanium их количество составляет 128 общего назначения (рис.1), 128 - для хранения чисел с пла-вающей запятой, 8 регистров переходов, и 64, отвечающих за ра-боту механизмов предсказания. Здесь все очевидно - такого коли-чества регистров, да еще реально 64-битных, хватит для хранения любых требуемых чисел для любого разумного количество испол-нительных модулей. У Itanium, первого представителя семейства, таких регистров всего пять - два целочисленных, два для операций с памятью и четыре - для операций с плавающей точкой. Физи-ческая память адресуется 44-бит числами, что на самом деле огра-ничивает ее объем "всего лишь" 17.6 Терабайт, блоки для опера-ций с плавающей точкой работают с числами в 82-бит представлении.

От идеи реализовать 32-бит 80x86 ядро в аппаратном виде Intel отказался, сочтя это слишком неэффективным использовани-ем площади кристалла. Так что для того, чтобы получить возмож-ность исполнения Itanium 80х86 кода, была создана система трансляции, которая на лету преобразует 80x86 код в IA-64.
Очевидно, что при прочих равных, производительность подобного решения будет ниже, чем чистого x86, работающего на той же частоте. Впрочем, никто и не ждал от Itanium скоростного исполнения x86 программ - поддержка этой архитектуры относит-ся скорее к издержкам переходного периода. Тем не менее, факт остается фактом: это семейство для решения 32-бит задач не при-способлено. Впрочем, вряд ли кто-то будет использовать Itanium для подобных целей при наличии полноценного 64-битного ПО..
Вдобавок, сам по себе Itanium был в значительной степени пилотным проектом, как и Pentium Pro, так что процессор вообще стоит рассматривать больше как демонстрацию возможностей ар-хитектуры. Характерный штрих - чипсет для Itanium, 460GX, под-держивает в качестве памяти всего лишь PC100 SDRAM, это кое-что говорит о скорости, с которой способен переваривать данные процессор. С другой стороны, однако, в какой-то мере не слишком быстрый интерфейс с оперативной памятью компенсируется очень большой кэш-памятью L3 - 2 или 4 Мбайт, работающей на полной частоте процессора (733 или 800 МГц) с пропускной способно-стью до 12.8 Гбайт/с.
Еще одной задачей Itanium было решить вопрос с компиля-торами - ведь EPIC-процессоры, как уже упоминалось, очень сильно от них зависят. В отличие от компиляторов для 80x86 про-цессоров, которые на их производительность почти не влияли, здесь компиляторы являются полноправными партнерами процес-сора - ведь они снабжают его крайне необходимой для работы ин-формацией, и от того, насколько качественной она будет, будет за-висеть скорость исполнения этой программы процессором.
Itanium 2 является уже куда более коммерчески интересным продуктом. Созданный Hewlett-Packard, набившей руку на создании 64-бит процессоров серии PA-RISC, чип получился куда более совершенным. С несколько меньшим количеством L3 (1.5 или 3 Мбайт) и несколько более высокой частотой, 900 МГц или 1 ГГц, он обеспечивает в пол-тора-два раза большую производительность на тех же задачах, что и Itanium. Он является, фактически, первым представителем архи-тектуры IA-64.
Дальше планируется еще большее распараллеливание мак-симально модным на сегодняшний день путем: процессор должен будет перейти на два физических ядра, что позволит практически удвоить производительность по достаточно приемлемой цене - по крайней мере, результат получится куда более дешевым, чем если бы того же количества исполнительных модулей, регистров, и т.д., пытались достичь на едином кристалле.

5.2. Athlon 64 AMD

В первую очередь заметим, что процессор Athlon 64 – это именно тот 64-битный процессор для настольных систем, который изначально планировала выпустить AMD. Впоследствии, в свете выхода скоростных процессоров Pentium 4, появления в них 800-мегагерцовой шины и технологии Hyper-Threading, AMD в сроч-ном порядке решила нацелить на рынок настольных систем и од-нопроцессорный Opteron, дав ему имя Athlon 64 FX. Однако Athlon 64 FX в силу своего серверного происхождения оказался дорогим и малораспространенным. По настоящему же продвинуть архитектуру AMD64 для массового использования должен именно Athlon 64.
Ниже представлена таблица 1 со спецификациями 64 - раз-рядных МП Athlon 64 3200+, Athlon 65 FX-51 и Athlon XP 3200+:

Таблица 1

* Заметим, что память в Athlon 64 и Athlon 64 FX такту-ется относительно частоты ядра, поэтому реальные час-тоты для памяти в этом случае составляют 129.4, 157.1 и 200 МГц.
Фактически, Athlon 64 отличается от своего старшего собра-та Athlon 64 FX, помимо формы и размеров корпуса, только лишь контроллером памяти. Хотя, при этом, и тот и другой процессоры производятся из одних и тех же кристаллов. Контроллер памяти в Athlon 64 одноканальный и в этом заключается как его слабость, так и преимущество по сравнению с Athlon 64 FX. Недостаток од-ноканального контроллера памяти в Athlon 64 очевиден: это более низкая теоретическая пропускная способность.
Учитывая, что Athlon 64 способен работать с DDR400 памя-тью, максимальная пропускная способность встроенного в CPU контроллера памяти составляет 3.2 Гбайт в секунду. Это в два раза меньше, чем аналогичная характеристика Athlon 64 FX. Преиму-щество же контроллера памяти Athlon 64 заключается в том, что он, в отличие от контроллера Athlon 64 FX, поддерживает обыч-ные нерегистровые модули памяти. Такие модули по сравнению с регистровыми более дешевы, имеет более агрессивные тайминги и работают быстрее, даже при одинаковых с регистровыми модуля-ми настройках. То есть при более низкой пропускной способности, обеспечиваемой контроллером памяти Athlon 64, подсистема памяти, его использующая, имеет более низкую латентность, что мы и покажем ниже.
АMD Athlon 64 по внешнему виду похож на Opteron и Athlon 64 FX.
Отличия обнаруживаются только лишь в маркировке и в меньшем числе ножек на обратной стороне, поскольку процессоры Athlon 64 устанавливаются в материнские платы с Socket 754 и не совместимы с Socket 940 платами, предназначенными для CPU се-мейств Athlon 64 FX и Opteron.
Помимо перечисленных выше особенностей, есть в новых процессорах Athlon 64 и еще одна. Эти процессоры обладают под-держкой технологии Cool’n’Quiet, фактически пришедшей в них из мобильных вариантов МП. По сути, Cool’n’Quiet представляет собой некое подобие технологии энергосбережения PowerNow!, уже давно используемой в мобильных МП от AMD. Но теперь эта технология, наконец, пришла и в настольные процессоры ком-пании. Поддержка Cool’n’Quiet – еще одно преимущество Athlon 64 над Athlon 64 FX/Opteron, не имеющих пока никаких подобных технологий. Компания AMD достаточно давно уделяет присталь-ное внимание понижению уровня тепловыделения своих настоль-ных процессоров.
Надо сказать, что в этом компания уже давно превосходит Intel: старшие модели процессоров AMD при максимальной на-грузке выделяют значительно меньше тепла, чем старшие модели Pentium 4. Также, в процессорах применяются технологии, пони-жающие тепловыделение и при низкой нагрузке. Еще МП семей
ства Athlon XP имели возможность перехода в «ждущий ре-жим» (Halt/Stop Grant) при выполнении команды HALT, что выли-валось в понижение температуры процессора при его загрузке ни-же 100%. Однако теперь AMD пошла еще дальше. В новых про-цессорах Athlon 64 реализована еще более интеллектуальная схема понижения тепловыделения.
В дополнение к состояниям Halt/Stop Grant, Athlon 64 умеет сбрасывать свою тактовую частоту и напряжение питания для еще более сильного снижения тепловыделения. В работе с использова-нием этой технологии тактовой частотой МП управляет драйвер процессора, который сбрасывает или повышает ее, основываясь на данных о его загрузке. Действительно, если процессор полностью справляется с возлагаемой на него работой и его загрузка сильно меньше 100%, то можно без ущерба для функционирования систе-мы в целом снизить его тактовую частоту: на работе системы это никак не скажется. Например, при простоях, работе в офисных приложениях, просмотре видео, дефрагментации дисков и в по-добных задачах мощности процессора в полной мере не использу-ются. Именно в таких случаях процессорный драйвер переводит Athlon 64 на меньшую тактовую частоту. Когда же от процессора требуется полная отдача, например, в играх, при решении вычис-лительных задач, в задачах кодирования данных и т.п., частота процессора поднимается до номинала. Именно таким образом и работает технология Cool’n’Quiet.
На практике это выглядит следующим образом. В обычных условиях, при минимальной загрузке МП процессорный драйвер сбрасывает частоту Athlon 64 3200+ со штатных 2 ГГц до 800 МГц. Напряжение питания процессора при этом понижается до 1.3В. Как видим, снижение тактовой частоты обеспечивается за счет уменьшения множителя процессора до 4x. Это, кстати, обу-славливает и тот факт, что процессоры Athlon 64 3200+ поставля-ются с незафиксированным коэффициентом умножения. В таком режиме процессор продолжает работать до тех пор, пока его за-грузка не превысит 70-80%. В частности, мы смогли запустить од-новременно дефрагментацию диска, проигрывание файлов с рас-ширением mp3 (аудифайлов) и просмотр MPEG-4 (видеофайлов) ролика, в то время как процессор продолжал работать на часто-те 800 МГц.
Когда же загрузка процессора Athlon 64 при частоте 800 МГц превышает допустимый предел, МП переводится драйвером в следующее состояние, при котором частота Athlon 64 3200+ со-ставляет 1.8 ГГц, а напряжение питания 1.4В. Достигается это вновь за счет уменьшения множителя, на этот раз до 9x. И только если в данном случае нагрузка процессора вновь оказывается чрезмерно высокой, драйвер переводит МП в штатный режим: частота 2 ГГц, напряжение питания – 1.5В.
Отметим, что в режимах с пониженным питанием и часто-той тепловыделение процессора Athlon 64 3200+ резко падает. Для сравнения приведем таблицу 4 с тепловыделением этого процес-сора в основных режимах.

Таким образом, использование технологии Cool’n’Quiet по-зволяет значительно снизить температуру процессора не только в моменты простоя, но и во время выполнения ряда задач, не тре-бующих от МП максимальной производительности. Что немало-важно, быстродействие МП в задачах, требовательных к процес-сорным ресурсам, при этом совершенно не снижается. В итоге, при применении систем охлаждения с вентиляторами с перемен-ной скоростью, использование технологии Cool’n’Quiet может по-зволить значительно снизить уровень шума.

Особенности построения и функционирования

Выпуск микропроцессорных комплектов больших интегральных схем (МПК БИС) с каждым годом неуклонно возрастает. Для удовлетворения запросов потребителей в настоящее время осуществляется производство микропроцессоров и периферийного оборудования, обеспечивающего их работу, разрядностью от 8 до 64 бит. На рис. 3 приведены зависимости, характеризующие объемы производства микропроцессоров и микроконтроллеров различной разрядности с 1994 г. по 2000 г. включительно.

Рис. 3. Объемы производства МП

и микроконтроллеров

Из рис. 3 очевидно, что рост 4-разрядных МП и микроконтроллеров с 1997 г. прекратился. Выпуск 8 - разрядных устройств, по крайней мере, до 2000 г., будет продолжать расти. Основу этого роста составляют микроконтроллеры, применяемые при разработке различных устройств промышленного (станкостроение, приборостроение, машиностроение, химическая промышленность и т.д.) и бытового назначения.

Рост высокоразрядных МП (выше 16 разрядов) менее заметен на фоне низкоразрядных процессоров, но он обладает устойчивостью на ближайшие 10-15 лет.

Наибольшее внимание при разработке новых МП уделяется повышению их разрядности. В настоящее время наибольшее общетехническое применение нашли 32- и 64-разрядные МП американских фирм Intel, Cyrix, AMD, Apple, Motorola, SUN Microsystems и др.

32-разрядные МП фирмы INTEL 80386 и 80486 были наиболее популярными микропроцессорами до появления Pentium. В этих МП реализованы многие логические свойства, которые еще недавно считались принадлежностью крупных ЭВМ (защита памяти, кэш - память, сегментированная виртуальная память и т.д.).

Фирмой Intel было разработано и выпущено несколько модификаций МП 80386 и 80486 (табл. 1).

Таблица 1

Микропроцессор Год выпуска Разрядность ШД Разрядность ША Тактовая частота * , МГц Объем па- мяти ОЗУ, Мбайт Объем кэш – памяти, Кбайт
80386 SX 25,33,40 -
80386 DX 25,33,40 -
80386 SL 25,33,40 -
80486 DX 33,40,50
80486 SX
80486 DX2
80486 DX4

* - тактовые частоты различных изготовителей могут несколько отличаться от табличных значений.

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



Микропроцессоры 80386 Микропроцессоры Intel 80386 -

крупный шаг в развитии технологии и архитектуры микропроцессорных средств. Они были изготовлены по КМОП - технологии с проектной нормой на ширину проводников 1,5 мкм, позволившей на кристалле площадью примерно 100 мм 2 разместить около 275 000 транзисторов. При тактовой частоте 33 Мгц МП выполняют до 12 млн. оп/с. Кристалл находится в керамическом корпусе со 132 выводами.

К основным особенностям архитектуры МП 80386 следует отнести:

Наличие средств, обеспечивающих реализацию мультипрограммного (многозадачного) и многопользовательского режимов работы МП и режима “системы виртуальных машин”, при котором пользовательские программы могут выполняться параллельно во времени под управлением разных операционных систем;

Непосредственный доступ к физическому адресному пространству в 4 Гбайт и виртуальной памяти емкостью 64 Тбайт (примерно 70 триллионов байт) (для 80386 DX);

Сегментно - страничная организация памяти;

Высокая производительность, в 2 - 3 раза превосходящая производительность МП 80286 и достигаемая за счет большей тактовой частоты, более быстрого доступа к памяти благодаря использованию размещенных на кристалле МП кэш - па­мяти, блока управления и защиты памяти (в том числе блока быстрого преобразования адресов);

Система команд МП является расширением системы команд МП 8086, обеспечивается программная совместимость с МП 8086 и 80286 (на уровне двоичных кодов программ);

Обработка данных различных типов: целые числа, числа с плавающей точкой, десятичные числа, байты, строки символов, цепочки бит до 4 Гбит;

Использование в командах 32- , 16- , 8 - разрядных операндов;

Наличие встроенных средств самотестирования, запускаемых сигналом сброса и проверяющих примерно 75 % всех транзисторов, расположенных на кристалле.

Упрощенная структура МП 80386 приведена на рис. 4.

Рис. 4. Структура МП 80386

Блок данных содержит восемь 32 - разрядных общих регистров. В целях создания условий для выполнения операций с 16- и 8 - разрядными словами (в том числе для совместимости с МП 8086 и 80286) в каждом общем регистре адресуемо младшее полуслово, а в каждом из четырех 16 - разрядных регистров адресуемо в отдельности старший и младшие байты. Для повышения быстродействия МП в блок данных введены 4 - разрядный сдвиговый регистр (“сдвигатель”) и аппаратурные средства ускоренного выполнения операций умножения и деления.

Вектор состояния процессора образуют содержимые 32 - разрядных счетчика команд (смещение адреса команды относительно базового адреса) и регистра признаков (флажков). В регистре признаков формируются три группы признаков:

Признаки результата (знака результата, нуля, переноса, переполнения и др.);

Признаки управления (направление и др.);

Системные признаки (разрешение прерывания, режим виртуальной памяти, порог прерывания и др.).

Микропроцессор через шинный интерфейс имеет доступ к внешним 32 - разрядной шине адреса, 32 - разрядной двунаправленной шине данных, линиям управления шинами, линиями: захват (Hold), подтверждение захвата (Hold Acknowledge) запроса сопроцессора (PERCC).

Устройство управления (УУ), содержащее управляющую память (УП) микропрограмм, с учетом внешних сигналов (занято - Busy, ошибка - Error, прерывание - INTR, NMI, сброс - Reset, двойная тактовая частота - DFG) вырабатывает управляющие сигналы, инициирующие соответствующие микрооперации. В МП выполняется конвейерная обработка команд на восьми позициях, образованных восемью его основными блоками.

Используемая пользователем память может быть разделена на несколько сегментов, каждый размером до 4 Гбайт. Сегменты состоят из страниц размером 4 Кбайта.

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

МП содержит следующие сегментные регистры: CS - сегмент командных кодов; DS - сегмент данных; SS - сегмент стека; ES, FS, GS - дополнительные сегменты данных. Сегментные регистры хранят “селекторы”, адресующие соответствующие дескрипторы в кэш - памяти таблицы дескрипторов сегментов. Сами сегментные регистры в командах явно не адресуются (подразумеваемая адресация).

Рис. 5. Организация сегментирования

Формирование “линейного адреса” в сегментированной памяти поясняется рис. 5,б. Адресный указатель, образованный смещением в команде и содержащимся в сегментном регистре селектором, определяющим соответствующий дескриптор сегмента, преобразуется в 32 - разрядный линейный адрес.

Микропроцессор 80386 в состоянии одновременно выполнять программы, предназначенные для МП 8086, 80286 и 80386. МП 80386 возможны два режима работы:

Реальный режим,

Защищенный режим виртуальной памяти.

В реальном режиме МП эмулирует с повышенной скоростью МП 8086/8088, работая в однопрограммном режиме с адресным пространством, ограниченным 1 Мбайт.

В защищенном режиме МП может использовать все свое адpecнoe пространство и реализовывать “систему виртуальных 80 ´ 86 - машин” с распределением памяти согласно рис. 4.

Рис. 4. Режим виртуальных процессоров 8086

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

Однако возникают некоторые затруднения при попытках одновременного использования несколькими программами МП 8086 периферийных устройств, например, экрана дисплея. Вопрос может решаться путем применения специальной программы “виртуальный монитор”, перехватывающей обращения к операциям ввода - вывода программ виртуальных МП 8086 и организующей “виртуальный экран”.

ный микропроцессор 80486 (i486) обеспечивает более высокую скорость (до 40 млн. оп/с) выполнения прикладных программ, написанных для операционных систем DOS, OS/2, Windows и UNIX, чем все предыдущие модели МП 80´86. Он программно совместим с микропроцессорами 80286, 80386 DX & SX и содержит около 1,2 млн. транзисторов (вместе с кэш - памятью, расположенной на одном с МП кристалле).

Для увеличения производительности в процессор введены математический сопроцессор (кроме моделей SX), дополнительная сверхбыстрая кэш-память для хранения часто используемой информации объемом 8 Кбайт, конвейерная обработка и т.д. Часто используемые операции выполняются за один цикл, что сравнимо со скоростью выполнения RISC - команд. Кэш-память соединена с шиной пакетного обмена данными и позволяет проводить обмен информацией со скоростью 80/106 Мбайт/сек при частоте 25/33 МГц.

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

Возможности микропроцессора 80486 включают в себя:

Полную программную совместимость с МП 80386 DX, 80386 SX, встроенным 80376(TM) процессором, процессорами 80286, 8086 и 8088;

Реализацию блоком выполнения команд часто встречающихся операций за один цикл;

32 - разрядный процессор для выполнения арифметических и логических операций;

Встроенный модуль обработки арифметических операций с плавающей точкой для поддержки 32, 64, и 80 -разрядных форматов;

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

Сигналы управления шиной для поддержки непротиворечивости кэш-памяти в многозадачных системах;

Сегментацию, осуществляющую управление памятью для создания независимых, защищенных адресных пространств;

Постраничное разбиение, позволяющее управление памятью таким образом, что обеспечивается доступ к структурам данных, превышающим доступное пространство памяти за счет хранения данных частично в памяти, частично на диске;

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

Конвейерное выполнение команд, перекрывающееся по времени с интерпретацией других команд;

Регистры отладки для аппаратной поддержки контрольных точек в командах и данных;

Микропроцессор 80486 имеет три режима выполнения программ:

Защищенный режим, где используется естественное множество 32 - разрядных команд процессора. В данном режиме доступны все команды и все его архитектурные возможности.

Режим реальной (прямой) адресации (называемый также “реальным режимом”), в котором осуществляется эмуляция программной среды процессора 8086, с некоторыми дополнительными возможностями (такими, например, как возможность прервать данный режим). При перезагрузке процессор устанавливается именно в этот режим.

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

Программно - доступные регистры МП. Процессор 80486 содержит блок регистров из 16 программно - доступных регистров, которые могут использоваться программистами. В него входят:

32 - разрядные регистры общего назначения,

Сегментные регистры, содержащие селекторы сегментов, соответствующих различным формам доступа к памяти.

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

1. Регистры общего назначения - это 32 - битные регистры EAX, EBX, ECX, EDX, EBP, ESP, ESI и EDI. Данные регистры используются для хранения операндов логических и арифметических команд. Кроме того, они могут использоваться для хранения операндов при вычислении адресов (кроме регистра ESP, который не может быть использован как индексный операнд).

Все РОН могут использоваться для адресных вычислений и для получения результатов большинства арифметических и логических операций. Однако некоторые команды используют фиксированные регистры для хранения операндов.

2. Сегментные регистры CS, DS, SS, ES, FS и GS содержат 16 - разрядные селекторы сегментов, которые указывают на таблицу распределения памяти. Данная таблица содержит базовые адреса сегментов и другую информацию, регламентирующую доступ к памяти.

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

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

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

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

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

В некоторых случаях (при сложной структуре данных) может возникнуть необходимость иметь доступ к более чем к четырем сегментам данных. Доступ к дополнительным сегментам осуществляется путем перезагрузки регистров DS, ES, FS и GS прикладной программой в процессе выполнения.

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

Они делятся на следующие категории:

Регистр флагов EFLAGS,

Регистры управления памятью,

Управляющие регистры,

Отладочные регистры,

Тестовые регистры.

Регистр флагов EFLAGS управляет вводом / выводом, маскируемыми прерываниями, отладкой, переключением между задачами, а также виртуальным режимом 8086. Прикладными программами эти флаги должны игнорироваться, а попытки модификации их состояния из прикладных программ недопустимы. В большинстве систем попытка изменения системного флага из прикладной программы приводит к возникновению исключения (особой ситуации).

Регистр флагов включает:

Флаг AC, обеспечивающий режим контроля выравнивания в виртуальной памяти (виртуальный режим 8086),

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

Флаг NT - флаг вложенности задачи. Микропроцессор использует флаг вложенности задачи для управления последовательностью выполнения прерванных и вызванных задач.

Флаг IOPL - уровень привилегий ввода/вывода. Уровень привилегированности ввода/вывода используется механизмом защиты для управления доступом к адресному пространству ввода/вывода.

Флаг IF разрешения прерываний переводит процессор в режим, в котором он отвечает на запросы маскируемых прерываний (прерывания INTR). Очистка флага IF отменяет эти прерывания. Флаг IF не оказывает воздействия на особые ситуации или немаскируемые (NMI) прерывания.

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

Регистры управления памятью микропроцессора 40486 задают расположение структур данных, которые управляют организацией сегментированной памяти. К ним относятся:

Регистр таблицы глобальных дескрипторов GDTR, который содержит 32 - битовый базовый адрес и 16 -битовую границу сегмента для таблицы глобальных дескрипторов.

Регистр таблицы локальных дескрипторов LDTR, который содержит 32 - битовый базовый адрес, 16 - битовую границу сегмента и 16 - битовый селектор сегмента для таблицы локальных дескрипторов.

Регистр таблицы дескриптора прерываний IDTR, который содержит 32 - разрядный базовый адрес и 16 -разрядную границу сегмента для таблицы дескрипторов прерываний. Когда происходит прерывание, вектор прерывания используется в качестве индекса для получения из данной таблицы дескриптора шлюза. Последний сдержит указатель, используемый для запуска обработчика прерываний.

Регистр задачи TR, который содержит 32 - разрядный базовый адрес, 16 - разрядную границу сегмента, атрибуты дескриптора и 16 - разрядный селектор сегмента для текущей выполняемой задачи. Он содержит ссылку на дескриптор сегмента состояния задачи, находящийся в таблице глобального дескриптора.

Управляющие регистры CR0, CR1, CR2 и CR3. В большинстве систем загрузка управляющих регистров из прикладных программ невозможна (хотя в незащищенных системах такая загрузка разрешается). Прикладные программы имеют возможность считывать эти регистры для определения наличия математического сопроцессора.

Регистр CR0 содержит системные управляющие флаги, которые управляют режимами или указывают на состояние процессора в целом, а не относительно выполнения конкретных задач. Программа не должна пытаться изменить состояние каких - либо битов в зарезервированных позициях. Эти зарезервированные биты всегда должны устанавливаться в то состояние, которое они имели ранее при считывании.

Регистр CR1 резервируется для выполнения отдельных программ, имеющих сложную структуру данных.

Регистр CR2 содержит 32 - разрядный линейный адрес, вызвавший это исключение.

Регистр CR3 является базовым регистром страничного каталога.

Отладочные регистры дают микропроцессору 80486 расширенные возможности отладки, включая контрольные точки данных и средство устанавливать контрольные точки команд без модификации кодовых сегментов (что может быть полезным при отладке ПЗУ - резидентного программного обеспечения). Доступ к этим регистрам имеют только программы с наивысшим уровнем привилегированности.

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

Операции со стеком поддерживаются тремя регистрами микропроцессора:

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

Регистр указателя стека ESP. В регистре ESP содержится относительный адрес вершины стека в текущем сегменте стека. Его значение используется командами вызова подпрограмм и возврата, исключениями и прерываниями. При занесении элемента в стек, процессор уменьшает значение регистра ESP, а затем записывает элемент по адресу новой вершины.

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

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

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

Процессор 80486 не загружает команды поодиночке. Для загрузки команд перед их фактическим использованием, существует функция опережающего просмотра программы. Она обеспечивает загрузку выровненного 128 - битного блока кода, команды которого хранятся в процессоре в ожидании обработки. При этом выравнивание блока производится обнулением четырех последних битов его адреса. Данные блоки загружаются с игнорированием границ между командами. Таким образом, во время начала исполнения команды, она уже загружена в процессор и декодирована. Такой способ загрузки команд значительно повышает производительность процессора, т. к. позволяет совмещать выполнение команды, с загрузкой и декодировать команд.

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

Для эффективного управления памятью используются такие средства, как сегментация памяти и подкачка страниц.

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

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

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

Аппаратное обеспечение сегментации транслирует сегментированный (логический) адрес в адрес непрерывного, несегментированного адресного пространства, который называется линейным адресом. Если разрешена подкачка страниц, то аппаратное обеспечение подкачки транслирует линейный адрес в физический адрес. Если подкачка страниц не разрешена, то в качестве физического адреса используется сразу линейный адрес.

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

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

Если операционной системой не разрешен механизм подкачки страниц, то линейные адреса будут одновременно являться и физическими адресами. Это может быть в тех случаях, когда разработка, которая была сделана для 16 -разрядного процессора, адаптируется для использования 32 - разрядного процессора.

Операционная система, написанная для 16 - разрядного процессора, не использует механизма подкачки страниц, поскольку размер ее адресного пространства настолько мал (64Кбайт), что гораздо более эффективным является механизм свопинга между оперативной памятью и диском целых сегментов, нежели отдельных страниц памяти.

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

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

Адрес, используемый в программе, называется логическим адресом. Устройство сегментации преобразует логический адрес в некоторый промежуточный адрес несегментированного адресного пространства, называемый линейным. Устройство замещения страниц преобразует полученный линейный адрес в физический.

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

Линейный адрес, выработанный устройством сегментации, используется непосредственно как физический адрес. Для преобразования линейного адреса в физический используется устройство подкачки страниц. Устройство подкачки страниц обеспечивает другой уровень организации памяти. Оно разбивает линейное адресное пространство на блоки фиксированной длины (4Кбайт) - страницы. Логическое адресное пространство отображается в линейное адресное пространство, которое отображается на несколько страниц. Страницы могут находиться как в памяти, так и на диске.

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

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

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

Сегментированное адресное пространство с различными сегментами для пространств кода, данных и стека. Может быть использовано до 16383 линейных адресных пространств, размером до 4 Гбайт каждое.

Обе эти модели, кроме того, могут обеспечивать защиту памяти.

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

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

Сегментированная модель. В сегментированной модели организации памяти логическое адресное пространство содержит до 16383 сегментов, размером до 4 Гбайт каждый, т. е. общий объем может достигать 2 46 байт (64 Тбайт). МП отображает это 64 - терабайтовое логическое адресное пространство в физическое адресное пространство (до 4 Гбайт).

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

Доступ к сегментированному адресному пространству осуществляется с помощью указателя, который состоит из двух частей:

16 - разрядного поле селектора сегмента, которое идентифицирует сегмент.

Смещения, которое представляет собой 32 -разрядный адрес внутри сегмента.

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

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

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

Обращение к памяти из программ осуществляется при помощи фиксированных смещений относительно данного базового адреса, что позволяет загружать в память и выполнять объектные модули без корректировки адресов (динамическая компоновка).

был разработан процессор Pentium P5 класса 80´86, использующий архитектурную концепцию CISC (Completed Instruction Set Computer). Корпус процессора квадратный с 321 контактными выводами матричного типа, то есть выводы расположены по всему периметру корпуса в несколько рядов (конструктив Socket 7).

Он имеет тактовую частоту до 100 МГц и более, выполнен по субмикронной технологией (с шириной проводников менее 1 мкм), позволившей разместить на кристалле около 3,1 млн. транзисторов. Благодаря такой компактности сокращается время передачи данных внутри микропроцессора, и тем самым обеспечивается более высокая производительность работы системы в целом (до 200 млн. оп/с).

Процессор имеет выполненную на кристалле процессора кэш-память первого уровня (L1) объемом 32 Кбайт, разбитую на два банка: кэш-память данных и кэш-памяти команд, каждая из которых имеет объем 16 Кбайт. Кэш-память предназначена для временного хранения многократно используемых программой команд и данных, что позволяет процессору реже обращаться за ними к внешней медленнодействующей основной памяти (ОП). Каждый банк памяти соединяется с ядром собственной шиной и обеспечивает высокоскоростной обмен информацией по двум физически разнесенным шинам. Такая архитектура обеспечивает устранение конфликтов в системе при передаче команд и данных.

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

Несмотря на большую вычислительную мощность процессора Р5, обработка программ трехмерной графики, число которых неуклонно возрастает, является самым узким местом при обработке команд. Увеличение же производительности процессора за счет повышения тактовой частотой малоэффективно. Это связано с тем, что повышение тактовой частоты в два раза ведет к увеличению производительности в интервале 15 - 45%% в зависимости от тактовой частоты (чем выше тактовая частота процессора, тем меньше прирост производительности). Данное обстоятельство поставило задачу поиска иных путей повышения производительности процессоров.

Одним из таких путей является увеличение емкости кэш-памяти первого уровня с 16 до 32 Кбайт, второй путь - внедрение технологии ММХ (ММХ - Multi Media Extension).

Увеличения емкости кэш-памяти обеспечивает увеличение вероятности нахождения данных в кэш-памяти при их считывании процессором. Так при объеме кэш-памяти 8 Кбайт процессор в более чем в 80% случаев обращения к памяти без «промаха» находит данные в кэш-памяти. Двукратное увеличение объема кэш-памяти обеспечивает 5% прирост «попаданий», а четырехкратное увеличение – прирост около 8%. Очевидно, что дальнейшее наращивание оказывает­ся неоправданным: каждое последующее удвоение объема приносит лишь процент (или менее) увеличения вероятности «попадания». Иными словами, 32 Кбайт - опти­мальный объем, и поэтому кэш-память нового про­цессора Pentium была увеличена только вдвое.

Кроме того, несколько изменена ее структура: она сделана четырехканальной, что снизило вероятность остановки одного из конвейеров при невозможности получить из нее данные.

В конвейер команд была введена до­полнительная ступень определения взаи­мозависимости инструкций, благодаря че­му сказалось возможным усовершенство­вать механизм предсказания ветвлений. Все описанные меры позволили увеличить производительность примерно на 10-20%%.

Второй путь, связанный с внедрением технологии ММХ, обязан широкому использованию мультимедийных программ. ММХ – это архитектура процессора, обеспечивающая эффективное выполнение команд трехмерной графики за счет высокоскоростной обработки вещественных чисел (чисел с плавающей точкой). Она включает специальные наборы команд и устройств, которые используют принцип выполнения одного потока команд над множеством потоков данных - SIMD (Single Instruction Multiplay Data). В этом случае обеспечивается конвейеризация при выполнении команд: например, в 64-разрядном арифметико-логическом устройстве одновременно могут выполняться две 32 - разрядные, четыре 16-разрядные или восемь 8 – разрядных операций; введены комбинированные команды типа “умножение со сложением”, инструкции упаковки - распаковки данных и т.д.

Так, если для выполнения большинства офисных задач хватало да­же производительности 100 МГц Pentium, то полноразмерное экранное видео с одновременной обработкой звуко­вой информации оказывалось на пределе возможностей самых производительных процессоров. В то же время обработку ау­дио- и видеоинформации вполне можно было бы поручить специализированному встроенному сопроцессору, подобно имеющемуся в Pentium для ускорения опе­раций с плавающей запятой. Длятого, что­бы как можно меньше переделывать уст­ройство дешифрации команд, коды мультимедийных инструкций были сделаны совпада­ющими с кодами математического сопро­цессора и запрещена его одновременная работа со встроенным мультимедийным сопроцессором. В результате при обработ­ке мультимедиа информации включается одни сопроцессор, при математических расчетах - другой. Переключение осуществляется установкой или сбросом соответствующего флага. Таким образом, подобный мультимедийный процессор может работать с аудио- и видеоинформацией на 50-80%% быстрее своего не мультимедийного аналога.

Первые мультимедийные процессоры на 166 МГц P5 ММХ и на 200 МГц P5 ММХ появились в январе 1997 г. Корпуса процессоров P5 и P5 MMX аналогичны по исполнению Р5.

Архитектурно-структурные особенности. Характерной чертой процессоров Р5 являются многочисленные архитектурно-структурные особенности, которые включают следующие:

Использование суперскалярной архитектуры;

Раздельное кэширование программного кода и данных;

Наличие буфера адреса ветвления;

Использование высокопроизводительного блока вычислений с плавающей запятой;

Наличие расширенной 64 - битовой шины данных;

Обеспечение поддержки многопроцессорного режима работы;

Применение средств задания размера страницы памяти;

Использование средств обнаружения ошибок и функциональной избыточности;

Управление производительностью;

Наращиваемость с помощью Intel Overdrive процессора.

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

Термин “суперскалярная” обозначает микропроцессорную архитектуру, которая содержит более одного вычислительного блока. Эти вычислительные блоки, или конвейеры, являются узлами, где происходят все основные процессы обработки данных и команд. Возможность выполнять множество команд за один период тактовой частоты существует благодаря тому, что Р5, имея два конвейера, может выполнять две инструкции одновременно. Двойной конвейер Р5 выполняет простую команду за пять этапов:

Предварительная подготовка,

Первое декодирование (декодирование команды),

Второе декодирование (генерация адреса),

Выполнение,

Обратная выгрузка.

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

Двухконвейерная обработка данных осуществляется двумя секциями обработки данных - U и V (рис. 5).

Каждая из них включает блок формирования адреса и АЛУ. Первичная U - секция может выполнять все операции над целыми числами и операции с плавающей запятой. Вторичная V-секция может выполнять только простые операции с целыми числами и частично - операции с плавающей запятой. Входящие в секции блоки чтения-записи разделены на блоки чтения и блоки записи. Каждое из них снабжено своим буфером-накопителем. Такое исполнение ядра процессора позволяет последовательно идущие команды чтения и записи вести одновременно, что полностью исключает конфликтные ситуации в магистрали и повышает скорость при вводе-выводе команд.

Рис. 5. Архитектура микропроцессора Pentium Р5

Для эффективного обмена внутренняя магистраль выполнена 64-разрядной. При этом она представляет собой две независимые 32-разрядные шины, к каждой из которой могут подключаться устройства в зависимости от ее состояния – свободна шина или занята передачей информации.

Одновременное выполнение двух команд в разных секциях называется сдваиванием. Не все последовательно выполняемые команды допускают сдваивание. В этом случае используется только одна U - секция. Чтобы добиться максимальной эффективности работы процессора P5, желательно перекомпилировать программы так, чтобы можно было сдвоить наибольшее количество команд.

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

Раздельное кэширование программного кода и данных является другим важнейшим усовершенствованием, реализованным в Р5. В нем имеется кэш-память первого уровня L1, разбитая на две кэш-памяти по 8 (позже по 16) Кбайт каждый - программный кэш и кэш данных, управляемые своим контроллером. Схемы кэш - контроллера и сами блоки кэш-памяти размещены на кристалле МП. В кэш-память из различных областей системного ОЗУ копируется информация - данные и программные коды.

В настоящее время основную долю рынка универсальных микропроцессоров занимают 32-битные и 64-битные микропроцессоры. Данная глава содержит описание микропроцессоров корпорации Intel с 32-битной архитектурой, которые составляют семейство IA-32 (Intel Architecture-32). Эта архитектура составляет основу 64-разрядной архитектуры x86‑64 корпорации Intel и архитектуры AMD-64 корпорации AMD.

2.1 Состав и функции регистров

Регистрами называют высокоскоростную память, расположенную внутри ЦПУ и предназначенную для оперативного хранения данных и быстрого доступа к ним со стороны внутренних компонентов процессора. Например, при выполнении оптимизации циклов программы по скорости, переменные, к которым выполняется доступ внутри цикла, располагают в регистрах процессора, а не в памяти. Совокупность всех таких регистров иногда называют сверхоперативной памятью (СоЗУ).

2.1.1 Основные регистры

На рисунке 2.1 изображена структура основных регистров и их названия. Существует 8 регистров общего назначения (РОН), 6 сегментных регистров, регистр флагов, регистр указателя команд, а также системные регистры, регистры отладки и тестирования.

Регистры общего назначения (РОНы) . Эти регистры используются в основном для выполнения арифметических операций и пересылки данных. К каждому РОНу можно обратиться как к 32-разрядному или как к 16-разрядному регистру. К некоторым регистрам можно обращаться как к 8-разрядным. Например, регистр ЕАХ является 32-разрядным, однако его младшие 16-разрядов называются регистром АХ. Старшие 8-разрядов регистра АХ называются АН, а младшие 8-разрядов – AL. 16-разрядные части индексных регистров и регистров-указателей обычно используются только при написании программ для реального режима адресации, т.е. для MS-DOS или её эмуляции в Windows.

Значение аббревиатур имён регистров:

Префикс E в начале имён регистров – expanded (расширенный).

Постфикс X в конце имён регистров означает, собственно, регистр.

AX – Accumulator (накопитель).

BX – Base register (регистр базы).

CX – Counter (счётчик).

DX – Data (данные).

AL – Accumulator low (младшая половина регистра AX).

AH – Accumulator high (старшая половина регистра AX).

BL – Base low (младшая половина регистра BX).

BH – Base high (старшая половина регистра BX).

CL – Counter low (младшая половина регистра CX).

CH – Counter high (старшая половина регистра CX).

DL – Data low (младшая половина регистра DX).

DH – Data high (старшая половина регистра DX).

SI – Source index (индекс источника). Содержит текущий адрес источника.

DI – Destination index (индекс получателя). Содержит текущий адрес приемника.

BP – Base pointer (указатель базы). Для произвольного доступа к данным внутри стека

SP – Stack pointer (указатель стека). Содержит указатель вершины стека.

CS – Code segment (сегмент кода).

DS – Data segment (сегмент данных).

ES – Extra Data segment (дополнительный сегмент данных).

FS – Extended Data segment (дополнительный сегмент данных).

GS – Extended Data segment (дополнительный сегмент данных).

SS – Stack segment (сегмент стека).

IP – Instruction pointer (указатель команд или счётчик команд).

F – Flags (регистр флагов).

GDTR – Global descriptor table register (регистр глобальной таблицы дескрипторов).

IDTR – Interruption descriptor table register (регистр таблицы дескрипторов прерываний).

TR – Task register (регистр задач).

LDTR – Local descriptor table register (регистр локальной таблицы дескрипторов).

DR – Debug register (регистр отладки).

TR – Test register (регистр тестирования).

CR – Control register (управляющий регистр).

Особенности использования регистров. При выполнении команд процессором часть регистров общего назначения имеют специальное предназначение.

    Содержимое регистра ЕАХ автоматически используется при выполнении команд умножения и деления. Поскольку этот регистр обычно связан с выполнением арифметических команд, его часто называют расширенным регистром аккумулятора (expanded accumulator ).

    Регистр ЕСХ автоматически используется процессором в качестве счетчика цикла.

    С помощью регистра ESP происходит обращение к данным, хранящимся в стеке. Стек – это системная область памяти, обращение к которой осуществляется по принципу FILO (First input – last output) "первым записали, последним прочитали". Этот регистр обычно никогда не используется для выполнения обычных арифметических операций и команд пересылки данных. Его часто называют расширенным регистром указателя стека (expanded stack pointer ). Регистр ESP указывает на адрес вершины стека (адрес, куда будет заноситься следующая переменная командой PUSH).

    Регистры ESI и EDI обычно используют для команд высокоскоростной пересылки данных из одного участка памяти в другой. Поэтому их иногда называют расширенными индексными регистрами источника и получателя данных (expanded source index и expanded destination index ). Регистр ESI – адрес источника, и содержит адрес начала блока информации для операции "переместить блок" (полный адрес DS:ESI), а регистр EDI – адрес назначения (полный адрес ES:EDI).

    Регистр EBP обычно используется компиляторами языков программирования высокого уровня для обращения к параметрам функции и для ссылок на локальные переменные, размещенные в стеке. Он не должен использоваться для выполнения обычных арифметических операций или для перемещения данных, за исключением случаев применения особых методик программирования опытными программистами. Его часто называют расширенным регистром указателя стекового фрейма (expanded frame pointer ). Регистр ЕВР содержит адрес, начиная с которого в стек вносится или забирается информация (или "глубина" стека). Параметры функций имеют положительный сдвиг относительно ЕВР, локальные переменные – отрицательный сдвиг, а полный адрес этого участка памяти хранится в регистровой паре SS:EBP.

    Регистр EIP хранит смещение (offset) адреса команды. Полный адрес на следующую исполняемую команду хранится в регистровой паре CS:ЕIP.

    Регистры ESP, EBP, ESI, EDI хранят смещение адреса данных.

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

    кода (CS), в них хранятся только команды процессора, т.е. машинный код программы;

    данных (DS, ES, FS и GS), в них хранятся области памяти, выделяемые под переменные программы и под данные;

    стека (SS), в них хранится системная область памяти, называемая стеком, в которой распределяются локальные (временные) переменные программы и параметры, передаваемые функциям при их вызове.

Сегментные регистры загружаются селекторами сегментов, которые являются смещениями либо глобальной таблицы дескрипторов (GDT – Global Descriptor Table), либо локальной таблицы дескрипторов (LDT – Local Descriptor Table).

Биты сегментных регистров содержат следующую информацию:

0 – 1. RPL – Requested Privilege Level. Уровень запрашиваемых привилегий.

2. TI – Table Indicator. Бит таблицы индикаторов. Указывает процессору где искать указанный селектор. Если бит установлен, то процессор читает селектор из таблицы локальных дескрипторов. Если бит сброшен, то процессор читает селектор из таблицы глобальных дескрипторов.

3 – 15. В этих битах хранится индекс глобальной или локальной таблицы дескрипторов.

Регистр CS слишком мал для хранения сегмента кода, поэтому он должен быть установлен на исполнимый сегмент. Регистр SS слишком мал для хранения сегмента стека, поэтому он должен быть установлен на разрешённый по записи сегмент данных.

Уровень привилегий, установленный в сегментный регистр CS является уровнем привилегий запущенной программы, и называется текущим уровнем привилегий (CPL – Current privilege level). Сегментные регистры DS, ES, FS, GS предназначены для данных и должны быть установлены на сегмент данных с разрешением записи. Уровни привилегий, требуемые каждым из этих селекторов, должен быть больше, чем текущий уровень привилегий CPL.

С каждым из шести сегментных регистров связаны теневые регистры дескрипторов. В теневые регистры в защищённом режиме переписываются 32-разрядный базовый адрес сегмента, 20-разрядный предел и атрибуты (права доступа) из дескрипторных таблиц.

Регистр указателя команд. В регистре EIP хранится смещение относительно начала программы (offset) следующей выполняемой команды. В процессоре есть несколько команд, которые влияют на содержимое этого регистра. Изменение адреса, хранящегося в регистре ЕIP, вызывает передачу управления на новый участок программы.

Регистр флагов EF (EFLAGZ ) . Биты этого регистра называются флагами и отвечают либо за особенности выполнения некоторых команд CPU, либо отражают результат выполнения команд блоком ALU. Флаги регистра перечислены в таблице 2.1. Биты с 22 по 31 включительно – зарезервированы.

Таблица 2.1 Регистр флагов

Для анализа битов этого регистра предусмотрены специальные команды процессора. Говорят, что флаг установлен, когда бит флага равен 1, и что флаг сброшен, когда значение его бита равно 0. Кроме этого расширенный регистр EF по сравнению с регистром F содержит пять новых флагов.

Управляющие флаги. Состояние битов регистра EFLAGS, соответствующих управляющим флагам, программист может изменить с помощью специальных команд процессора. Эти флаги (DF, IF,TF) управляют процессом выполнения некоторых команд CPU:

8. TF – Trap flag. Флаг трассировки (пошагового режима). При его установке (TF=1) после выполнения каждой команды вызывается внутреннее прерывание INT 1, которое останавливает вычислительный процесс, давая возможность проверить содержимое регистров.

9. IF – Interrupt-enable flag. Флаг разрешения прерывания. При IF=1 разрешается выполнение маскированных аппаратных прерываний. При IF=0 – запрещается.

10. DF – Direction flag. Флаг управления направлением обработки массивов в строковых командах. При DF=1 индексные регистры SI, DI, которые принимают участие в строковых командах, автоматически декрементируются на количество байт операнда, осуществляя тем самым обработку строк с конца в начало. При DF=0 – инкрементируются, осуществляя обработку с начала в конец строки.

Флаги состояния . Эти флаги отражают различные признаки результата выполнения арифметических и логических команды CPU:

0. CF – Carry flag. Флаг переноса устанавливается в случае, если при выполнении беззнаковой арифметической операции получается число, разрядность которого превышает разрядность выделенного для него поля результата. В командах сдвига флаг CF фиксирует значение старшего бита.

2. PF – Parity flag. Флаг четности/паритета устанавливается при чётном количестве единиц в результате.

4. AF – Auxiliary Carry. Флаг дополнительного переноса/заёмаиз младшей тетрады в старшую (из третьего в четвёртый разряд). Используется в командах обработки 8-битных данных, чаще всего – двоично-десятичных чисел.

6. ZF – Zero flag. Флаг нуля устанавливается, если при выполнении арифметической или логической операции получается число, равное нулю (т.е. все биты результата равны 0).

7. SF – Sign flag. Флаг знакадублирует значение старшего бита результата. SF=0 для положительного результата, SF=1 для отрицательного.

11. OF – Overflow flag. Флаг переполнения, или) устанавливается в случае, если при выполнении арифметической операции со знаком получается число, разрядность которого превышает разрядность выделенного для него поля результата.

Флаги , добавленные в регистр EF:

12-13. IOPL – I/O Privilege Level. Флаг уровня привилегий ввода-вывода. Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода в зависимости от привилегированности задачи.

14. NT – Nested task flag. Флаг вложенности задачи. Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую.

16. RF – Resume flag. Флаг возобновления. В режиме отладки единичное значение RF позволяет осуществить рестарт команды после прерываний. Используется совместно с регистрами точек отладочного останова.

17. VM – Virtual Mode flag. Флаг виртуального режима. Признак работы микропроцессора в режиме виртуального 8086. 1 – процессор работает в режиме виртуального 8086; 0 – процессор работает в реальном или защищенном режиме.

18. AC – Alignment Check. Флаг режима работы процессора, при котором происходит контроль выравнивания. Используется только на уровне привилегий 3. Если AC=1 и AM=1 (AM – бит в регистре управления CR0), то в случае обращения к операнду, не выровненному по соответствующему пределу (2 или 4 или 8) байт, будет вызвано исключение 17. Выравнивание операнда по пределам 2,4,8 означает, что адрес операнда кратен соответственно 2,4,8.

19. VIF – Virtual Interrupt Flag. Флаг разрешения прерывания в виртуальном режиме работы процессора.

20. VIP – Virtual Interrupt Pending. Флаг задержки прерывания в виртуальном режиме работы процессора.

21. ID – CPU Identification. Флаг идентификации процессора. Флаг может быть изменён, если процессор поддерживает команду CPUID.

В управляющих регистрах CR0-CR3 хранятся признаки состояния процессора, общие для всех задач. Регистр CR0 имеет следующие биты:

0. PE – Protection Enable. Флаг защищённого режима. Если PE=1, то режим работы процессора – защищённый.

1. MP – Mathematic present. Флаг наличия математического сопроцессора. Если MP=1, то математический сопроцессор присутствует.

2. EM – Emulate Numeric Extension. Флаг эмуляции команд над числами с плавающей запятой. Когда флаг установлен, то команды для работы с вещественными числами могут быть эмулированы программно.

3. TS – Task Switched. Флаг переключения задач. Флаг устанавливается после того, как задача переключена.

4. ET – Extension Type. Флаг типа расширения. Устанавливается, если присутствует арифметический сопроцессор 387 и выше.

5. NE – Numeric Error Enable. Флаг разрешения ошибки сопроцессора. Если флаг установлен, то в случае ошибки в сопроцессоре генерируется исключительная ситуация 16.

16. WP – Write Protect. Флаг защиты от записи. Если флаг установлен, то ядру операционной системы назначаются страницы памяти в режиме read-only (только чтение).

18. AM – Alignment Mask. Флаг маскирования выравнивания. Когда флаг установлен, то в случае обращения к невыровненным операндам будет генерироваться исключительная ситуация 17. Если флаг сброшен, то такая исключительная ситуация маскируется.

29. NW – Not Write-Through. Флаг запрета сквозной записи.

30. CD – Cache Disable. Флаг запрета кэширования.

31. PG – Paging Enable. Флаг режима страничной организации памяти. Когда флаг установлен, операционная система работает в режиме страничной организации памяти.

Остальные биты регистра CR0 зарезервированы.

Регистр CR1 зарезервирован. В регистре CR2 хранится 32-разрядный линейный адрес, по которому получен отказ страницы памяти. В 20 старших разрядах регистра CR3 хранится физический базовый адрес таблицы каталога страниц и биты управления кэш-памятью. Регистр CR4 содержит биты разрешения архитектурных расширений МП. В целом, эти регистры используются в системном программировании и устанавливают режим работы процессора (нормальный, защищенный и т.д.), постраничное распределение памяти и т.д.

Системные адресные регистры. В системных регистрах-указателях глобальной дескрипторной таблицы GDTR и таблицы прерываний IDTR хранятся 32-разрядные базовые адреса и 16-разрядные пределы таблиц соответственно. Системные сегментные регистры задач TR и локальной дескрипторной таблицы LDTR являются 16-разрядными селекторами. Им соответствуют теневые регистры дескрипторов, которые содержат 32-разрядный базовый адрес сегмента, 20-разрядный предел и байт права доступа.

В регистрах отладки DR0-DR3 содержатся 32-разрядные адреса точек останова в режиме отладки; DR4–DR5 зарезервированы и не используются; DR6 отображает состояние контрольной точки; DR7 – руководит размещением в программе контрольных точек.

Регистры тестирования TR входят в группу модельно-специфических регистров, их состав и количество зависят от типа процессора: в МП 386 используются два регистра TR6 и TR7 для контроля постраничной системы распределения памяти операционной системой. В Pentium II и выше используется двенадцать регистров TR1–TR12. Эта группа регистров содержит также результаты тестирования МП и кэш-памяти.