~~META: creator = Programado &title = titletext &keywords = keyword1 keyword2 keyword3 &audience = alle &page-topic = topic of the pages ~~ ====== Программная модель процессора x86_64 ====== Программная модель процессора x86-64 с точки зрения ассемблера описывает, как процессор выполняет инструкции, а также как он хранит и манипулирует данными. Среда выполнения включает в себя память (адресное пространство), регистры общего назначения, сегментные регистры, регистр флагов и регистр указателя команд. ===== Режимы работы ===== Архитектура x86-64 имеет два основных режима работы: [[processor_x86-64:Long_Mode|Длинный режим (Long Mode)]] и устаревший режим (Legacy Mode). ^ Состояние ^^ Требуется\\ операционная\\ система ^ Тип\\ выполняе-\\ мого кода ^ Размер \\ (биты) ^^ Кол-во \\ регистров \\ [[processor_x86-64:general-purpose_registers|GPR]]^ ^ режим ^ под-\\ режим ^ ::: ^ ::: ^ адреса ^ операнды \\ (по умол-\\ чанию\\ выделен) ^ ::: ^ | [[processor_x86-64:Long_Mode|Длинный режим (Long Mode)]] | [[processor_x86-64:64-bit_mode|64-битный режим (64-bit mode)]] | 64-разрядная ОС, 64-разрядная прошивка UEFI | 64-бит | 64 | 8, 16, **32**, 64 | 16 | | ::: | [[processor_x86-64:Compatibility_mode|Режим совместимости (Compatibility mode)]] | Загрузчик или 64-битная ОС | 32-битный защищенный режим | 32 | 8, 16, **32** | 8 | | ::: | ::: | ::: | 16-битный защищенный режим | 16 | 8, **16**, 32 | 8 | | Унаследо-\\ ванный режим (Legacy mode) | Защищенный режим (Protected mode) | Загрузчик, 32-битная ОС или 32-разрядная прошивка UEFI | 32-битный защищенный режим | 32 | 8, 16, **32** | 8 | | ::: | ::: | 16-битная ОС в защищенном режиме | 16-битный защищенный режим | 16 | 8, **16**, 32[[processor_x86-64:software_model_x86-64#note_1|1]] | 8 | | ::: | Режим виртуального 8086 (Virtual 8086 mode) | 16-битная ОС в защищенном режиме или 32-битная ОС | 16-битный защищенный режим | подмно-\\ жество реального режима | 8, **16**, 32[[processor_x86-64:software_model_x86-64#note_1|1]] | 8 | | ::: | Нереальный режим (Unreal mode) | Загрузчик или ОС в реальном режиме | реальный режим | 16, 20, 32 | 8, **16**, 32[[processor_x86-64:software_model_x86-64#note_1|1]] | 8 | | ::: | [[processor_x86-64:Real_mode|Реальный режим (Real mode)]] | Загрузчик, ОС реального режима или любая ОС, взаимодействующая с интерфейсом BIOS | реальный режим | 16, 20, [[https://en.wikipedia.org/wiki/A20_line|21]] | 8, **16**, 32[[processor_x86-64:software_model_x86-64#note_1|1]] | 8 | Обратите внимание, что 16-битный код, написанный для 80286 и ниже, не использует 32-битные инструкции операнда. Код, написанный для 80386 и более поздних версий, может использовать префикс переопределения размера операнда (0x66). Обычно этот префикс используется кодом защищенного и длинного режима с целью использования 16-битных операндов, поскольку этот код будет выполняться в сегменте кода с размером операнда по умолчанию, равным 32 битам. В реальном режиме размер операнда по умолчанию составляет 16 бит, поэтому префикс 0x66 интерпретируется иначе, изменяя размер операнда на 32 бита. Архитектура x86-64 поддерживает три основных режима работы: защищенный, реальный и системного управления. Режим работы определяет какие инструкции и архитектурные функции доступны: * **Реальный режим (real mode)** — это режим, в который переходит процессор после включения или перезагрузки. Он реализует среду программирования процессора Intel 8086 с возможностью расширения (например, перехода в защищенный режим или режим системного управления). Это стандартный 16-разрядный режим, в котором доступно только 1 Мб физической памяти. Иногда этот режим называют режимом реальных адресов (real-address mode) , потому что в нем нельзя активировать механизм трансляции виртуальных адресов в физические. Это значит, что все адреса, к которым обращаются программы, являются физическими, т. е. без какого-либо преобразования будут выставлены на шину адреса. В этом режиме «родной» для процессора размер равен 2 байтам, или слову (WORD); * **Защищённый режим (protected mode)** — этот режим является основным режимом для 32-битных процессоров. Среди возможностей защищённого режима есть возможность напрямую запускать программное обеспечение 8086 в реальном режиме в защищённой многозадачной среде. Эта функция называется режимом виртуального 8086, хотя на самом деле это не режим процессора. Режим виртуального 8086 на самом деле - это атрибут защищённого режима, который можно включить для любой задачи. В этом режиме можно получить доступ к 4-гигабайтному физическому адресному пространству, если память, а при включении специального механизма трансляции адресов можно получить доступ к 64 Гб физической памяти. В защищённый режим можно перейти только из реального режима. Защищённый режим называется так потому, что позволяет защитить данные операционной системы от приложений. В этом режиме «родной» для процессора размер данных - это 4 байта, или двойное слово (DWORD). Все операнды, которые выступают в этом режиме как адреса, должны быть 32-битными; * **Режим системного управления (System management mode — SMM)** — этот режим предоставляет операционной системе или исполнительной системе прозрачный механизм для реализации специфичных для платформы функций, таких как управление питанием и безопасность системы. Процессор входит в SMM, когда активируется внешний контакт прерывания SMM (SMI#) или активируется при помощи прерываний (SMI), полученных от улучшенного программируемого контроллера прерываний (Advanced Programmable Interrupt Controller - APIC). Работа в режиме SMM приостанавливает работу операционной системы. Переход в этот режим возможен только аппаратно. В SMM процессор переключается на отдельное адресное пространство с сохранением основного контекста текущей работающей программы или задачи. Затем код, специфичный для SMM, может прозрачно выполняться. Вернувшись из SMM, процессор возвращается в состояние, предшествующее прерыванию. SMM появился в процессорах Intel386 TM SL и Intel486 TM SL и стали стандартной функцией в семействе процессоров Pentium. * **Режим виртуального процессора 8086 (virtual mode 8086)** - это подрежим защищённого режима для поддержки старых 16-разрядных приложений. Его можно включить для отдельной задачи в многозадачной операционной системе защищённого режима. Процессоры с архитектурой x86-64 поддерживают V86 только в режиме совместимости, но не в длинном режиме. * **Длинный режим или 64-битный режим (Long Mode или 64-bit mode)** — этот режим позволяет запускать приложения в 64-битной операционной системе, написанные для доступа к 64-битному линейному адресному пространству. В длинном режиме увеличивается количество регистров общего назначения и регистров SSE с 8 до 16. Регистры общего назначения расширены до 64 бит. В этом режиме также вводится новый префикс кода операции (REX) для доступа к расширениям регистров. 64-битный режим включается операционной системой на основе сегмента кода. В этом режиме размер адреса по умолчанию составляет 64 бита, а размер операнда по умолчанию — 32 бита. Размер операнда по умолчанию может быть переопределен для каждой инструкции с использованием префикса кода операции REX в сочетании с префиксом переопределения размера операнда. Префиксы REX позволяют указать 64-битный операнд при работе в 64-битном режиме. С помощью этого механизма многие существующие инструкции были расширены, чтобы разрешить использование 64-битных регистров и 64-битных адресов. По своему принципу работы он сходен с защищённым режимом, за исключением нескольких аспектов. В этом режиме можно получить доступ к 252 байтам физической памяти и к 248 байтам виртуальной памяти. В 64-разрядный режим можно перейти только из защищённого режима. В этом режиме «родной» для процессора размер данных - это 4 байта или двойное слово (DWORD), но можно оперировать данными размером в 8 байт. Размер адреса всегда 8 байтовый. * **Режим совместимости (наследственный, Legacy Mode или Compatibility mode)** — режим совместимости позволяет использовать большинство устаревших 16-разрядных и 32-битных приложений для запуска без перекомпиляции под 64-битной операционной системой. Режим совместимости также поддерживает все уровни привилегий, которые поддерживаются в 64-битном и защищенном режимах. Устаревшие приложения, работающие в режиме виртуального 8086 или использующие аппаратное управление задачами в этом режиме работать не будет. Режим совместимости включается операционной системой на основе сегмента кода. Это означает, что 64-разрядная ОС может одновременно поддерживать 64-разрядные приложения, работающие в 64-разрядном режиме (Long Mode), и поддерживать устаревшие 32-разрядные приложения (без перекомпиляции под 64-бит), которые работают в режиме совместимости. Режим совместимости аналогичен 32-битному защищенному режиму. Приложения получают доступ только к первым 4 ГБ линейной памяти адресного пространства. В режиме совместимости используются 16-битные и 32-битные адреса и размеры операндов. Как и в защищенном режиме, этот режим позволяет приложениям получать доступ к физической памяти объемом более 4 ГБ с помощью PAE (Physical Address Extensions). В режиме совместимости «родной» для процессора размер данных - это двойное слово. ===== Базовая среда выполнения в режиме x86 ===== Любая программа или задача, работающая на процессоре x86 получает набор ресурсов для выполнения инструкций, а также для хранения кода, данных и информации о состоянии. Эти ресурсы составляют базовую среду выполнения для процессора x86. Процессоры Intel 64 и amd64 поддерживают базовую среду выполнения процессора, которая может выполнять 64-битные программы (длинный режим) и 32-битные программы (режим совместимости). Базовая среда выполнения используется совместно прикладными программами и операционной системой или исполнительной системой, работающей на процессоре. * **Адресное пространство** — любая задача или программа, работающая на процессоре x86, может обращаться к линейному адресному пространству до 4 ГБ (232 байта) и физическому адресному пространству до 64 ГБ (236 байт). * **Основные регистры** — восемь регистров общего назначения, шесть сегментных регистров, регистр флагов EFLAGS и регистр EIP (указатель инструкций) составляют базовую среду выполнения, в которой можно выполнять набор инструкций общего назначения. Эти инструкции выполняют базовые целочисленные арифметические операции над целыми числами в виде байтов, слов и двойных слов, управляют потоком программы, работают с битовыми и байтовыми строками и адресуют память. * **регистры сопроцессора** — восемь регистров данных x87 FPU, регистр управления x87 FPU, регистр состояния, регистр указателя инструкций x87 FPU, регистр указателя операндов (данных) x87 FPU, регистр тегов x87 FPU и регистр кода операции x87 FPU. предоставить среду выполнения для работы со значениями с плавающей запятой одинарной точности, двойной точности и двойной расширенной точности, целыми словами, целыми числами в виде двойных слов, целыми числами в виде четырех слов и двоично-десятичными значениями (BCD). * **Регистры MMX** — восемь целочисленных 64-битных регистров MMX, поддерживающих операции SIMD (позволяют параллельно обрабатывать несколько элементов данных в одной инструкции) над 64-битными упакованными целыми числами в виде байтов, слов и двойных слов. * **Регистры XMM** — восемь регистров данных XMM и регистр MXCSR поддерживают выполнение операций SIMD над 128-битными упакованными значениями с плавающей запятой одинарной и двойной точности, а также над 128-битными упакованными целыми числами в виде байтов, слов, двойных слов и четверных слов. * **Регистры YMM** — регистры данных YMM поддерживают выполнение 256-битных SIMD-операций с 256-битными упакованными значениями с плавающей запятой одинарной и двойной точности, а также с 256-битными упакованными целыми числами в виде байтов, слов, двойных слов и четверных слов. * **Регистры границ** — каждый из 128-битные регистров границ диапазона BND0-BND3 хранит нижнюю и верхнюю границы (по 64 бита каждая), связанные с указателем на буфер памяти. Они поддерживают выполнение инструкций Intel MPX (Memory Protection Extension). * **BNDCFGU** и **BNDSTATUS** — регистр BNDCFGU настраивает операции MPX пользовательского режима при проверке границ. BNDSTATUS предоставляет дополнительную информацию о #BR, вызванном операцией MPX. * **Стек** — для поддержки вызовов процедур или подпрограмм и передачи параметров между процедурами или подпрограммами, в среду выполнения x86 включены стек и ресурсы управления стеком. Стек располагается в памяти. [{{ :processor_x86-64:programing_model_x86.png?direct&600 ||Базовая среда выполнения x86 без поддержки 64-режима.}}] В дополнение к ресурсам, предоставляемым в базовой среде выполнения, архитектура IA-32 предоставляет следующие ресурсы как часть архитектуры системного уровня. Они обеспечивают обширную поддержку операционной системы и программного обеспечения для разработки систем. * **Порты ввода/вывода** — архитектура x86 поддерживает передачу данных в/из порты ввода/вывода (I/O). * **Регистры управления** — пять регистров управления (от CR0 до CR4) определяют режим работы процессора и характеристики выполняемой в данный момент задачи. * **Регистры управления памятью** — GDTR, IDTR, TR и LDTR указывают расположение структур данных, используемых в управлении памятью в защищенном режиме. * **Регистры отладки** — регистры отладки (от DR0 до DR7) контролируют и позволяют отслеживать операции отладки процессора. * **Диапазонные регистры типа памяти** (MTRR) — MTRR используются для назначения типов памяти областям памяти. * **Моделезависимые регистры (MSR)** — специальные регистры процессоров архитектуры x86, наличие и назначение которых отличается в разных моделях. Они используются для управления производительностью процессора и составления отчетов о ней. Практически все MSR выполняют функции, связанные с системой, и недоступны для прикладной программы. Единственным исключением из этого правила является счетчик меток времени. * **Регистры проверки компьютера (MCG_CAP MCG_STAT MCG_CTL и т.д.)** — состоят из набора управления, состояния и отчетов об ошибках в моделезависимых регистрах, которые используются для обнаружения и сообщения об аппаратных (машинных) ошибках. * **Счетчики мониторинга производительности** — позволяют отслеживать события, связанные с производительностью процессора. ===== Базовая среда выполнения в режиме x64 ===== Среда выполнения для 64-битного режима аналогична 32-битному с несколькими отличиями: * **Адресное пространство** — задача или программа, работающая в 64-битном режиме, может адресовать линейное адресное пространство до 264 байт и физическое адресное пространство до до 252 байт. Программное обеспечение может запрашивать у CPUID размер физического адреса, поддерживаемого процессором. * **Основные регистры выполнения программы** — количество доступных регистров общего назначения (GPR) равно 16. GPR имеют разрядность 64 бита и поддерживают операции с целыми числами в виде байтов, слов, двойных и четверных слов. Доступ к байтовым регистрам осуществляется равномерно до младших 8 бит. Регистр указателя команд становится 64-битным. Регистр EFLAGS расширен до 64 бит и называется регистром RFLAGS. Старшие 32 бита RFLAGS зарезервированы. Младшие 32 бита RFLAGS аналогичны EFLAGS. * **Регистры XMM** — количество регистров XMM увеличено до шестнадцати. * **Регистры YMM** — количество регистров YMM увеличено до шестнадцати. * **Стек** — размер указателя стека составляет 64 бита. Размер стека не контролируется битом в дескрипторе SS (как в не 64-битных режимах), и размер указателя не может быть переопределен префиксом инструкции. * **Регистры управления** — регистры управления расширены до 64 бит. Добавлен новый управляющий регистр (регистр приоритета задачи: CR8 или TPR). * Регистры отладки — регистры отладки расширены до 64 бит. * **Регистры таблицы дескрипторов** -регистр глобальной таблицы дескрипторов (GDTR) и регистр таблицы дескрипторов прерываний (IDTR) расширяются до 10 байт, чтобы они могли содержать полный 64-битный базовый адрес. Регистр локальной таблицы дескрипторов (LDTR) и регистр задач (TR) также расширяются, чтобы содержать полный 64-битный базовый адрес. [{{ :processor_x86-64:programing_model_64.png?direct&600 ||Базовая среда выполнения x86-64 в 64-битном режиме.}}]