Данная статья продолжает тему углубленного исследования современных
технологий. Рекомендации по организации рабочего места, объяснение, почему
именно DOS выбрана в качестве полигона для исследований, комментарии по
использованию устройства POST Card при отладке программ, а также описание
целевой аудитории содержатся в ранее опубликованной статье “64-битный
режим под DOS: исследовательская работа № 1
”.

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

 

Классификация систем

Платформа x86 использует 3 технологии для реализации параллельного выполнения
программных потоков:

  1. Многопроцессорные системы – содержат несколько процессоров, каждый
    процессор в виде отдельной микросхемы.
  2. Многоядерные процессоры (Multi-Core) – содержат несколько процессоров
    (ядер), реализованных в одной микросхеме. Ядра могут быть реализованы на одном
    кристалле, либо каждое ядро реализовано на отдельном кристалле, во втором
    случае внутри микросхемы находится несколько кристаллов. Встречаются и
    комбинированные реализации, например, 4-ядерный процессор на основе двух
    кристаллов по 2 ядра на каждом. С точки зрения программной модели,
    многоядерные процессоры совместимы с многопроцессорными системами.
  3. Технология Hyper-Threading – использует представление одного процессорного
    ядра в виде нескольких (обычно двух) логических процессоров. Каждый логический
    процессор имеет свой блок регистров (Architectural State – AS), все остальные
    блоки общие. Наличие своего блока AS для каждого потока позволяет избежать
    выполнения процедуры сохранения контекста текущей выполняемой задачи и
    загрузки контекста новой задачи при переключении задач, за счет этого
    повышается скорость. То есть Hyper-Threading, это компромисс: работает
    быстрее, чем обычный “однопотоковый” процессор, но медленнее, чем многоядерный
    процессор или многопроцессорная система.

С точки зрения программной модели, система с Hyper-Threading использует те же
принципы взаимодействия между процессорами, что и многопроцессорные системы, но
полной программной совместимости между ними нет, так как в отличие от регистров,
входящих в Architectural State, некоторые из системных регистров MSR
(Model-Specific Registers) общие для двух логических процессоров.

Встречаются реализации, одновременно использующие несколько указанных
технологий. Например, система может иметь 2 процессора, каждый процессор
содержит по 2 ядра, каждое ядро поддерживает Hyper-Threading и содержит по 2
логических процессора. Общее количество параллельно работающих программных
потоков в такой системе может достигать 8 (2x2x2).

 

Обработка прерываний в мультипроцессорной системе

Аппаратная поддержка взаимодействия процессоров и координации распределения
нагрузки в мультипроцессорной системе (включая системы с Hyper-Threading и
Multi-Core) обеспечивается за счет расширения функциональности подсистемы
прерываний. Рассмотрим две архитектуры данной подсистемы.

Архитектура PIC (Programmable Interrupt Controller) применяется в
однопроцессорных системах, начиная с PC/AT 286. Использует две микросхемы Intel
8259A (советский аналог – КР1810ВН59А), включенные по схеме каскадирования.
Разумеется, в современных платформах, контроллеры Intel 8259A в виде отдельных
микросхем не присутствуют, а реализованы в составе “южного моста” чипсета, но с
точки зрения программной модели, это несущественно. Обеспечивается обработка 16
линий запросов на прерывание (IRQ0-IRQ15), из которых для устройств доступно 15,
а одна (IRQ2) используется для каскадного включения контроллеров Intel 8259A.
При наличии активных запросов от устройств, разрешенных для обслуживания,
контроллер генерирует запрос на процессор. Процессор в ответ генерирует цикл
подтверждения прерывания и считывает из контроллера номер вектора,
соответствующего наиболее приоритетной (из активных) линии IRQ. После этого
запускается процедура обработки прерывания, выбранная в соответствии с номером
вектора.

Микросхема Intel 8259A (КР1810ВН59А) описана в [20], архитектура подсистемы
прерываний PC/AT описана в [22].

Архитектура APIC (Advanced Programmable Interrupt Controller) обязательна для
мультипроцессорных систем, включая системы с Hyper-Threading и многоядерными
процессорами. Для однопроцессорных систем опциональна. Так как часть преимуществ
архитектуры APIC актуальна и для однопроцессорных систем, современные платформы
обычно используют архитектуру APIC независимо от количества процессоров. Каждый
процессор (будь то физический процессор в виде отдельной микросхемы, ядро
многоядерного процессора или логический процессор при Hyper-Threading) имеет
свой локальный контроллер прерываний - Local APIC, физически расположенный в
составе процессора. Для приема запросов от периферии используется контроллер I/O
APIC. Большинство платформ использует один I/O APIC, физически расположенный в
составе “южного моста” чипсета, при этом количество линий запросов на прерывание
обычно равно 24. Вместе с тем, некоторые системные платы для серверов и рабочих
станций содержат более одного I/O APIC.

Архитектура APIC описана в [10]. В современных реализациях систем, контроллер
Local APIC интегрирован в процессор, поэтому его архитектура описана в
документации на процессоры: [8], [14]. Контроллер I/O APIC интегрирован в “южный
мост” чипсета, поэтому его архитектура описана в документации на чипсеты, также
существует дискретная реализация I/O APIC – микросхема 82093AA, описанная в
[11], программно совместимая с интегрированными реализациями I/O APIC, поэтому
документ [11] может быть использован при работе с ними.

Главными отличиями архитектуры APIC, от архитектуры PIC, связанными с
поддержкой мультипроцессорных систем являются:

  1. Возможность использования механизма прерываний для передачи сообщений
    между процессорами, то есть поддержка IPI (Inter-Processor Interrupts).
  2. Управление приоритетами процессоров. Подсистема прерываний
    мультипроцессорной системы должна не только выбирать наиболее приоритетный
    запрос IRQ из нескольких одновременно активных, как это происходит в
    однопроцессорной системе, но и выбирать процессор, которому будет “поручено”
    выполнение данного запроса. Это должен быть процессор, выполняющий в данный
    момент наименее приоритетную процедуру.

Большинство современных платформ поддерживает обе архитектуры: PIC и APIC, c
возможностью программного переключения режимов. Для этого предусмотрена опция в
BIOS Setup. Важно понимать, что независимо от состояния этой опции, BIOS, на
момент передачи управления на загрузку ОС оставляет контроллер прерываний в
режиме PIC. Это нужно для совместимости с DOS средой. В случае установки режима
APIC в BIOS Setup, BIOS только декларирует для ОС возможность переключения в
режим APIC, и если ОС поддерживает этот режим (например, Windows XP), она
сделает это при загрузке.

Важное предупреждение. Если вы инсталлировали ОС, а затем изменили состояние
выше указанной опции, ОС может перестать загружаться, так как она при
инсталляции ”жестко” сконфигурировалась на определенный режим (PIC или APIC).

 

Особенности BIOS мультипроцессорной системы

BIOS мультипроцессорной системы (включая системы с Hyper-Threading и
многоядерными процессорами), должен обеспечивать следующее:

1) Присвоение одному из процессоров статуса Bootstrap Processor (BSP),
остальным – статуса Application Processors (AP). После
включения питания или
сигнала системного сброса (RESET)
, все процессоры обращаются по адресу FFFFFFF0h
(Reset Vector). Процессор BSP должен начать выполнение процедуры BIOS POST для
обеспечения старта платформы. Процессоры AP должны быть остановлены.

2) Каждому процессору должен быть присвоен уникальный идентификатор (Local
APIC ID), по которому происходит адресация данного процессора при передаче
запросов от I/O APIC к Local APIC для обслуживания прерываний от периферии, а
также при взаимодействии между Local APIC при передаче межпроцессорных сообщений
(IPI).

3) Подготовка информации для ОС. BIOS должен сгенерировать таблицы,
перечисляющие контроллеры Local APIC и I/O APIC, присутствующие в системе.
Используя эти таблицы, ОС обнаружит и запустит все процессоры и обеспечит прием
и обработку запросов на прерывание.

Существует два протокола передачи данной информации от BIOS к ОС:

1) Таблица Multiprocessing Table (MPT), рассмотренная в [10].

2) Таблица Multiple APIC Description Table (MADT), рассмотренная в [18].

 

Описание работы программы

Прилагаемый каталог WORK содержит следующие файлы:

ASM_TD.BAT – обеспечивает ассемблирование, линковку и запуск программы под
отладчиком. При запуске TASM и TLINK используются опции, обеспечивающие
добавление отладочной информации в EXE файл.

ASM_EXE.BAT – обеспечивает ассемблирование и линковку. Генерируется EXE файл.

SMP.ASM – основной модуль программы.

HANDLERS.INC – процедуры обработки межпроцессорных прерываний.

A20.INC – библиотека для управления адресной линией A20.

BIGREAL.INC – библиотека для поддержки Big Real Mode и 32-битной адресации в
реальном режиме.

DELAY.INC – процедура задержки.

DATASEGS.INC – сегменты данных: сегмент для хранения переменных, сегмент для
построения глобальной дескрипторной таблицы, а также сегменты стека для
Bootstrap Processor (BSP) и Application Processor (AP).

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

Данная программа написана для систем с Hyper-Threading, многоядерных
процессоров и многопроцессорных систем.

Так как предлагаемая программа является “полуфабрикатом”, необходимо учесть
следующее:

Значения BSP_APIC_ID, AP_APIC_ID программист должен установить вручную перед
отладкой. Функционально завершенные программы, для получения данных значений,
анализируют таблицы MPT или ACPI MADT. Анализ конфигурационных таблиц здесь
опущен, чтобы не “загромождать” пример. Автор планирует рассмотреть данный
вопрос в отдельной статье. Подробности в [8], [10], [14], [18].

Для реализации функционально завершенной программы, перед использованием
32-битных инструкций, рекомендуется добавить фрагмент, проверяющий, что
процессор минимум 386 (если важно, чтобы программа не “зависала” на
8086/88/286). Хотя, конечно на данных системах мы просто будем выходить с
ошибкой – APIC не обнаружен.

Для реализации функционально завершенной программы, рекомендуется добавить
фрагмент, проверяющий бит APIC Present (бит 9 регистра EDX после выполнения
CPUID функции 1). Иначе, возможны “зависания”, при попытке запуска на машине,
где режим APIC не поддерживается.

При работе под отладчиком, подпрограммы, содержащиеся в модулях A20.INC,
BIGREAL.INC рекомендуется проходить без трассировки, так как в них имеются
секции кода, несовместимые с контекстом отладчика. Осторожность требуется и при
трассировке макросов, с помощью которых реализованы инструкции RDMSR, WRMSR и
т.п. Рекомендуется проходить их в режиме Run, установив точку останова на
инструкции, получающей управление после их выполнения.

 

Источники информации

Электронные документы, доступные на сайте
developer.intel.com.

1) 64-bit Extension Technology Software Developer’s Guide. Volume 1 of 2.
Order Number 300834-001.
2) 64-bit Extension Technology Software Developer’s Guide. Volume 2 of 2. Order
Number 300835-001.
3) TLBs, Paging-Structure Caches, and Their Invalidation. Application Note.
Document Number 317080-001.
4) Intel 64 and IA-32 Architectures Optimization Reference Manual. Order Number
248966-015.
5) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 1: Basic
Architecture. Order Number 253665-023US.
6) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2A:
Instruction Set Reference, A-M. Order Number 253666-023US.
7) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2B:
Instruction Set Reference, N-Z. Order Number 253667-023US.
8) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 3A:
System Programming Guide, Part 1. Order Number 253668-023US.
9) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 3B:
System Programming Guide, Part 2. Order Number 253669-023US.
10) Multiprocessor Specification. Version 1.4. Order Number 242016-006.
11) 82093AA I/O Advanced Programmable Interrupt Controller (IOAPIC). Order
Number 290566-001.
12) Introduction to Hyper-Threading Technology. Document Number 250008-002.

Электронные документы, доступные на сайте
developer.amd.com.

13) AMD64 Architecture Programmer’s Manual. Volume 1: Application
Programming. Publication No. 24592.
14) AMD64 Architecture Programmer’s Manual. Volume 2: System Programming.
Publication No. 24593.
15) AMD64 Architecture Programmer’s Manual. Volume 3: General-Purpose and System
Instructions. Publication No. 24594.
16) AMD64 Architecture Programmer’s Manual. Volume 4: 128-Bit Media
Instructions. Publication No. 26568.
17) AMD64 Architecture Programmer’s Manual. Volume 5: 64-Bit Media and x87
Floating-Point Instructions. Publication No. 26569.

Электронные документы, доступные на сайте
acpi.info.

18) Advanced Configuration and Power Interface Specification. Hewlett-Packard
Corporation, Intel Corporation, Microsoft Corporation, Phoenix Technologies
Ltd., Toshiba Corporation. Revision 3.0.

 

Книги

19) В.Л. Григорьев. Микропроцессор i486. Архитектура и программирование.
Москва ТОО “ГРАНАЛ” 1993.
20) В.Г. Артюхов, А.А. Будняк. В.Ю. Лапий. С.М. Молявко, А.И. Петренко.
Проектирование микропроцессорной электронно-вычислительной аппаратуры.
Справочник. Киев “Тэхника” 1988.
21) К. Г. Самофалов, О.В. Викторов. Микропроцессоры. Библиотека инженера. Киев
“Тэхника” 1989.
22) 2B ProGroup: В.А. Вегнер, А.Ю. Крутяков, В.В. Серегин, В.А. Сидоров, А.В.
Спесивцев. Аппаратура персональных компьютеров и ее программирование. IBM
PC/XT/AT и PS/2. Москва “Радио и связь” 1995.

Оставить мнение