Арм аби для windows

Арм аби для windows

Особое Конструкторское Бюро Систем Автоматизированного Проектирования (ОКБ САПР), созданное при ВНИИПВТИ является признанным разработчиком и производителем комплексов средств защиты от несанкционированного доступа «Аккорд»™, технологий защиты информации и электронного документооборота на их основе. Реализованные в СЗИ НСД семейства «Аккорд» требования к аппаратным СЗИ и принципы аппаратной защиты уже стали фактическим стандартом и применяются всеми крупными разработчиками средств защиты, действующими на российском рынке СЗИ.

ОКБ САПР является лицензиатом ФСБ, Гостехкомиссии России и ФАПСИ, имеет аттестованное Гостехкомиссией России производство средств защиты информации от несанкционированного доступа и широкую дилерскую сеть в большинстве субъектов Российской Федерации, ведет активную работу по подготовке специалистов в области защиты информации. На изделия ОКБ САПР получено: 22 сертификата Гостехкомиссии России, Минобороны России — 1, 4 сертификата ФАПСИ и 3 сертификата системы Госстандарта России.

Более 100 000 комплексов СЗИ НСД «Аккорд»™, 1000 машин более 200 комплексов «Банк» и 2000 комплексов «Клиент» системы работают в различных автоматизированных системах государственных и коммерческих организаций.

Основные сферы деятельности ОКБ САПР:

  • разработка, производство и реализация СЗИ НСД, в т.ч. с применением криптографических средств;
  • проектирование и создание АС различного уровня и назначения в защищенном исполнении;
  • внедрение в АС предприятий и организаций технологии защищённого электронного документооборота на основе СЗИ НСД «Аккорд»™;
  • проведение совместно с ВНИИПВТИ аттестационных испытаний объектов информатизации и выделенных помещений с выдачей аттестата соответствия;
  • подготовка специалистов в области защиты информации; обеспечение работ по технической защите информации.

Разработки ОКБ САПР показали, что возможности защиты информации программными средствами принципиально ограничены, и в системах защиты необходимо использование аппаратных средств со специальными свойствами. Такие принципы аппаратной защиты были реализованы в комплексе средств защиты информации от несанкционированного доступа — аппаратном модуле доверенной загрузки — в котором основные функции системы защиты информации выполняются до загрузки операционной системы. Комплекс реализуется в различных операционных средах: MS DOS, Windows 3x, Windows 9x, Windows NT, Windows 2000, Windows XP; OS/2; UNIX; Linux. Основными модификациями контроллеров комплекса СЗИ НСД являются контроллер и сопроцессор безопасности С помощью последнего можно передавать конфиденциальную информацию в режиме по открытым каналам связи в зашифрованном виде.

На основе контроллеров семейства «Аккорд»ТМ ОКБ САПР была разработана технология защиты электронных документов с использованием защитных кодов аутентификации. Данная технология уже используется в банковских платежных системах с целью предотвращения попыток злоумышленников ввести фиктивные или модифицировать используемые электронные банковские документы, а также с целью организации сквозного контроля над прохождением электронными документами всех предписанных этапов их существования.

Все комплексы «Аккорд»™ имеют необходимые сертификаты соответствия.

В контроллерах семейства «Аккорд» обеспечивается технологический режим перепрограммирования, который позволяет менять встроенное ПО без замены аппаратной части комплекса СЗИ НСД. Как следствие — контроллеры этого типа получают «пожизненную» гарантию ОКБ САПР.

Решения ОКБ САПР

комплекс средств защиты информации от несанкционированного доступа

— аппаратный модуль доверенной загрузки предназначен для применения на ПЭВМ (РС) типа IBM PC AT с целью защиты средств вычислительной техники и информационных ресурсов от НСД. Этот комплекс обеспечивает режим доверенной загрузки в различных операционных средах: MS DOS; Windows 3.x; Windows 9x; Windows NT, Windows 2000, Windows XP; OS/2; UNIX; Linux . Основным принципом работы является выполнение процедур, реализующих функции системы защиты информации, до загрузки операционной системы. Процедуры идентификации/аутентификации пользователя; контроля целостности аппаратных и программных средств; администрирование; блокировка загрузки операционной системы с внешних носителей информации размещены во внутренней памяти микроконтроллера платы «Аккорд». Таким образом, пользователь не имеет возможности изменения процедур, которые влияют на функциональность системы защиты информации. В энергонезависимой памяти контроллера «Аккорд» хранится информация о персональных данных пользователей, данные для контроля целостности программных и аппаратных средств, журнал регистрации и учета системных событий и действий пользователя. Эти данные могут быть изменены только авторизованным администратором безопасности информации, так как доступ к энергонезависимой памяти полностью определяется логикой работы программного обеспечения прошитого в микроконтроллер.

СЗИ НСД семейства «Аккорд»ТМ реализованы на базе контроллера (для ПЭВМ с шинным интерфейсом ISA) и его функционального аналога для шинного интерфейса PCI —

Для организаций, использующих промышленные PC компьютеры с шинным интерфейсом PC/104, может представлять интерес комплекс СЗИ НСД Данный комплекс прошел испытания в жестких условиях эксплуатации (повышенная вибрация, широкий диапазон температур, высокая влажность и т.д.). Он может применяться в специализированных компьютерах, используемых в бортовой аппаратуре (наземные, воздушные, морские и промышленные системы), в измерительной аппаратуре, в устройствах связи, в мобильных системах, в том числе и военного назначения.


сопроцессор безопасности

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

Специальное программное обеспечение включает в себя:

  • Загрузчик — настраивает параметры системы, загружает в ОЗУ монитор и операционную систему.
  • Монитор — инициализирует ресурсы и запускает операционную систему. Предоставляет возможность работы с ресурсами платы в многозадачном режиме.
  • Операционная система реального времени;
  • Криптодрайвер — программа поддержки криптоускорителя Криптодрайвер обеспечивает взаимодействие монитора с платой криптоускорителя, установленной в шину расширения платы Код драйвера находиться в энергонезависимой памяти расположенной на плате криптоускорителя и активизируется монитором. Обеспечен режим независимости ПО от типа криптоускорителя;
  • Прикладные библиотеки — набор вспомогательных процедур для самостоятельного программирования сопроцессора безопасности


дополнительно полностью реализует функции комплекса СЗИ НСД (аппаратный модуль доверенной загрузки).

Рекомендации по его применению:

  1. В качестве аппаратного СКЗИ для:
    • шифрования данных в каналах ввода/вывода;
    • шифрования дисков
    • формирования и проверки электронной цифровой подписи;
  2. Организации защищённых виртуальных наложенных сетей в гетерогенных открытых сетях;
  3. Организации защищённых аудио и видеоконференций;
  4. В технологической защите электронного документооборота с использованием защитных кодов аутентификации (ЗКА).

Наиболее целесообразно применять в качестве серверного средства защиты информации. комплексы защиты от НСД к информации «АРМ АБИ»

Комплексы позволяют реализовать систему защиты от НСД к ПЭВМ и информации с применением персональных идентификаторов пользователей, выполненных на базе устройств памяти Touch Memory как для автономных ПЭВМ, так и для ПЭВМ, объединенных в вычислительную сеть.

Указанные комплексы работают совместно с комплексами и базируются на использовании контроллеров

Комплексы обеспечивают:

  • защиту от НСД к ПЭВМ;
  • идентификацию/ аутентификацию пользователей;
  • аппаратный контроль целостности системных файлов и критичных разделов Regestry;
  • доверенная загрузка ОС;
  • контроль целостности программ и данных, их защиту от несанкционированных модификаций;
  • создание индивидуальной для каждого пользователя изолированной рабочей программной среды;
  • запрет запуска неразрешенных программ;
  • разграничение доступа пользователей к массивам данных и программам с помощью дискреционного контроля доступа;
  • разграничение доступа пользователей и процессов к массивам данных с помощью мандатного контроля доступа, управление потоками информации;
  • автоматическое ведение протокола регистрируемых событий;
  • удаленное централизованное управление настройками системы защиты.

Комплексы включают в себя следующие подсистемы:

  • Подсистему управления доступом
  • Подсистему регистрации и учета (аудит)
  • Подсистему обеспечения целостности
  • Подсистему удаленного централизованного управления настройками системы защиты «Автоматизированное Рабочее Место Администратора Безопасности» (АРМ АБИ).

С помощью данных комплексов администратор безопасности информации имеет возможность описать любую не противоречивую политику безопасности на основе наиболее полного набора атрибутов:

I. Операции с файлами:
R — разрешение на открытие файлов только для чтения.
W — разрешение на открытие файлов для записи.
C — разрешение на создание файлов на диске.
D — разрешение на удаление файлов.
N — разрешение на переименование файлов.
V — видимость файлов. Позволяет делать существующие файлы невидимыми для программ. Этот параметр имеет более высокий приоритет, чем R,W,D,N,O.
О — эмуляция разрешения на запись информации в файл. Этот параметр имеет более низкий приоритет, чем W (открыть для записи).

II. Операции с каталогом:
M — создание каталогов на диске.
Е — удаление каталогов на диске.
G — разрешение перехода в этот каталог.

III. Прочее:
Х — разрешение на запуск программ.

IV. Регистрация:
r — регистрируются все операции чтения файлов диска в журнале.
w — регистрируются все операции записи файлов диска в журнале.

Для разграничение прав доступа к информационным ресурсам, кроме дискреционного, осуществлен мандатный принцип доступа субъектов к информационным ресурсам. Набор атрибутов СЗИ Аккорд может применяться для описания ПРД при обращении с рабочей станции ЛВС к ресурсам файловых серверов. Кроме этого, администратор БИ для каждого субъекта — пользователя системы определяет:

  • перечень файлов, целостность которых должна контролироваться системой и опции контроля;
  • запуск стартовой задачи (для функционально замкнутых систем);
  • наличие, либо отсутствие привилегий супервизора;
  • детальность журнала доступа;
  • назначение/изменение пароля для аутентификации;
  • временные ограничения — время по дням недели (с дискретностью 30 мин), в которое разрешено начало работ для данного субъекта;
  • параметры управления экраном — гашение экрана через заранее определенный интервал времени (в случае, если в течение указанного интервала действия оператором не выполнялись), подача соответствующих звуковых и визуальных сигналов.

комплекс средств защиты информации «ШИПКА» (Шифрование Идентификация Подпись Коды Аутентификации)

Комплекс «ШИПКА» предназначен для защиты прав участников информационного обмена, обеспечения защиты электронного документооборота с использованием защитных кодов аутентификации (ЗКА) и ЭЦП (Федеральный закон «Об подписи»), а также для обеспечения конфиденциальности обрабатываемых данных. Позволяет организовывать безопасный обмен информацией с использованием ГОСТ 28147–98, ГОСТ Р 34.11–94, ГОСТ 34.11–01.

Комплекс «ШИПКА», установленный на отдельном ПК, обеспечивает аутентификацию пользователя, защиту программ и данных, выполняя функции электронного ключа, обеспечивает защиту от НСД несанкционированного доступа к ПЭВМ, а также позволяет осуществлять управление ключами (в том числе ключами шифрования и подписи пользователя).

При объединении рабочих станций с установленными устройствами «ШИПКА» в локальную сеть обеспечивается аутентификация как пользователя, так и рабочей станции, организуется управление ключами доступа к совместно используемым ресурсам с применением криптографической защиты команд управления сетью.

Организация корпоративной сети с использованием комплекса «ШИПКА» позволяет аутентифицировать локальные сети в составе корпоративной сети и их пользователей, осуществляет поддержку VPN (виртуальной частной сети). Такое применение комплекса также позволяет организовывать электронную торговлю за счет возможности создания юридически значимого электронного документооборота. Функции аутентификации, поддержки VPN, управления ключами, обеспечение защиты авторских прав, защиты программ и данных осуществляется также и в глобальной сети Internet с применением защитного комплекса «ШИПКА». Дополнительно обеспечивается возможность организации оплаты счетов через Internet.

Комплекс «ШИПКА» — универсальное отечественное средство для создания и применения систем юридически значимого электронного документооборота и электронного ведения бизнеса в соответствии с законодательством России.

Общие сведения о соглашениях ABI ARM64 Overview of ARM64 ABI conventions

Базовый двоичный интерфейс приложений (ABI) для Windows при компиляции и выполнении на процессорах ARM в 64-разрядном режиме (архитектура ARMv8 или более поздних версий) по большей части следует стандартному встроенному ABI (EABI) AArch64 ARM. The basic application binary interface (ABI) for Windows when compiled and run on ARM processors in 64-bit mode (ARMv8 or later architectures), for the most part, follows ARM’s standard AArch64 EABI. В этой статье рассматриваются некоторые основные принципы и изменения, описываемые в EABI. This article highlights some of the key assumptions and changes from what is documented in the EABI. Дополнительные сведения о 32-разрядной версии ABI см. в статье Общие сведения о соглашениях ABI ARM. For information about the 32-bit ABI, see Overview of ARM ABI conventions. Дополнительные сведения о стандартном встроенном двоичном интерфейсе приложения ARM см. в статье Двоичный интерфейс приложения для архитектуры ARM (внешняя ссылка). For more information about the standard ARM EABI, see Application Binary Interface (ABI) for the ARM Architecture (external link).

Определения Definitions

С внедрением поддержки 64-разрядной архитектуры компания ARM определила ряд терминов: With the introduction of 64-bit support, ARM has defined several terms:

  • AArch32 — устаревшая 32-разрядная архитектура набора инструкций (ISA), определяемая компанией ARM, включая выполнение в режиме Thumb. AArch32 – the legacy 32-bit instruction set architecture (ISA) defined by ARM, including Thumb mode execution.
  • AArch64 — новая 64-разрядная архитектура набора инструкций (ISA), определяемая компанией ARM. AArch64 – the new 64-bit instruction set architecture (ISA) defined by ARM.
  • ARMv7 — спецификация 7-го поколения оборудования ARM, которое поддерживает только архитектуру AArch32. ARMv7 – the specification of the «7th generation» ARM hardware, which only includes support for AArch32. Это первая версия оборудования ARM, поддерживаемая Windows для ARM. This version of the ARM hardware is the first version Windows for ARM supported.
  • ARMv8 — спецификация 8-го поколения оборудования ARM, которое поддерживает архитектуры AArch32 и AArch64. ARMv8 – the specification of the «8th generation» ARM hardware, which includes support for both AArch32 and AArch64.

В Windows также используются следующие термины: Windows also uses these terms:

  • ARM — это 32-разрядная архитектура ARM (AArch32), которая иногда называется WoA (Windows на ARM). ARM – refers to the 32-bit ARM architecture (AArch32), sometimes referred to as WoA (Windows on ARM).
  • ARM32 — та же архитектура, что и описываемая выше ARM. Используется в этом документе для большей наглядности. ARM32 – same as ARM, above; used in this document for clarity.
  • ARM64 — 64-разрядная архитектура ARM (AArch64). ARM64 – refers to the 64-bit ARM architecture (AArch64). WoA64 не существует. There’s no such thing as WoA64.

Наконец, в отношении типов данных компания ARM использует следующие определения: Finally, when referring to data types, the following definitions from ARM are referenced:

  • Короткий вектор — тип данных, напрямую представляемый в архитектуре с одним потоком команд и многими потоками данных (SIMD). Вектор элементов размером 8 или 16 байтов. Short-Vector – A data type directly representable in SIMD, a vector of 8 bytes or 16 bytes worth of elements. Размер выравнивается с размером вектора (8 или 16 байтов), а каждый элемент может иметь размер 1, 2, 4 или 8 байтов. It’s aligned to its size, either 8 bytes or 16 bytes, where each element can be 1, 2, 4, or 8 bytes.
  • HFA (однородный агрегат с плавающей запятой) — тип данных, содержащий от 2 до 4 идентичных элементов с плавающей запятой типа float или double. HFA (Homogeneous Floating-point Aggregate) – A data type with 2 to 4 identical floating-point members, either floats or doubles.
  • HVA (однородный агрегат коротких векторов) — тип данных, содержащий от 2 до 4 идентичных элементов типа «короткий вектор». HVA (Homogeneous Short-Vector Aggregate) – A data type with 2 to 4 identical Short-Vector members.

Основные требования Base requirements

Версия Windows для ARM64 предназначена для работы с архитектурой ARMv8 или более поздней версии. The ARM64 version of Windows presupposes that it’s running on an ARMv8 or later architecture at all times. Оборудование должно поддерживать вычисления с плавающей запятой и технологию NEON. Both floating-point and NEON support are presumed to be present in hardware.

В спецификации ARMv8 описываются новые необязательные вспомогательные коды операций шифрования и проверки циклическим избыточным кодом (CRC) для архитектур AArch32 и AArch64. The ARMv8 specification describes new optional crypto and CRC helper opcodes for both AArch32 and AArch64. На данный момент их поддержка не обязательна, но рекомендуется. Support for them is currently optional, but recommended. Чтобы использовать преимущества этих кодов операций, приложение должно предварительно выполнить проверку их существования во время выполнения. To take advantage of these opcodes, apps should first make runtime checks for their existence.

Порядок байтов Endianness

Как и версия Windows для ARM32, Windows для ARM64 выполняется в режиме с прямым порядком байтов. As with the ARM32 version of Windows, on ARM64 Windows executes in little-endian mode. Изменить порядок байтов без поддержки режима ядра в архитектуре AArch64 сложно, поэтому его проще определить принудительно. Switching endianness is difficult to achieve without kernel mode support in AArch64, so it’s easier to enforce.

Выравнивание Alignment

При работе с архитектурой ARM64 Windows позволяет оборудованию ЦП прозрачным образом обрабатывать невыровненные операции доступа. Windows running on ARM64 enables the CPU hardware to handle misaligned accesses transparently. В отличие от AArch32, эта возможность теперь также поддерживается для целочисленных операций доступа (включая многословные) и операций доступа с плавающей запятой. In an improvement from AArch32, this support now also works for all integer accesses (including multi-word accesses) and for floating-point accesses.

Тем не менее доступ к некэшированной памяти (или устройству) по-прежнему должен быть выровнен во всех случаях. However, accesses to uncached (device) memory still must always be aligned. Если код может считывать невыровненные данные из некэшированной памяти и записывать такие данные в нее, в нем должно гарантироваться выравнивание всех операций доступа. If code could possibly read or write misaligned data from uncached memory, it must make sure to align all accesses.

Выравнивание макета по умолчанию для локальных элементов: Default layout alignment for locals:

Размер (в байтах) Size in bytes Выравнивание (в байтах) Alignment in bytes
1 1 1 1
2 2 2 2
3, 4 3, 4 4 4
>4 > 4 8 8

Выравнивание макета по умолчанию для глобальных и статических элементов: Default layout alignment for globals and statics:

Размер (в байтах) Size in bytes Выравнивание (в байтах) Alignment in bytes
1 1 1 1
2–7 2 — 7 4 4
8–63 8 — 63 8 8
>=64 >= 64 16 16

Целочисленные регистры Integer registers

Архитектура AArch64 поддерживает 32 целочисленных регистра: The AArch64 architecture supports 32 integer registers:

Регистровое Register Переменный? Volatile? Роль Role
x0 x0 Переменный Volatile Параметр, оперативный регистр 1, регистр результата Parameter/scratch register 1, result register
x1–x7 x1-x7 Переменный Volatile Параметр, оперативный регистр 2–8 Parameter/scratch register 2-8
x8–x15 x8-x15 Переменный Volatile Оперативные регистры Scratch registers
x16–x17 x16-x17 Переменный Volatile Оперативные регистры для вызова внутри процедуры Intra-procedure-call scratch registers
x18 x18 Неизменяемый Non-volatile Регистр платформы: в режиме ядра указывает на область управления процессором ядра (KPCR) для текущего процессора; в пользовательском режиме указывает на блок окружения потока (TEB) Platform register: in kernel mode, points to KPCR for the current processor; in user mode, points to TEB
x19–x28 x19-x28 Неизменяемый Non-volatile Оперативные регистры Scratch registers
x29/fp x29/fp Неизменяемый Non-volatile Указатель фрейма Frame pointer
x30/lr x30/lr Неизменяемый Non-volatile Регистры ссылок Link registers

Каждый регистр может быть доступен как полное 64-разрядное значение (посредством x0–x30) или как 32-разрядное значение (посредством w0–w30). Each register may be accessed as a full 64-bit value (via x0-x30) or as a 32-bit value (via w0-w30). Результаты 32-разрядных операций дополняются нулями до 64 разрядов. 32-bit operations zero-extend their results up to 64 bits.

Дополнительные сведения об использовании регистров параметров см. в разделе «Передача параметров». See the Parameter passing section for details on the use of the parameter registers.

В отличие от AArch32, регистры счетчика команд (PC) и указателя стека (SP) не являются индексированными. Unlike AArch32, the program counter (PC) and the stack pointer (SP) aren’t indexed registers. Кроме того, порядок доступа к ним ограничен. They’re limited in how they may be accessed. Также обратите внимание на отсутствие регистра x31. Also note that there’s no x31 register. Этот код используется в особых целях. That encoding is used for special purposes.

Указатель фрейма (X29) нужен для обеспечения совместимости с быстрой проверкой стека, которая используется службой трассировки событий Windows и другими службами. The frame pointer (x29) is required for compatibility with fast stack walking used by ETW and other services. Он должен указывать на предыдущую пару в стеке. It must point to the previous pair on the stack.

Регистры чисел с плавающей запятой и SIMD Floating-point/SIMD registers

Архитектура AArch64 также поддерживает 32 регистра чисел с плавающей запятой и SIMD (см. описание ниже): The AArch64 architecture also supports 32 floating-point/SIMD registers, summarized below:

Регистровое Register Переменный? Volatile? Роль Role
v0 v0 Переменный Volatile Параметр, оперативный регистр 1, регистр результата Parameter/scratch register 1, result register
v1–v7 v1-v7 Переменный Volatile Параметр, оперативные регистры 2–8 Parameter/scratch registers 2-8
v8–v15 v8-v15 Неизменяемый Non-volatile Оперативные регистры (неизменяемыми являются только младшие 64 разряда) Scratch registers (only the low 64 bits are non-volatile)
v16–v31 v16-v31 Переменный Volatile Оперативные регистры Scratch registers

Каждый регистр может быть доступен как полное 128-разрядное значение (посредством v0–v31 или q0–q31). Each register may be accessed as a full 128-bit value (via v0-v31 or q0-q31). Кроме того, каждый регистр может быть доступен как 64-разрядное (посредством d0–d31), 32-разрядное (посредством s0–s31), 16-разрядное (посредством h0–h31) или 8-разрядное (посредством b0–b31) значение. It may be accessed as a 64-bit value (via d0-d31), as a 32-bit value (via s0-s31), as a 16-bit value (via h0-h31), or as an 8-bit value (via b0-b31). Операции доступа размером менее 128 разрядов обращаются только к младшим разрядам полного 128-разрядного регистра. Accesses smaller than 128 bits only access the lower bits of the full 128-bit register. Остальные разряды не затрагиваются, если не указано иное. They leave the remaining bits untouched unless otherwise specified. Отличие архитектуры AArch64 от AArch32 заключается в том, что в последней регистры меньшего размера упаковывались поверх регистров большего размера. (AArch64 is different from AArch32, where the smaller registers were packed on top of the larger registers.)

К битовым полям регистра управления операциями с плавающей запятой (FPCR) предъявляются определенные требования: The floating-point control register (FPCR) has certain requirements on the various bitfields within it:

Bits Bits Значение Meaning Переменный? Volatile? Роль Role
26 26 AHP AHP Неизменяемый Non-Volatile Альтернативное управление с половинной точностью Alternative half-precision control.
25 25 DN DN Неизменяемый Non-Volatile Управление режимом по умолчанию NaN Default NaN mode control.
24 24 FZ FZ Неизменяемый Non-volatile Управление режимом обнуления Flush-to-zero mode control.
23—22 23-22 RMode RMode Неизменяемый Non-volatile Управление режимом округления Rounding mode control.
15, 12–8 15,12-8 IDE, IXE и т. п. IDE/IXE/etc Неизменяемый Non-Volatile Биты отслеживания исключения, должны всегда быть равны 0 Exception trap enable bits, must always be 0.

Системные регистры System registers

Как и для архитектуры AArch32, в спецификации AArch64 определяются три контролируемых системой регистра идентификаторов потока: Like AArch32, the AArch64 specification provides three system-controlled «thread ID» registers:

Регистровое Register Роль Role
TPIDR_EL0 TPIDR_EL0 Зарезервировано. Reserved.
TPIDRRO_EL0 TPIDRRO_EL0 Содержит номер ЦП для текущего процессора Contains CPU number for current processor.
TPIDR_EL1 TPIDR_EL1 Указывает на структуру области управления процессором ядра (KPCR) для текущего процессора Points to KPCR structure for current processor.

Исключения для плавающей запятой Floating-point exceptions

Поддержка исключений IEEE с плавающей запятой в системах AArch64 не является обязательной. Support for IEEE floating-point exceptions is optional on AArch64 systems. На вариантах процессоров, имеющих аппаратные исключения для вычислений с плавающей запятой, ядро Windows автоматически перехватывает эти исключения и неявно отключает их в регистре FPSCR. For processor variants that do have hardware floating-point exceptions, the Windows kernel silently catches the exceptions and implicitly disables them in the FPCR register. Таким образом обеспечивается нормализованное поведение на вариантах процессоров. This trap ensures normalized behavior across processor variants. В противном случае в коде, который был разработан для платформы без поддержки исключений, при работе на платформе с такой поддержкой могут возникать непредвиденные исключения. Otherwise, code developed on a platform without exception support may find itself taking unexpected exceptions when running on a platform with support.

Передача параметров Parameter passing

В отношении функций с фиксированным числом аргументов ABI Windows следует правилам, определенным компанией ARM для передачи параметров. For non-variadic functions, the Windows ABI follows the rules specified by ARM for parameter passing. Эти правила взяты напрямую из стандарта вызова процедур для архитектуры AArch64: These rules are excerpted directly from the Procedure Call Standard for the AArch64 Architecture:

Этап А — инициализация Stage A – Initialization

Этот этап выполняется строго один раз до начала обработки аргументов. This stage is done exactly once, before processing of the arguments begins.

В качестве номера следующего регистра общего назначения (NGRN) устанавливается нуль. The Next General-purpose Register Number (NGRN) is set to zero.

В качестве номера следующего регистра SIMD и чисел с плавающей запятой (NSRN) устанавливается нуль. The Next SIMD and Floating-point Register Number (NSRN) is set to zero.

В качестве адреса следующего помещенного в стек аргумента (NSAA) устанавливается текущее значение указателя стека (SP). The next stacked argument address (NSAA) is set to the current stack-pointer value (SP).

Этап Б — предварительное заполнение и расширение аргументов Stage B – Pre-padding and extension of arguments

Для каждого имеющегося аргумента применяется первое соответствующее правило из следующего списка. For each argument in the list, the first matching rule from the following list is applied. Если соответствующее правило не найдено, аргумент используется без изменений. If no rule matches, the argument is used unmodified.

Если аргумент имеет составной тип и его размер не может быть статически определен как вызывающим, так и вызываемым объектом, этот аргумент копируется в память, а сам аргумент заменяется указателем на его копию. If the argument type is a Composite Type whose size can’t be statically determined by both the caller and the callee, the argument is copied to memory and the argument is replaced by a pointer to the copy. В C/C++ таких типов нет, однако они используются в других языках и расширениях для них. (There are no such types in C/C++ but they exist in other languages or in language extensions).

Если аргумент имеет тип HFA или HVA, он используется без изменений. If the argument type is an HFA or an HVA, then the argument is used unmodified.

Если аргумент имеет составной тип и его размер превышает 16 байтов, этот аргумент копируется в выделяемую вызывающим объектом память, а сам аргумент заменяется указателем на его копию. If the argument type is a Composite Type larger than 16 bytes, then the argument is copied to memory allocated by the caller, and the argument is replaced by a pointer to the copy.

Если аргумент имеет составной тип, его размер округляется до ближайшего значения, кратного 8 байтам. If the argument type is a Composite Type, then the size of the argument is rounded up to the nearest multiple of 8 bytes.

Этап В — назначение аргументов регистрам и стеку Stage C – Assignment of arguments to registers and stack

Для каждого имеющегося аргумента по очереди применяются следующие правила, пока аргумент не будет назначен. For each argument in the list, the following rules are applied in turn until the argument has been allocated. При назначении аргумента регистру все неиспользуемые разряды в регистре имеют неопределенное значение. When an argument is assigned to a register, any unused bits in the register have unspecified value. При назначении аргумента сегменту стека все неиспользуемые байты заполнения имеют неопределенное значение. If an argument is assigned to a stack slot, any unused padding bytes have unspecified value.

Если аргумент имеет тип с плавающей запятой половинной, одиночной, двойной или четырехкратной точности либо является коротким вектором, и при этом значение NSRN менее 8, аргумент назначается младшим значащим разрядам регистра v[NSRN]. If the argument is a Half-, Single-, Double- or Quad-precision Floating-point or Short Vector Type, and the NSRN is less than 8, then the argument is allocated to the least significant bits of register v[NSRN]. Номер NSRN увеличивается на единицу. The NSRN is incremented by one. С этого момента аргумент назначен. The argument has now been allocated.

Если аргумент имеет тип HFA или HVA и имеется достаточно неназначенных регистров SIMD и чисел с плавающей запятой (NSRN + число элементов ≤8), аргумент назначается регистрам SIMD и чисел с плавающей запятой (по одному регистру для каждого элемента HFA или HVA). If the argument is an HFA or an HVA, and there are sufficient unallocated SIMD and Floating-point registers (NSRN + number of members ≤ 8), then the argument is allocated to SIMD and Floating-point Registers, one register per member of the HFA or HVA. Номер NSRN увеличивается на число использованных регистров. The NSRN is incremented by the number of registers used. С этого момента аргумент назначен. The argument has now been allocated.

Если аргумент имеет тип HFA или HVA, номер NSRN задается равным 8, а размер аргумента округляется до ближайшего значения, кратного 8 байтам. If the argument is an HFA or an HVA, then the NSRN is set to 8, and the size of the argument is rounded up to the nearest multiple of 8 bytes.

Если аргумент имеет тип HFA или HVA, тип с плавающей запятой четырехкратной точности, либо является коротким вектором, адрес NSAA округляется до 8 или до естественной границы выравнивания для типа аргумента (в зависимости от того, какая величина больше). If the argument is an HFA, an HVA, a Quad-precision Floating-point or Short Vector Type, then the NSAA is rounded up to the larger of 8 or the Natural Alignment of the argument’s type.

Если аргумент имеет тип с плавающей запятой половинной или одиночной точности, его размер устанавливается равным 8 байтам. If the argument is a Half- or Single-precision Floating Point type, then the size of the argument is set to 8 bytes. Это дает такой же результат, что и копирование аргумента в младшие значащие разряды 64-разрядного регистра с заполнением оставшихся разрядов неуказанными значениями. The effect is as if the argument had been copied to the least significant bits of a 64-bit register, and the remaining bits filled with unspecified values.

Если аргумент имеет тип HFA или HVA, тип с плавающей запятой половинной, одиночной, двойной или четырехкратной точности либо является коротким вектором, аргумент копируется в память и согласуется с адресом NSAA. If the argument is an HFA, an HVA, a Half-, Single-, Double-, or Quad-precision Floating-point or Short Vector Type, then the argument is copied to memory at the adjusted NSAA. Адрес NSAA увеличивается на размер аргумента. The NSAA is incremented by the size of the argument. С этого момента аргумент назначен. The argument has now been allocated.

Если аргумент является целым числом или указателем и имеет размер меньше 8 байтов, а номер NGRN меньше 8, аргумент копируется в младшие значащие разряды регистра x[NGRN]. If the argument is an Integral or Pointer Type, the size of the argument is less than or equal to 8 bytes, and the NGRN is less than 8, the argument is copied to the least significant bits in x[NGRN]. Номер NGRN увеличивается на единицу. The NGRN is incremented by one. С этого момента аргумент назначен. The argument has now been allocated.

Если аргумент имеет выравнивание 16, номер NGRN округляется до следующего четного числа. If the argument has an alignment of 16, then the NGRN is rounded up to the next even number.

Если аргумент имеет целочисленный тип и размер 16, а номер NGRN меньше 7, аргумент копируется в регистры x[NGRN] и x[NGRN+1]. If the argument is an Integral Type, the size of the argument is equal to 16, and the NGRN is less than 7, the argument is copied to x[NGRN] and x[NGRN+1]. Регистр x[NGRN] должен содержать в младших разрядах удвоенное слово, которое является представлением аргумента в памяти. x[NGRN] shall contain the lower addressed double-word of the memory representation of the argument. Номер NGRN увеличивается на два. The NGRN is incremented by two. С этого момента аргумент назначен. The argument has now been allocated.

Если аргумент имеет составной тип и его размер в удвоенных словах не превышает 8 минус NGRN, аргумент копируется в последовательные регистры общего назначения, начиная с регистра x[NGRN]. If the argument is a Composite Type, and the size in double-words of the argument is no more than 8 minus NGRN, then the argument is copied into consecutive general-purpose registers, starting at x[NGRN]. Аргумент передается так, как если бы он был загружен в регистры с адреса с выравниванием с удвоенным словом с использованием соответствующих инструкций LDR, которые загружают последовательные регистры из памяти. The argument is passed as though it had been loaded into the registers from a double-word-aligned address, with an appropriate sequence of LDR instructions that load consecutive registers from memory. Содержимое неиспользуемых частей регистров в этом стандарте не определяется. The contents of any unused parts of the registers are unspecified by this standard. Номер NGRN увеличивается на число использованных регистров. The NGRN is incremented by the number of registers used. С этого момента аргумент назначен. The argument has now been allocated.

Номер NGRN задается равным 8. The NGRN is set to 8.

Адрес NSAA округляется до 8 или до естественной границы выравнивания для типа аргумента (в зависимости от того, какая величина больше). The NSAA is rounded up to the larger of 8 or the Natural Alignment of the argument’s type.

Если аргумент имеет составной тип, он копируется в память по выровненному адресу NSAA. If the argument is a composite type, then the argument is copied to memory at the adjusted NSAA. Адрес NSAA увеличивается на размер аргумента. The NSAA is incremented by the size of the argument. С этого момента аргумент назначен. The argument has now been allocated.

Если размер аргумента меньше 8 байтов, его размер устанавливается равным 8 байтам. If the size of the argument is less than 8 bytes, then the size of the argument is set to 8 bytes. Это дает такой же результат, что и копирование аргумента в младшие значащие разряды 64-разрядного регистра с заполнением оставшихся разрядов неуказанными значениями. The effect is as if the argument was copied to the least significant bits of a 64-bit register, and the remaining bits were filled with unspecified values.

Аргумент копируется в память по выровненному адресу NSAA. The argument is copied to memory at the adjusted NSAA. Адрес NSAA увеличивается на размер аргумента. The NSAA is incremented by the size of the argument. С этого момента аргумент назначен. The argument has now been allocated.

Дополнение: функции с переменным числом аргументов Addendum: Variadic functions

Функции, принимающие переменное число аргументов, обрабатываются не так, как описывается выше: Functions that take a variable number of arguments are handled differently than above, as follows:

Все составные элементы обрабатываются одинаково (различий между HFA или HVA не делается). All composites are treated alike; no special treatment of HFAs or HVAs.

Регистры SIMD и чисел с плавающей запятой не используются. SIMD and Floating-point Registers aren’t used.

Фактически соблюдаются правила C.12–C.15 для назначения аргументов мнимому стеку, при котором первые 64 байта стека загружаются в регистры x0–x7, а оставшиеся аргументы стека размещаются обычным образом. Effectively, it’s the same as following rules C.12–C.15 to allocate arguments to an imaginary stack, where the first 64 bytes of the stack are loaded into x0-x7, and any remaining stack arguments are placed normally.

Возвращаемые значения Return values

Целочисленные значения возвращаются в регистр x0. Integral values are returned in x0.

Значения с плавающей запятой возвращаются соответственно в регистры s0, d0 или v0. Floating-point values are returned in s0, d0, or v0, as appropriate.

Тип считается HFA или HVA, если выполняются все следующие условия: A type is considered to be an HFA or HVA if all of the following hold:

  • он не пуст; It’s non-empty,
  • у него нет нетривиальных конструкторов по умолчанию, конструкторов копий, деструкторов и операторов присваивания; It doesn’t have any non-trivial default or copy constructors, destructors, or assignment operators,
  • все его члены имеют одинаковый тип HFA или HVA, либо типы float, double или neon, соответствующие типам HFA или HVA других членов. All of its members have the same HFA or HVA type, or are float, double, or neon types that match the other members’ HFA or HVA types.

Значения HFA и HVA с четырьмя и менее элементами возвращаются соответственно в регистры s0–s3, d0–d3 или v0–v3. HFA and HVA values with four or fewer elements are returned in s0-s3, d0-d3, or v0-v3, as appropriate.

Типы, возвращаемые по значению, обрабатываются по-разному в зависимости от того, есть ли у них определенных свойства и является ли функция нестатической функцией-членом. Types returned by value are handled differently depending on whether they have certain properties, and whether the function is a non-static member function. Рассмотрим тип со следующими свойствами: Types which have all of these properties,

  • Является агрегатом в соответствии с определением стандарта C++14, то есть массивом или классом без предоставленного пользователем конструктора, без закрытых или защищенных нестатических элементов данных, без базовых классов и виртуальных функций. they’re aggregate by the C++14 standard definition, that is, they have no user-provided constructors, no private or protected non-static data members, no base classes, and no virtual functions, and
  • Имеет тривиальный оператор присваивания копированием. they have a trivial copy-assignment operator, and
  • Имеет тривиальный деструктор. they have a trivial destructor,

Возвращаются с помощью функций, не являющихся членами, или статических функций-членов. В этом случае используйте следующий стиль возврата: and are returned by non-member functions or static member functions, use the following return style:

  • Типы, размер которых не превышает 8 байтов, возвращаются в регистр x0. Types less than or equal to 8 bytes are returned in x0.
  • Типы, размер которых не превышает 16 байтов, возвращаются в регистры x0 и x1, причем регистр x0 содержит младшие 8 байтов. Types less than or equal to 16 bytes are returned in x0 and x1, with x0 containing the lower-order 8 bytes.
  • Для типов, размер которых превышает 16 байтов, вызывающий объект должен резервировать блок памяти с достаточным размером и соответствующим выравниванием для хранения результата. For types greater than 16 bytes, the caller shall reserve a block of memory of sufficient size and alignment to hold the result. Адрес блока памяти должен передаваться в качестве дополнительного аргумента функции в регистр x8. The address of the memory block shall be passed as an additional argument to the function in x8. Вызываемый объект может изменить блок памяти результата в любой момент выполнения подпрограммы. The callee may modify the result memory block at any point during the execution of the subroutine. Вызываемый объект не обязан сохранять значение, находящееся в регистре x8. The callee isn’t required to preserve the value stored in x8.

Для всех остальных типов используется следующее соглашение: All other types use this convention:

  • Вызывающий объект должен резервировать блок памяти с достаточным размером и соответствующим выравниванием для хранения результата. The caller shall reserve a block of memory of sufficient size and alignment to hold the result. Адрес блока памяти должен передаваться в качестве дополнительного аргумента функции в регистр x0 или в x1, если в регистр x0 передано $this. The address of the memory block shall be passed as an additional argument to the function in x0, or x1 if $this is passed in x0. Вызываемый объект может изменить блок памяти результата в любой момент выполнения подпрограммы. The callee may modify the result memory block at any point during the execution of the subroutine. Вызываемый объект возвращает адрес блока памяти в регистр x0. The callee returns the address of the memory block in x0.

Стек Stack

После внедрения ABI компанией ARM стек должен всегда сохранять 16-байтовое выравнивание. Following the ABI put forth by ARM, the stack must remain 16-byte aligned at all times. В архитектуре AArch64 предусмотрена аппаратная функция, которая возвращает ошибки выравнивания стека во всех случаях, когда выполняются операции загрузки или сохранения относительно указателя стека, который не имеет 16-байтового выравнивания. AArch64 contains a hardware feature that generates stack alignment faults whenever the SP isn’t 16-byte aligned and an SP-relative load or store is done. В Windows эта функция активна на постоянной основе. Windows runs with this feature enabled at all times.

Функции, выделяющие 4 КБ или больше в стеке, должны проверять, что каждая страница перед последней обрабатывается по порядку. Functions that allocate 4k or more worth of stack must ensure that each page prior to the final page is touched in order. Эта действие гарантирует, что никакой код не обойдет страницы защиты, используемые Windows для расширения стека. This action ensures no code can «leap over» the guard pages that Windows uses to expand the stack. Как правило, обработка выполняется с помощью вспомогательной функции __chkstk , которая использует особое соглашение о вызовах и передает все выделение стека, поделенное на 16, в x15. Typically the touching is done by the __chkstk helper, which has a custom calling convention that passes the total stack allocation divided by 16 in x15.

Красная зона Red zone

16-байтовая область сразу после текущего указателя стека зарезервирована для сценариев анализа и динамического исправления. The 16-byte area immediately below the current stack pointer is reserved for use by analysis and dynamic patching scenarios. В эту область можно вставить тщательно выверенный код, который хранит два регистра в [sp, #-16] и временно использует их для произвольных целей. This area permits carefully generated code to be inserted which stores two registers at [sp, #-16] and temporarily uses them for arbitrary purposes. Ядро Windows гарантирует, что эти 16 байтов не будут перезаписаны при возникновении исключения или прерывания как в пользовательском режиме, так и в режиме ядра. The Windows kernel guarantees that those 16 bytes aren’t overwritten if an exception or interrupt is taken, in both user and kernel mode.

Стек ядра Kernel stack

Стек режима ядра по умолчанию в Windows состоит из шести страниц (24 КБ). The default kernel mode stack in Windows is six pages (24k). Обратите особое внимание на функции, которые имеют большие буферы стека в режиме ядра. Pay extra attention to functions with large stack buffers in kernel mode. Несвоевременное прерывание может возникнуть в тот момент, когда запас стека недостаточен, что вызовет критическую ошибку в виде сбоя стека. An ill-timed interrupt could come in with little headroom and create a stack panic bug check.

Проверка стека Stack walking

Код в Windows компилируется с включенными указателями фреймов (/Oy-) для обеспечения быстрой проверки стека. Code within Windows is compiled with frame pointers enabled (/Oy-) to enable fast stack walking. Обычно регистр x29 (fp) указывает на следующее звено в цепочке, которое представляет собой пару , задающую указатель на предыдущий фрейм в стеке и адрес возврата. Generally, x29 (fp) points to the next link in the chain, which is an pair, indicating the pointer to the previous frame on the stack and the return address. В стороннем коде для оптимизации профилирования и трассировки также рекомендуется включать указатели фрейма. Third-party code is encouraged to enable frame pointers as well, to allow for improved profiling and tracing.

Очистка исключения Exception unwinding

Очистка стека во время обработки исключений реализуется с использованием кодов очистки. Unwinding during exception handling is assisted through the use of unwind codes. Коды очистки представляют собой последовательность байтов, хранимых в разделе XDATA исполняемого файла. The unwind codes are a sequence of bytes stored in the .xdata section of the executable. Они абстрактным образом описывают работу пролога и эпилога функции, чтобы можно было нейтрализовать воздействие пролога функции во время подготовки к резервному копированию кадра стека вызывающего объекта. They describe the operation of the prologue and epilogue in an abstract manner, such that the effects of a function’s prologue can be undone in preparation for backing up to the caller’s stack frame. Дополнительные сведения о кодах очистки см. в разделе Обработка исключений в ARM64. For more information on the unwind codes, see ARM64 exception handling.

EABI ARM также задает модель очистки исключения, использующую коды очистки. The ARM EABI also specifies an exception unwinding model that uses unwind codes. Однако такой спецификации недостаточно для очистки в Windows, так как требуется обрабатывать случаи, когда процессор находится в середине пролога или эпилога. However, the specification as presented is insufficient for unwinding in Windows, which must handle cases where the PC is in the middle of a function prologue or epilogue.

Для описания динамически созданного кода следует использовать таблицы динамических функций, заданные в вызовах RtlAddFunctionTable и связанных функциях, чтобы созданный код мог принять участие в обработке исключений. Code that is dynamically generated should be described with dynamic function tables via RtlAddFunctionTable and associated functions, so that the generated code can participate in exception handling.

Счетчик циклов Cycle counter

Все ЦП с архитектурой ARMv8 должны поддерживать регистр счетчика циклов (64-разрядный регистр, который в Windows доступен для чтения на любом уровне исключения, в том числе и в пользовательском режиме). All ARMv8 CPUs are required to support a cycle counter register, a 64-bit register that Windows configures to be readable at any exception level, including user mode. Доступ к нему может осуществляться посредством специального регистра PMCCNTR_EL0 с использованием кода операции MSR в коде ассемблера или встроенной функции _ReadStatusReg в коде C/C++. It can be accessed via the special PMCCNTR_EL0 register, using the MSR opcode in assembly code, or the _ReadStatusReg intrinsic in C/C++ code.

Счетчик циклов подсчитывает реальное количество циклов, а не время по часам. The cycle counter here is a true cycle counter, not a wall clock. Частота подсчета зависит от тактовой частоты процессора. The counting frequency will vary with the processor frequency. Если вам необходимо знать частоту счетчика циклов, значит, сам этот счетчик вам не нужен. If you feel you must know the frequency of the cycle counter, you shouldn’t be using the cycle counter. В таком случае вам требуется измерять время по часам, для чего используется QueryPerformanceCounter . Instead, you want to measure wall clock time, for which you should use QueryPerformanceCounter .

Читайте также:  Какое у меня оборудование линукс
Оцените статью