Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Введение [ править ]

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

Такое поведение [ необходимо пояснение ] применимо только к компьютерам фон Неймана (то есть компьютерам с архитектурой Гарварда ), которые могут запускать самомодифицирующийся код и иметь своего рода конвейерную обработку инструкций . Почти все современные высокопроизводительные компьютеры удовлетворяют этим трем требованиям. [1]

Обычно поведение предварительной выборки PIQ невидимо для модели программирования ЦП. Однако есть некоторые обстоятельства, при которых поведение PIQ является видимым и должно быть принято во внимание программистом.

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

При выполнении самомодифицирующегося кода изменение кода процессора непосредственно перед текущим местом выполнения может не повлиять на то, как процессор интерпретирует код, поскольку он уже загружен в его PIQ. Он просто выполняет свою старую копию, уже загруженную в PIQ, вместо новой и измененной версии кода в своей оперативной памяти и / или кеше .

Такое поведение PIQ можно использовать для определения того, выполняется ли код внутри эмулятора или непосредственно на оборудовании реального ЦП. [ необходима цитата ] Большинство эмуляторов, вероятно, никогда не будут имитировать такое поведение. Если размер PIQ равен нулю (изменения в коде всегда немедленно влияют на состояние процессора), можно сделать вывод, что либо код выполняется в эмуляторе, либо процессор аннулирует PIQ при записи на адреса, загруженные в PIQ. .

Оценка производительности на основе теории очередей [ править ]

Именно А. К. Эрланг (1878–1929) первым задумал очередь как решение проблемы перегрузки телефонного трафика. Предлагаются различные модели массового обслуживания , чтобы приблизительно моделировать системы массового обслуживания в реальном времени, чтобы их можно было математически проанализировать для различных характеристик производительности.

Модели организации очередей могут быть представлены с использованием обозначений Кендалла :

A1 / A2 / A3 / A4

куда:

  • A1 - это распределение времени между двумя прибытием
  • A2 - распределение времени обслуживания
  • A3 - общее количество серверов
  • A4 - емкость системы
  1. Модель M / M / 1 (единый сервер с одной очередью / марковская ): в этой модели элементы очереди обслуживаются в порядке очереди. Учитывая среднюю скорость прибытия и обслуживания, фактическая скорость варьируется вокруг этих средних значений случайным образом и, следовательно, должна определяться с использованием функции распределения кумулятивной вероятности . [2]
  2. Модель M / M / r : эта модель является обобщением базовой модели M / M / 1, в которой несколько серверов работают параллельно. Эта модель также может моделировать сценарии с нетерпеливыми пользователями, которые немедленно покидают очередь, если они не получают услуги. Это также можно смоделировать с помощью процесса Бернулли, имеющего только два состояния: успех и неудача. Лучшим примером этой модели являются наши обычные стационарные телефонные сети. [3]
  3. Модель M / G / 1 ( Модель конечных входных данных Такача): эта модель используется для анализа сложных случаев. Здесь распределение времени обслуживания больше не является марковским процессом . В этой модели рассматривается случай, когда один ремонтник ремонтирует более одной вышедшей из строя машины. Время обслуживания любого пользователя в этом случае увеличится. [4]

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

Очередь инструкций [ править ]

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

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

Процессор обычно имеет два отдельных блока для получения инструкций и для выполнения инструкций. [6] [7]

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

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

Архитектура 8086 имеет шестибайтовый конвейер инструкций предварительной выборки, в то время как 8088 имеет четырехбайтовую предварительную выборку. Когда блок выполнения выполняет текущую инструкцию, блок интерфейса шины заранее считывает из памяти до шести (или четырех) байтов кодов операций. Длина очереди была выбрана на основе моделирования. [9]

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

Недостатки [ править ]

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

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

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

пример кода x86 [ править ]

code_starts_here:  mov  bx ,  ah ead  mov  word  ptr  cs : [ bx ],  9090h впереди:  jmp  near  to_the_end  ; Другой код to_the_end:

Эта самомодифицирующаяся программа перезапишет jmp to_the_end двумя NOP (кодируется как 0x9090 ). Переход jmp рядом с to_the_end собирается в два байта машинного кода, поэтому два NOP просто перезапишут этот переход и ничего больше. (То есть переход заменяется кодом бездействия.)

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

Пример программы для определения размера [ править ]

Это пример NASM - синтаксического самомодифицирующегося алгоритма x86 - языка ассемблера , который определяет размер PIQ:

code_starts_here:  xor  bx ,  bx  ; нулевой регистр bx  xor  ax ,  ax  ; нулевой регистр топор mov  dx ,  cs  mov  [ code_segment ],  dx  ; "вычислить" codeseg в дальнем прыжке ниже (edx здесь тоже)вокруг:  cmp  ax ,  1  ; проверьте, не был ли изменен топор  je  found_size  ; 0x90 = код операции "nop" (НЕТ ОПЕРАЦИИ)  mov  byte  [ nop_field + bx ],  0x90  inc  bx db  0xEA  ; 0xEA = код операции "дальний переход"  dw  flush_queue  ; за ним следует смещение (rm = "dw", pm = "dd") code_segment:  dw  0  ; а затем сегмент кода (рассчитанный выше) flush_queue:  ; 0x40 = опкод "вкл топором" (ПОВЫШЕНИЕ ах)  мы  байты  [ nop_field + BX ],  0x40 nop_field:  раз  256  NOP  JMP  вокруг found_size:  ;  ; регистр bx теперь содержит размер PIQ  ; этот код предназначен для [[реального режима]] и [[16-битного защищенного режима]], но его можно легко изменить на ; также работает в [[32-битном защищенном режиме]]. просто замените "dw" на  ; смещение до "дд". вам также нужно изменить dx на edx вверху, как  ; Что ж. (dw и dx = 16-битная адресация, dd и edx = 32-битная адресация)  ;

Этот код в основном изменяет поток выполнения и определяет с помощью грубой силы, насколько велик PIQ. «Как далеко мне нужно изменить код передо мной, чтобы он повлиял на меня?» Если он находится слишком близко (он уже находится в PIQ), обновление не будет иметь никакого эффекта. Если это достаточно далеко, изменение кода повлияет на программу, и тогда программа определит размер PIQ процессора. Если этот код выполняется в многозадачной ОС, переключение контекста может привести к неверному значению.

Ссылки [ править ]

  1. ^ "Информационный центр ARM" . Статьи технической поддержки ARM .
  2. ^ Хейс, Джон (1998). Компьютерная архитектура и организация (Второе изд.). Макгроу-Хилл.
  3. ^ Феллер, Уильям (1968). Введение в теорию вероятностей и ее приложения (второе изд.). Джон Вили и сыновья.
  4. ^ Папулис, Афанасий; С.Унникришна Пиллаи (2008). Вероятность, случайные величины и случайные процессы (Четвертое изд.). Макгроу-Хилл. С. 784-800.
  5. ^ Заки, Сафват; В. Карл Хамахер; Звонко Г. Вранешич (1996). Компьютерная организация (Четвертое изд.). Макгроу-Хилл. С.  310–329 . ISBN 0-07-114309-2.
  6. ^ «Блок-схема процессора 8086» .
  7. ^ Холл, Дуглас (2006). Микропроцессоры и интерфейсы . Тата МакГроу-Хилл. п. 2.12. ISBN 0-07-060167-4.
  8. ^ Холл, Дуглас (2006). Микропроцессоры и интерфейсы . Нью-Дели: Тата Макгроу-Хилл. С. 2.13–2.14. ISBN 0-07-060167-4.
  9. ^ МакКевитт, Джеймс; Бейлисс, Джон (март 1979). «Новые варианты от больших фишек». Спектр IEEE : 28–34.

Внешние ссылки [ править ]