Перейти до основного вмісту

Володіння апаратними тестами

Граничний час тесту визначає момент відмови, а не дозвіл знищити власника DMA. Для захищеної апаратної кваліфікації використовується tools/hardware_test_supervisor.py на DevKit. Постійний супервізор володіє фактичним процесом прискорювача. Клієнти CTest, SSH та Python володіють лише з’єднаннями для звітування.

Виберіть захищену кваліфікацію​

Стандартний CI виконує CTest і підпроцеси перевірки продуктивності безпосередньо; супервізор або сокет не потрібні. Облік обов’язкового покриття й надалі відхиляє відсутні, вимкнені, пропущені та невдалі вибрані тести. Наведена нижче процедура — це явно вибраний режим кваліфікації, а не передумова стандартного CI.

Зберіть Core з NEAT_GUARDED_HARDWARE_TESTS=ON або налаштуйте CMake з SIMANEAT_GUARDED_HARDWARE_TESTS=ON. Нативні цілі CTest стають проксі звітування; аргументи тестів, середовище, мітки, блокування ресурсів і наявні властивості TIMEOUT не змінюються. Установлені додаткові компоненти містять той самий клієнт супервізора. Задайте SIMA_HARDWARE_SUPERVISOR_SOCKET, щоб явно ввімкнути для матриці продуктивності такий самий захищений режим кваліфікації. Порожній або недоступний сокет чи відхилений запит спричиняють невдалий запуск; переходу до безпосереднього виконання ніколи не відбувається. Для звичайного запуску підпроцесів перевірки продуктивності на DevKit залиште цю змінну невстановленою.

Привілейований власник кваліфікації надає нову приватну одноразову теку стану та конфігурацію. Супервізор відхиляє старі теки допуску або аварійного блокування. Конфігурація фіксує:

  • identity: admission_id, boot_id, cohort_sha256, lease_pid, lease_start_ticks, observer_id.
  • state_dir, socket усередині цієї теки та supervisor_sha256.
  • checker: точну команду command перевіряльника, що належить root і доступний лише для читання, sha256 виконуваного файла та timeout_sec перевірки без ресурсів.
  • executables: абсолютні шляхи до звичайних файлів та ідентичності SHA256, точні arguments, deadline_sec і захищені значення required_env. Кілька дозволених варіантів команди й граничного часу задають у variants.

Використовуйте deadline_sec: null, лише якщо початковий тест не має тайм-ауту. Проксі CTest запитує точний затверджений граничний час; матриця запитує свій незмінний 180-секундний термін. Відхиляйте ін’єкцію завантажувача та фіксуйте канонічні шляхи середовища виконання й зовнішніх модулів та параметри числового еталона в required_env.

Перевіряльник отримує --phase launch|active|retired --owner-json PATH. Він має повернути свіжий JSON із schema: 1, status: "ready", точною зафіксованою identity та checked_at_epoch. Він ніколи не повинен запускати роботу прискорювача або змінювати обладнання.

Запис власника пов’язує PID, такти початку, ідентифікатор завантаження, ідентифікатор сеансу, ідентифікатор запуску та повний SHA256 запиту. Перш ніж дозволити exec, супервізор надійно зберігає володіння та повторно перевіряє допуск і наявність клієнта, поки дочірній процес без ресурсів очікує на бар’єрі запуску. Активний цикл записує учасників сеансу, перевіряє ідентичність, чинний допуск і збережені журнали на наявність незавершеного або ізольованого стану.

Після фактичного виходу з невід’ємним кодом exit.json пов’язує власника, код повернення, граничний час, хеш запиту та спостережений час завершення. Перевіряльник retired має додати:

  • retirement.proven: true;
  • kind: "authoritative-driver-retirement" або "reviewed-graceful-exit";
  • непорожній token доказу;
  • scope: "whole-owner-process-tree-and-dma";
  • owner: точний запис власника.

Реалізація перевіряльника має обґрунтовувати цей доказ перевіреним контрактом завершення виконання й транспорту, фактичними перевірками володіння та нащадків, свіжими спостерігачами збоїв і поточною ідентичністю драйвера, прошивки та набору компонентів. Самі по собі вибірково спостережені нульові завдання, вихід процесу, минулий час або справне SSH-з’єднання не є доказом. Суто процесорні тестові засоби можуть використовувати окремо перевірений контракт безпечного виходу; не вигадуйте для них доказів від драйвера.

Тайм-аут і відновлення​

Супервізор ніколи не надсилає TERM/KILL через тайм-аут, розрив з’єднання, скасування, невідоме завершення чи відмову спостерігача. Він встановлює незворотне аварійне блокування, зберігає власника й надійні журнали та відхиляє наступні запуски. Матриця зберігає ENV_BROKEN / ENV_TIMEOUT і позначає решту сценаріїв як не виконані; вона ніколи не вигадує успішних результатів або прийнятих пропусків. Пізній вивід не скасовує тайм-аут. Числова помилка після природного виходу та повного підтвердження завершення залишається невдалим тестом і не змішується з невідомим володінням.

Умова завершення за вихідним файлом не є підтвердженням звільнення ресурсів. Необов’язковий запит зупинки застосунку потребує точного затвердженого варіанта умови завершення й аргументів та зафіксованого підтвердження перевірки обробника й дренування. Дозволено лише цей явно перевірений запит SIGTERM; він ніколи не є дією очищення й ніколи не посилюється до SIGKILL. Перед прийняттям результату все одно потрібні фактичний вихід і достовірне підтвердження завершення.

Не зупиняйте remoteproc, не вивантажуйте й не від’єднуйте драйвери, не видаляйте позичені буфери та не знищуйте процес із невизначеним володінням. Використовуйте наявну захищену процедуру відновлення пристрою. Після відновлення встановіть новий допуск; старий ніколи не відкривається знову. Після кожного тимчасового випробування прошивки відновіть і перевірте початкову прошивку, службу та політику відновлення.

Клієнти й докази​

Клієнти Python використовують run_owned(command, cwd, env, deadline_sec, evidence_dir, socket_path, completion=None, graceful_stop=None). CLI підтримує run-json --request FILE --result FILE --socket PATH. Результати вказують completed, timeout, fail_stop або refused, ідентичність власника, фактичний код повернення, доказ завершення та шляхи до збережених stdout/stderr. Загибель клієнта не може знищити фактичний апаратний дочірній процес; демон має працювати на цільовому пристрої незалежно, а не як передній процес SSH, який підлягає очищенню сеансу.

Виконайте нешкідливі нативні тести хоста перед апаратним допуском. У звітах кваліфікації слід відрізняти незмінені навантаження, еталони й граничні строки під цим перевіреним засобом захисту від виконання незміненого старого засобу або фактичного розміщеного робочого процесу CI.

Для Python 3.13 і новіших метадані PyNeat вибирають NumPy >=2.1,<3; для старіших Python — >=1.24,<2. Узгодження метаданих не доводить числову еквівалентність ndarray. Перед кваліфікацією цього набору Python/NumPy виконайте тести dtype, кроків, копіювання/нульового копіювання та часу життя на встановленому цільовому середовищі.