Руководство по разработке безопасности Linux
Руководство по разработке безопасности Linux

Каталог статей

Руководство по разработке безопасности Linux

1 Предисловие

1.1 Введение в документ

В этой статье в основном представлены состав и функции решения безопасности Allwinner. Безопасное и комплексное решение основано на обычном расширении решения, охватывающем аппаратную безопасность, безопасную загрузку (Secure Boot), безопасную систему (Secure OS), безопасные приложения (Надежные приложения) и т. д. В этой статье рассказывается об аппаратной безопасности, безопасной загрузке (Secure Boot), системе безопасности (Secure OS), разработке приложений безопасности (руководства по разработке TA/CA), хранении ключей прошивки и зашифрованном хранении систем безопасности на флэш-памяти.

1.2 Целевые читатели

Соответствующий технический персонал программной платформы Allwinner.

1.3 Область применения

Программная платформа Allwinner.

Allwinner использует аппаратные платформы с версией ядра 4.9 или выше.

2 Основы систем безопасности

2.1 Введение в систему безопасности

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

2.2 Введение в основы криптографии

2.2.1 Модель шифрования данных

а. Простой текст П. Подготовьте зашифрованный текст, называемый открытым текстом.

б. Шифрованный текст Y. Зашифрованный текст называется зашифрованным текстом.

в) Алгоритм шифрования и дешифрования E(D). Используется для достижения отношения преобразования открытого текста в зашифрованный текст или из зашифрованного текста в открытый текст.

д. Кей К. Ключи являются критическими параметрами в алгоритмах шифрования и дешифрования.

​ Рисунок 2-1: Процесс зашифрованного взаимодействия

2.2.2 Алгоритм шифрования

а. Симметричный алгоритм шифрования: для шифрования и дешифрования используется один и тот же ключ. Например, алгоритм AES.

б. Алгоритм асимметричного шифрования: при шифровании и дешифровании используются разные ключи. Один ключ является «открытым», то есть открытым, а другой ключ является секретным. Один используется для шифрования, а другой — для дешифрования. Например, алгоритм RSA.

c. Алгоритм хеширования: алгоритм дайджеста, который вычисляет фрагмент данных любой длины для получения выходных данных фиксированной длины, но исходные рассчитанные данные не могут быть получены с помощью этих выходных данных.

Рисунок 2-2: Симметричное и асимметричное шифрование

Рисунок 2-3: Сводный расчет

2.2.3 Подпись и сертификат

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

Рисунок 2-4: Цифровая подпись

Рисунок 2-5: Проверка подписи

Цифровой сертификат: это файл, содержащий информацию о владельце открытого ключа и открытый ключ, подписанный цифровой подписью центра сертификации. Это авторитетный электронный документ.

Рисунок 2-6: Структура сертификата

2.2.4 efuse

efuse: технология одноразового программируемого предохранителя. Некоторые SoC интегрируют электрически программируемый предохранитель efuse в качестве памяти OTP (одноразово программируемая, одноразовая программируемая). Внутренние данные efuse могут изменяться только с 0 на 1, а не с 1 на 0, и могут быть записаны только один раз.

2.3 TrustZone

TrustZone — это решение безопасности, предложенное ARM, целью которого является предоставление независимой безопасной операционной системы и технологии виртуализации оборудования, а также предоставление доверенной среды выполнения (Trust Execution Environment). Модель системы TrustZone представлена ​​на рисунке ниже.

Рисунок 2-7: Модель системы TurstZone

2.3.1 OPTEE

Многие компании запустили свои собственные безопасные операционные системы на основе TrustZone, каждая со своими методами реализации, но в основном следуют стандарту GP (GlobalPlatform). GlobalPlatform — это межотраслевая международная организация по стандартизации, занимающаяся разработкой, формулированием и публикацией технических стандартов для микросхем безопасности для содействия управлению многопрофильными промышленными средами и их безопасному и совместимому бизнес-развертыванию. OPTEE — это решение TEE, основанное на технологии ARM TrustZone, разработанное Linaro и несколькими другими компаниями и соответствующее стандарту GP.

2.4 Связанные термины

SMC:Secure Monitor Call,ARM дано указание, могу позволить CPU от Linux (небезопасно) переходите непосредственно к Мониторинг выполнения (безопасного) режима.

RPC:Remote Procedure Control Protocol。OPTEE середина, для работы Linux Механизм освобождения ресурсов. Например, ОПТИЭ Невозможно читать или записывать файлы в Просто пройди RPC вызов Linux для завершения файловой системы.

REE:Rich Execution Среда. Как следует из названия, Это богатая ресурсами среда выполнения, Такие как общие Linux,Android система и т. д.

TEE:Trusted Execution Environment。Доверенная среда выполнения, То есть безопасная среда выполнения, В пределах этой области, весь код, Ресурсы заслуживают доверия пользователей.

TA:Trusted Apps, существовать TEE заявки, выполняемые под Выполняйте задачи, которые пользователи должны защитить, Например, защита паролем.

CA:Client Apps, существовать REE заявки, выполняемые под полный обычный, Задачи, не требующие защиты, Например, посмотреть обычные видеоролики.

UUID:Universally Unique Identifier, Универсальный уникальный идентификатор. с текущей даты и времени, последовательность часов, Идентификационный номер машины (например. МАК).

3 Аппаратный модуль безопасности

Технология TrustZone требует использования отдельных периферийных ресурсов для обеспечения безопасности и небезопасности. На платформе allwinner изоляция безопасных и незащищенных ресурсов контролируется с помощью назначенных периферийных устройств, а именно следующих трех:

spc(Secure Peripherals Control)

Укажите атрибуты безопасности периферийного устройства, После того как периферийное устройство настроено как безопасное, Должен Только периферийные устройствасуществовать Безопасностьмировой талантнормальныйдоступ, Писать в небезопасном мире недопустимо, читать как 0。

sid(Secure ID)

Контролируйте доступ к efuse. Доступ к efuse возможен только через модуль sid. Сам sid не является безопасным, и к нему могут получить доступ как защищенные, так и незащищенные пользователи. Однако при доступе к efuse через sid доступ к безопасному efuse возможен только в безопасном мире, а результат области доступа в незащищенном мире фиксируется равным 0.

smc(Secure Memory Control)

Управляет доступом к адресному пространству памяти. После того, как память в определенном адресном пространстве станет безопасной, Доступ к памяти в этом пространстве возможен только из безопасного мира. Писать в небезопасном мире недопустимо, читать как 0。

4 secure boot

4.1 Основные принципы

secure boot Процесс запуска середина,чипсуществоватьзапускатьчас, Сначала система будет проверена на безопасность. Загружайте систему только после прохождения теста. Если проверка не удалась, система считается модифицированной. Отказывается загружать систему и переходит в режим записи.

Проверка безопасности в основном выполняется по двум проектам:

4.1.1 Проверка хеша на основе сертификата

Прошивка будет содержать сертификат, В сертификате записан хеш прошивки. После того, как сертификат проверки чипа действителен, Будет использоваться хэш прошивки, записанный с помощью сертификата. По сравнению с фактическим рассчитанным значением хеш-функции прошивки, Если они совпадают, считается, что прошивка проверена. OK。твердыйкуски Зависит от多个ребеноктвердыйкуски Группастановиться,brom->sboot->atf(64 битовая платформа, 32 битовая платформа пропускается)->OPTEE->uboot->boot.img из Процесс запуска середина, Каждая субпрошивка имеет соответствующий сертификат, используемый для проверки хэша субмикропрограммы. Обеспечьте безопасный запуск всего решения.

Конкретный процесс проверки каждой субпрошивки в прошивке следующий:

  1. использовать efuse в rotpk Запись сертификата проверки хеша из rotpk из эффективности.
  2. использовать rotpk Сертификат поверки из эффективности.
  3. использовать Сертификатсередина Записыватьиз公钥验证ребеноктвердыйкускиверноотвечать Сертификатиз эффективности.
  4. использоватьребеноктвердыйкускиверноотвечать Сертификат Записыватьиз哈希值验证ребеноктвердыйкускииз эффективности.

Рисунок 4-1: Процесс проверки прошивки

4.1.2 Проверка номера версии для защиты от отката

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

Чип будет обновлять внутренний номер версии по мере необходимости. Обязательно сохраните все пропуска проекта. Безопасностьтвердыйкускисередина, Максимальное значение номера версии.

Ниже описано, как настроить два элемента проверки, создать безопасную прошивку и включить безопасную загрузку.

4.2 Настройка ключа

Сертификатизрожденныйстановитьсяи Упаковка интегрирована в Безопасностьтвердыйкускииз Процесс упаковкисередина, Никакой дополнительной настройки не требуется, Вам нужно только настроить пару ключей, используемую при подписании сертификата. Существует два метода настройки, Первый — использовать предоставленный инструмент генерации пары ключей для создания ключа, второй — использовать ранее сгенерированный ключ; Конкретные инструкции для двух методов следующие:

а. Сгенерировать ключ

Запустите инструмент build/createkeys и выберите соответствующую платформу, чтобы автоматически сгенерировать пару ключей.

Сгенерированные ключи расположены в каталоге out/$(platform)/common/keys.

в rotpk.bin для Сжечь,чтобычипсередина, Открытый ключ,используемый для проверки корневого сертификата. Ротпк.bin нуждатьсясуществоватьгореть Записано Безопасностьтвердыйкускииз Навыки использования оборудования Сжечь,чтобычипсередина, Способ использования описан ниже, Посмотреть подробности rotpk Сожгите и напишите. Остальные — это закрытые ключи, используемые для подписи пакета прошивки при упаковке прошивки. Прошивка состоит из нескольких частей, Каждая часть использует отдельную пару ключей для аутентификации подписи.

! предупреждать

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

б. Используйте существующий ключ.

Если ключ был сгенерирован ранее, просто поместите файл ключа в каталог longan/out/$(platform)/common/keys.

! предупреждать

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

4.3 Настройка номера версии для защиты от отката

чипсуществовать引导твердыйкускиизкогда, Номер версии прошивки сравнивается с номером версии, хранящимся в памяти чипа.

Версия с защитой от откатакнига Числосуществовать Настройте в longan/devices/configs/chips/${chip}/configs/default/version_base.mk, В файле можно настроить два основных свойства:

Язык кода:javascript
копировать
# define the verions of the image
# format: main
# such as 1, 2
# NOTICE: the range of main version is from 0 to 31,
# ROOT_ROLLBACK_USE ---0:not used,1:used
# when you change the version, you must increase main version, and never reduce the
versions.
# the default version is 0
ROOT_ROLLBACK_USED = 1
MAIN_VERSION = 1

ROOT_ROLLBACK_USED

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

MAIN_VERSION

Номер версии прошивки для защиты от отката. Доступный диапазон: 0–31. Если настроены другие значения, чип сразу посчитает проверку номера версии прошивки неудавшейся.

4.4 Создание безопасной прошивки

существовать longan Запустите ./build.sh в каталоге. pack_secure Безопасная прошивка может быть упакована.

рожденныйстановитьсяизтвердыйкускисуществовать longan/out/ в каталоге, использовать phoneSuit Инструмент для выжигания.

4.5 Программирование РОТПК

Ротпк прожигается с помощью ПК-инструмента DragonSN. Инструмент DragonSN связывается с устройством через USB и управляет устройством для записи указанной информации rotpk. Если она не настроена явно, она будет обработана как burn_key=0. Конкретные этапы сжигания следующие:

  1. Конфигурация burn_key свойство

После установки значения атрибута burn_key равным 1, устройство будет получать информацию, передаваемую DragonSN через USB, и выполнять соответствующую работу по записи. Существует три способа изменить это свойство.

Метод 1: Этот метод используется для uboot Совместное использование дерева устройств с ядром, v853 направление направления не поддерживается,существоватьдокументdevices /config/chips/

{chips}/configs/

{board}/sys_config.fexсередина,[target] элемент, Как показано ниже. Если не настроено явно набор, в соответствии с burn_key=0 иметь дело с.

Рисунок 4-2: Настройка метода записи ключевых атрибутов 1

Метод 2: Этот метод используется для uboot В случае независимого дерева устройств существует документlongan/device/config/chips/v853/. в конфигах/perf1/uboot-board.dts &target элемент, Как показано ниже.

Рисунок 4-3: Способ 2 настройки записи ключевых атрибутов

направление Формула 3:этотнаправление Режимизвысший приоритет,существоватьдокументlongan/device/config/chips/v853/configs/default/env.cfg в burn_key элемент, Как показано ниже.

Рисунок 4-4: Настройка третьего метода записи атрибутов ключа

  1. Пакет Безопасностьтвердыйкускиигоретьзаписывать, использованиеизключ должен быть записан при упаковке rotpk соответствовать,конкретная причина Посмотреть подробности rotpk Процесс обработки на маленьком компьютере во время записи.
  2. существовать PC конец Конфигурация DragonSN Инструменты после проекта.
  3. оборудованиепроходить usb и pc После подключения откройте машину.
  4. DragonSN Начните запись после подключения устройства. подробности DragonSN инструментизиспользоватьиллюстрировать)。

rotpk Процесс обработки на маленьком компьютере во время записи.

Чтобы гарантировать, что неправильный случайно не сгорит rotpk, Небольшой компьютер выполнит дополнительную обработку при записи. Конкретный процесс выглядит следующим образом: ПК rotpk и uboot, выдаваемые инструментом Подтвердит существование и текущий твердый кускииз rotpk Запрос только после сопоставления Monitor Сожгите ротпк. для 64 Для платформы, Монитор для ATF, для 32 битовая платформа, монитор для OPTEE。

Рисунок 4-5: Небольшая машинная обработка во время записи rotpk

4.6 Меры предосторожности

  1. rotpk Вы можете записать это только один раз, Горет Сделайте еще один выстрел за другим. Сгенерировать ключ》серединарожденныйстановитьсяизключдокумент。
  2. горетьзаписывать过Безопасностьтвердыйкускиназад, Каждый раз, когда чип включается, он выполняет проверку производительности. В это время гореть записывает обыкновенные твердые куски, Он не запустится, потому что невозможно проверить методом проведения. Поэтому обычные твердые куски безопасности нельзя смешивать.
  3. Чип не записан rotpk час, Пропустить проверку открытого ключа корневого сертификата, Продолжайте последующий процесс проверки.
  4. Чип покидает завод, Чип записывает номер версии антиотката для 0。

5 secure os

5.1 Введение в OPTEE

Allwinner Внедрение программной платформы OPTEE делатьдля secure os реализация это строго следует ARM Trust-Zone и TEE/GP и другие отраслевые стандарты. проходить OPTEE Приходитьиспользовать TrustZone технология. присоединиться OPTEE назад, Общая структура системы выполнения показана на рисунке ниже: Вот как присоединиться OPTEE назад, Новые ключевые компоненты в системе.

Рисунок 5-1: Общая архитектура OPTEE

5.1.1 OPTEE OS

длябегатьсуществовать TEE относящийся к окружающей среде о.с. Основная ответственность за:

  1. EE Внизиз Планирование задач.
  2. TEE Внизиз распределения ресурсов.
  3. для TEE Приложение Внизиз обеспечивает системный вызов, Эти системные вызовы содержат GP Правила TEE internal API。
5.1.2 OPTEE linux driver

REE запрос среды TEE относящийся к окружающей Программа среды обеспечивает сервисное обслуживание,нужно пройти TrustZone назначенный smc Форма запроса на изготовление. ОПТИЕ linux driver Инкапсулирует эти запросы. РЗЭ верно TEE относящийся к окружающей средепросить不直接操делатьжесткийкуски, проходитьверноOPTEE linux driver из IO ctrl Доставка интерфейса.

5.1.3 OPTEE client

Клиент OPTEE преследует две цели:

a. о REE верно TEE изпросить,GP Предусмотрены стандартные интерфейсы,сказатьдля TEE client API。OPTEE client Реализуйте эти интерфейсы, REE Приложению Environment Viziz требуются только булавки верно TEE client API интерфейс может быть запрограммирован на завершение TEEизпросить。

b. OPTEE OS существоватьбегатьчаснуждатьсясуществоватьпросить REE Окружающая среда помогает выполнять файловые операции. ОПТИЕ client Получите эти просить и сделайте иметь дело с. TA(trusted apps, существовать TEE Приложение "Среда проектиз") изнагрузка. ТА хранилищесуществовать REEотносящийся к окружающей СИСТЕМА СЭД-документов, бегать TA Когда, ОПТЭЭ OS просить REE читать TA изчислов соответствии спродолжить позженагрузка (Уже нужно верноREE Вниз TA фальсификация из превентивных мер).

5.1.4 TA/CA

TA:Trusted apps, бегатьсуществовать TEE относящийся к окружающей применение окружающей среды, Конфиденциальная информация обрабатывается напрямую TA руководить.

CA:Client apps, Также называется для NA(Normal apps)。существовать REE Приложение «Окружающая среда Внизпроектировать», Это традиционное изприложение.

TrustZone Реализована технология изиспользовать базу книг данной формы: REE Приложение Внизиз просить TEE Приложение Внизиз выполняет определенные операции с конфиденциальной информацией:

Например, при проверке пароля пользователя REE Запросить у пользователя ввод пароля, TEE Затем, если пользователь вводит пароль и изменяет пароль, последовательный ответ отсутствует.

чем веренпроходить/не проводить. Таким образом, существование REE остается полностью нетронутым при настройке пароля в условиях искусственного интеллекта. Вниз достигается правильный ввод пароля при проверке. Гарантированно сохраненный пароль из Безопасность.

Эти функции требуют TA/CA Скоординированная реализация,Калифорния делатьдля client инициироватьпросить,TA иметь дело с.

5.2 Конфигурация операционной среды TEE

для了 TA/CA Умеют нормально работать вместе, Удовлетворение потребностей продукта. нужна гарантия TA/CA бегатьчас,TEE Окружение подготовлено. Бетондля OPTEE OS、OPTEE linux driver、OPTEE client уже经Конфигурация妥当инормальныйбегать。Внизлапша逐个Группакускииллюстрироватькак Конфигурация

5.2.1 OPTEE OS

Безопасностьтвердыйкускисуществоватькомпилировать Пришло время включено OPTEE OS, и Безопасностьтвердыйкускисуществоватьруководить secure boot изпроцесссередина будет направлять OPTEE ОС. Никакой дополнительной настройки не требуется.

5.2.2 OPTEE linux driver

а. Конфигурация компиляции ядра.

Добавляется при компиляции ядра linuxdriver, Конфигурациянаправление Режимнравиться Вниз:

  1. существовать longan Каталог Вниз ввода ./build.sh menuconfig Введите конфигурацию ядра UI。
  2. давать возможность Конфигурация:

Рисунок 5-2: Введите конфигурацию драйвера

Рисунок 5-3: Включите драйвер TEE для Linux.

и введите TEE drivers —–> Проверять:

​ картина 5-4: давать возможность TEE driver середина OP-TEE из driver

5.2.3 OPTEE client

a. Присоединиться верно следует из динамической библиотеки и tee-supplicant приложение.

Волялиствдокументскопировать в longan/out/${platform}/linux/common/rootfs_def/верноотвечатьдокументпапка Вниз:

имя файла

скопировать в

tee-supplicant

bin/

libteec.so libteec.so.1 libteec.so.1.0

lib/

предупреждать

После копирования**,** существовать longan глаззаписывать Внизбегать**./build.sh** Только тогда Воля сможет соответствовать динамической библиотеке и supplicant Приложение упаковывается в корневую систему документов середина.

b. бегать tee-supplicant приложение.

  1. Способ 1 (ручной запуск)

существовать linux Окружающая среда Вниз,Вырезать до tee-supplicant Местосуществоватьглаззаписывать (/bin), осуществлять:

./tee-supplicant &

! предупреждать

tee-supplicant run будет слушать в бесконечном цикле TEE изпросить**,** Не вернусь. пожалуйста, не пропустите это ``&‘’

  1. Способ 2 (автоматический запуск)

Измените процесс инициализации Linux, чтобы он автоматически запускался при загрузке.

5.2.4 Конфигурация пространства памяти среды TEE

a. TEE относящийся к окружающей среде Памятьиспользовать。

TEE EnvironmentuseizMemory имеет 3 часть,каждыйчастьразмерсуществовать optee os Указывается во время компиляции,3.7 версиякнигаиз optee Поддержка через uboot из fdt Исправлять memory планировка, укажите share memory и ta memory из размера. Закрыто по умолчанию, требуется после открытия uboot Поддержка (uboot Внизволосы fdt из Адрес optee читать fdt)。каждыйчастьэффектнравиться Вниз:

Язык кода:javascript
копировать
i. Общая память: для REEиTEEизчислов соответствии с Exchange,TrustZone Technology серединаREEиTEEизInteractive проводитsmcруководить,smc использует только Register Exchange Limited из числа соответствии с,Больше изчислов соответствии спроходить общую память для подкачки.
ii. Optee Память ОС: выделенная память optee_os. optee_osнагрузка сюда, проектируете.
iii. Куча памяти TA: нагрузкаTA, размещение кучи TA, стек из пространства памяти. Зависит отoptee_os выделен. Память, выделенная для определенного ТАиз, может быть выделена только для Зависит отTAилиoptee_osдоступ, другие ТА не могут получить доступ.
  1. существуют optee os Когда указан компилировать, необходимо уделить внимание открытию соответствующего макроса.

“‘ diff –git a/core/arch/arm/plat-sun50iw12p1/conf.mk b/core/arch/arm/plat-sun50iw12p1/conf.mk

index 2ea4602…46192f5 100644 — a/core/arch/arm/plat-sun50iw12p1/conf.mk +++

b/core/arch/arm/plat-sun50iw12p1/conf.mk @@ -35,3 +35,5 @@ CFG_NUM_THREADS

= 2 CFG_SUNXI_KL_SUPPORT = y CFG_SUNXI_MIPS_SETUP = y +CFG_SUNXI_FDT

= y +CFG_EXTERN_DEFINED_MM_LAYOUT = y diff –git a/core/arch/arm/plat

sun50iw12p1/main.c b/core/arch/arm/plat-sun50iw12p1/main.c index c182a6b…1683318

100644 — a/core/arch/arm/plat-sun50iw12p1/main.c +++ b/core/arch/arm/plat

sun50iw12p1/main.c @@ -83,7 +83,6 @@ sunxi_hash_install(); /sboot did not use

all sram, clean part of it should be enough/ memset((void *)sunxi_sram_base, 0,

SRAM_SIZE); - sunxi_smc_config(TA_RAM_START, TA_RAM_SIZE); }

void console_init(void) diff –git a/core/arch/arm/plat-sun50iw12p1/platform_config.h

b/core/arch/arm/plat-sun50iw12p1/platform_config.h index c58e8b5…80e5358

100644 — a/core/arch/arm/plat-sun50iw12p1/platform_config.h +++ b/core/arch/arm/plat

sun50iw12p1/platform_config.h @@ -71,9 +71,6 @@

#define CFG_TEE_CORE_NB_CORE 2

-/* Full GlobalPlatform test suite requires TEE_SHMEM_SIZE to be at least

2MB / -#define TEE_SHMEM_SIZE 0x400000 -#define TEE_SHMEM_START

*(TZDRAM_BASE - TEE_SHMEM_SIZE) /1M for ATF/

#define HEAP_SIZE (128 * 1024)

@@ -94,10 +91,6 @@ /* TA: 1M */ #define TEE_RAM_PH_SIZE TEE_RAM_VA_SIZE

#define TEE_RAM_START TZDRAM_BASE -#define TA_RAM_START ROUNDUP((TZDRAM_BASE

+ TEE_RAM_VA_SIZE),

- CORE_MMU_PGDIR_SIZE)

-#define TA_RAM_SIZE ROUNDDOWN((TZDRAM_SIZE - TEE_RAM_VA_SIZE),

- CORE_MMU_PGDIR_SIZE)

/devices area:0x100 0000 ~ 0xA00 0000/ #define DEVICE0_PA_BASE 0x02000000

“‘

“‘ 1) проходить uboot из fdt обозначение。существоватьверноотвечатьиз defconfig Откройте соответствующий макрос, включите uboot существоватьбегать Во время встречи Воляоборудование

Размер выделенной памяти в дереве должен быть передан в optee, а параметры должны быть переданы ядру для резервирования соответствующей памяти.

“‘

diff –git a/configs/sun50iw12p1_defconfig b/configs/sun50iw12p1_defconfig index

670a2ef…d1d6fc4 100644 — a/configs/sun50iw12p1_defconfig +++ b/configs/-

sun50iw12p1_defconfig @@ -96,5 +96,6 @@ CONFIG_SUNXI_IMAGE_VERIFIER=y

CONFIG_SUNXI_KEYBOX=y CONFIG_SUNXI_DRM_SUPPORT=y +CONFIG_SUNXI_EXTERN_SECURE_MM_LAYOUT=y

CONFIG_SUNXI_MIPS=y

“‘

fdt в Конфигурацияэлемент。

“‘

{ firmware { optee { shm_base = <0x48400000>; shm_size = <0x00200000>;

ta_ram_base = <0x48700000>; ta_ram_size = <0x00500000>; }; } }

“‘

:::note

  1. Если платформа из u-boot и kernel использоватьдругойиз fdt,memory layout из Конфигурациянуждатьсясуществовать u-boot из fdtначальстворуководить Конфигурация。
  2. использовать uboot из fdt При указании памяти ее нельзя указать Optee os из местоположенияиразмера,этачастьизпамятисуществовать opteeos Это было определено при компиляции. :::

b. Ядро для TEE Резервная память.

Ядро с общей памятью TEE все имеют права доступа, этотчастьсодержаниесейчассуществовать Зависит от TEE Управлять. Если ядро ​​также выделяет эту память, это приведет к неправильному использованию памяти REE. и TEE Исключение взаимодействия. другой os Управлять и контролировать память REE Нет прав доступа,REE После того, как существование применяется к этим воспоминаниям, любая операция может быть прочитана только благодаря 0 ибегатьаномальный。поэтому, Ядро необходимо настроить так, чтобы оно могло резервировать TEE среда используетиз физического адресного пространства, Избегайте конфликтов памяти. Конкретный метод Конфигурациянаправление такой же, как Вниз: Исправлятьдокумент arch/arm64/boot/dts/sunxi/${platform}.dtsi, Присоединяйтесь как Внизсодержание. SDK средний выход Конфигурация завершена, Нет необходимости в Исправлять. существует новая версия книги, когда середина зарезервировала память из узла дерева устройств, имя вызвало некоторые изменения, Зависит от оригинала bl31 Изменить для optee_reserve, размер этого узла обычно для SHARED MEM+TEE MEM+TA МЕМ, если uboot из Обновлено дерево устройств SHARED MEM и TA MEM, ядру нужно только зарезервировать TEE MEM из Памяти, ОБЩИЙ MEM и TA MEM из Памятьсуществовать uboot запустить процесс середина Воля Эта информация Исправлять записывается в ядро ​​из дерева устройств.

linux-5.4:

Язык кода:javascript
копировать
reserved-memory {
    #address-cells = <2>;
    #size-cells = <2>;
    ranges;
    bl31 {
	    reg = <0x0 0x48000000 0x0 0x01000000>;
    };
};

Другие версии Linux:

/memreserve/ 0x48000000 0x01000000;

:::note часть linux-4.9 Платформа такжеиспользоватьтакой же linux-5.4 То же, что и изнаправление, например v853 на платформе. :::

5.3 Использование операционной среды TEE

TEE Запланировать После завершения подготовки среды вы можете подать TA/CA использовать基В TrustZone Техническая функция. ТА/КА 开волосы Посмотреть подробности TA/CA Рекомендации по разработке.

6 Руководящих принципов развития ТП/ЦА

6.1 Структура каталогов среды разработки

Среда разработки находится по адресу longan/tee_kit, глаззаписывать结构нравиться Вниз:

Файл (папка)

иллюстрировать

build.sh

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

dev_kit

Зависимости компиляции (зависят от платформы)

demo

demo

platform_config.mk

Информация о платформе

tools

Цепочка инструментов компиляции

6.2 Компиляция

a. бегать./build.sh -t, Разархивировать Цепочка инструментов компиляции。

b. бегать./build.sh скомпилировать все DEMO。

6.3 Инструкции по использованию скрипта компиляции

Язык кода:javascript
копировать
Заказ Функция
-h Отображение справочного сообщения.
-t Распаковать tools Каталог в Цепочка инструментов компиляции。
clean очистить все demo компилироватьвыход。
config Выберите платформу компилирования.

6.4 Копирование

копировать Вниз списка документов на устройство:

TA/CA бегать Должен изобщественныйдокумент。

документ

скопировать в

./dev_kit/arm-plat-${platform}/export-ca/bin/tee-supplicant

Не ограничивается местоположением

./dev_kit/arm-plat-${platform}/export-ca/exportlib/libteec.so

/lib

./dev_kit/arm-plat-${platform}/export-ca/exportlib/libteec.so.1

/lib

./dev_kit/arm-plat-${platform}/export-ca/exportlib/libteec.so.1.0

/lib

Действительный TA/CA программа.

demo верноотвечатьизвыходдокумент (Посмотреть подробностикаждый demo изиллюстрировать)。

6.5 Эксплуатация

6.5.1 Запустите демон, который помогает в обмене данными между REE и TEE.
Язык кода:javascript
копировать
${Supp_dir}/tee-supplicant &

Supp_dir для размещения тройника-соискателя из каталога.

tee-supplicant Что касается демона запуска, не вернется, 必须带"&"бегать。

6.5.2 Запуск ДЕМО
6.5.2.1 helloworld

книга demo выставка CA Как вызвать TA,кикакпроходитьобщийсодержание К TA Перенести данные.

a. копироватьиздокумент

документ

скопировать в

./demo/optee_helloworld/na/hello_world_na

Не ограничивается местоположением

./demo/optee_helloworld/ta/12345678-4321-8765-9b74f3fc357c7c61.ta

/lib/optee_armtz

b. бегать

Заказ

выход

hello_world_naNA:init context

NA:open session

TA:creatyentry!

TA:open session!

NA:allocate memory

NA:invoke command

TA:rec cmd 0x210

TA:hello world!

NA:finish with 0

hello_world_na

NA:init context

1234

NA:open session

Примечание:{1234}

TA:creatyentry!

Вы можете использовать любое слово

TA:open session!

нить

NA:allocate memory

NA:invoke command: hello 1234

TA:rec cmd 0x210

b. бегать

жизнь

делать

искусство

куски

имя

к

test

для

пример выход

demo

-c

test

создаватьдокументстановиться Гонг не особенныйвыход

demo

-w

test

Писать

из

число

в соответствии с

Зависит от

demo

Следовать

машина

рожденный

становиться

—- Write file:test with 256 Bytes data: —-

99 9c 9b 66 88 2c c8 c9 19 55 72 10 f7 c3 70 7f

1a 51 56 74 35 03 e4 6f 1b 40 4d 64 29 b5 ba c2

52 56 a8 db 03 f1 25 1c 47 97 ac bf da 1d 3f f4

ed 15 69 a3 18 cd 92 33 0f df 98 b7 15 d2 fa 67

a8 23 c2 ab 15 68 48 dc 00 f4 9c db 91 5b d0 80

70 ba a3 88 08 36 3b 96 16 53 ce aa 26 c9 12 4f

ec 55 fa 82 bd c2 5f 3d b7 7b 98 4a 56 e9 4a c6

a4 ed ce 2c 24 89 c3 b9 dd 92 64 83 db f5 d2 48

ca 4e ca 08 11 a9 46 49 a4 de 93 fa c8 5d c1 ec

4b 10 1a ee 9a 5d 28 f7 6f 8c fa 4b 02 ce 13 cd

9c de d5 ad 08 9b 76 ad 7b 0a a8 c3 e6 ea 31 b1

7a 4b a0 94 28 c8 8c 97 d4 08 62 d7 56 75 25 f2

d3 7a 20 5c 17 97 0a 12 21 32 55 09 1d 86 ba 18

51 db ac 79 a4 b9 90 f9 c1 72 51 18 68 76 8a 3c

70 aa 98 07 c1 22 19 63 55 ee 6c f1 75 a6 89 c7

02 37 c0 27 f0 d1 21 32 c3 72 c9 2c 68 54 e8 d8

—- Write file:test end! —-

жизнь

делать

искусство

куски

имя

к

test

для

пример выход

demo

-r

test

—- Read file:test 256 Bytes data: —-

99 9c 9b 66 88 2c c8 c9 19 55 72 10 f7 c3 70 7f

1a 51 56 74 35 03 e4 6f 1b 40 4d 64 29 b5 ba c2

52 56 a8 db 03 f1 25 1c 47 97 ac bf da 1d 3f f4

ed 15 69 a3 18 cd 92 33 0f df 98 b7 15 d2 fa 67

a8 23 c2 ab 15 68 48 dc 00 f4 9c db 91 5b d0 80

70 ba a3 88 08 36 3b 96 16 53 ce aa 26 c9 12 4f

ec 55 fa 82 bd c2 5f 3d b7 7b 98 4a 56 e9 4a c6

a4 ed ce 2c 24 89 c3 b9 dd 92 64 83 db f5 d2 48

ca 4e ca 08 11 a9 46 49 a4 de 93 fa c8 5d c1 ec

4b 10 1a ee 9a 5d 28 f7 6f 8c fa 4b 02 ce 13 cd

9c de d5 ad 08 9b 76 ad 7b 0a a8 c3 e6 ea 31 b1

7a 4b a0 94 28 c8 8c 97 d4 08 62 d7 56 75 25 f2

d3 7a 20 5c 17 97 0a 12 21 32 55 09 1d 86 ba 18

51 db ac 79 a4 b9 90 f9 c1 72 51 18 68 76 8a 3c

70 aa 98 07 c1 22 19 63 55 ee 6c f1 75 a6 89 c7

02 37 c0 27 f0 d1 21 32 c3 72 c9 2c 68 54 e8 d8

—- Read file:test end! —-

demo

-d

test

Delete file:test !

demo

-h

Показать справочную информацию

6.5.2.3 base64-usage

книга demo выставканестидляиз base64 мягкий实сейчаскакиспользовать。

a. копироватьиздокумент

документ

скопировать в

./demo/base64-usage/na/base64_demo

Не ограничивается местоположением

./demo/base64-usage/ta/b0e8fef8-b857-4dd4-bfa6088373069255.ta

/lib/optee_armtz

b. бегать

Заказ

выход

base64_demo

input bytes:

-e 123456

0x12 0x34 0x56

-e необходимо отредактировать после для

NA:open session

код из байтовой строки, два

TA:creatyentry!

символы верно должны быть одни

TA:open session!

байты

NA:allocate memory

TA:rec cmd 0x221

input size:3

encode result:

base64_demo

NA:open session

-d EjRW

TA:creatyentry!

-d необходимо решить после для

TA:open session!

кодиз Характернить

NA:allocate memory

TA:rec cmd 0x222

input size:4

decode result:

0x12 0x34 0x56

NA:finish with 0

предоставлено TA из base64 Реализуйте внешний интерфейс

интерфейс

иллюстрировать

size_t EVP_EncodeBlock(uint8_t *dst, const* uint8_t* src,size_t src_len);

верно src Начни расти src_len из u8 группа чисел для кодирования,выходприезжать dst, выходиз Характернитьиспользовать’\0’ Конец. получить значение длины закодированного символа, Не содержит окончания из’\0’

int EVP_EncodedLength(size_t out_len, size_t len);

вычислить len Длина из ввода существует извыход длины после кодирования/декодирования,Писатьприезжать out_len середина。вычислитьстановитьсядостижениевозвращаться 1, вычислить Возврат в случае неудачи 0

int EVP_DecodedLength(size_t out_len, size_t len);

int EVP_DecodeBase64(uint8_t out, size_t out_len,size_t max_out, const uint8_t *in,size_t in_len);

верно in Начни расти in_len из входа для декодирования,выходприезжать out, После декодирования длина заполняется out_len, max_out для out верноотвечатьиз buffer изразмер。становитьсядостижениевозвращаться 1, Возврат в случае неудачи 0。

6.6 Конфигурация компиляции

Внизлапшапредставлять开волосы新из TA/CA Как настроить зависимости, Пространство ограничено, Вот лишь некоторые ключевые моменты, Подробную информацию см. demo из源код。

6.6.1 TA

a. существовать TA Исходный код создания корневого каталога Makefile, Содержит к Внизсодержание.

содержание

иллюстрировать

BINARY=$(UUID)

финальныйрожденныйстановитьсяиз.ta документизимя файла,TEE нагрузка TA Пришло время UUID дляимя файлачитатьдокумент, Должен и TA из UUID последовательный

include${DIR}/ta_dev_kit.mk

TA Бинарный код, компилируемый в двоичном виде, имеет специальную обработку, использовать dev_ki/arm-plat-${chip}/export-ta_arm32/mk/ta_dev_kit.mk компилировать

b. существовать Исходный код создания корневого каталога sub.mk, Предоставьте информацию о компиляции:

Заказ

эффект

srcs-y += filename

имя файла добавлено в компиляцию

subdirs-y += dirname

include dirname Внизиз sub.mk

global-incdirs-y += dirname

компилировать TA Каталог поиска документов часов

cflags-/-y += c

документкомпилировать flagfilename длярожденныйэффектиздокумент,cflags-y действительноall c документ действителен

aflags-/-y += s

документкомпилировать flag

cppflags-/-y += c

и s документкомпилировать flag

TA_PRIVATE_FLAGS +=

соединятьрожденныйстановиться TA из elf часиспользоватьиз flag

6.6.2 CA

a. Содержит описание TEE client API изголовадокумент。

b. вызов TEE client API и TA взаимодействие, Посмотреть подробности demo。

в. Добавьте dev_kit/arm-plat-${platform}/export-ca/include в каталог включения.

d. Добавьте dev_kit/arm-plat-${platform}/export-ca/exportlib в каталог поиска библиотеки.

e. использовать реализация подключения опции "-lteec" TEE client API из динамической библиотеки libteec.so。

6.6.3 Шифрование ТА

a. открыть/закрыть TA шифрованиедляподдерживать TA шифрованиеизплатформа, существоватьиспользовать./build.sh config Вам будет предложено это сделать после выбора платформы середина Должен. encrypt TA(y/n): ,y、n верноотвечатьданетверно TA Шифрование, безопасность os нагрузка TA автоматически определит, когда TA Требуется ли расшифровка.

b. Настройка ключей шифрования TA шифрованиеиспользоватьпроходить aes руководить,ключдлинадля 128bit(16 байт),магазинсуществовать dev_kit/arm-plat-${platform}/export-ta_arm32/keys/ta_aes_key.bin документсередина。нравиться果нуждаться Исправлять TA шифрованиеиспользоватьизключ,пожалуйста Исправлятьэтот bin документ。

чиписпользовать efuse в ssk key верно TA Расшифровать. Пожалуйста, убедитесь в этом aes key чипиз efuse в ssk keyпоследовательный。

7 Хранение ключей

Какой бы даиспользоватьключ ни выполнял расшифровку шифрования, Также даиспользовать хэш-проверку твердых куски. Все, что связано с верным ключом, верным хешем сохранено. Эта информация к key из形Режим Сжечь, чтобыоборудованиесередина。горетьзаписыватьпроцесспроходить dragonSN инструментруководить.key Есть несколько способов сохранить изнаправление, Каждый тип консервации имеет свои особенности. Внизлапшакорень соответствии с key Хранение типа изнаправление осуществляется правительством.

7.1 efuse

держатьсуществоватьчип内из efuse начальство,Не стираемый。проходить sid доступ к модулю. изливать всодержаниеточкастановитьсядвачасть, Безопасностьи Нет Безопасность。доступ efuse прочитать ПРОСМОТР РЕЗУЛЬТАТОВ Статус чип зависит, В частности, Вниз:

Статус чипа

Доступ не защищен

efuse

Безопасность

нормальный

нормальный

Нет Безопасность

нормальный

Возврат 0

Записать конфигурацию

​ картина 7-1: DragonSN горетьзаписывать Безопасность efuse Конфигурация

efuse map

efuse Пространство существования разделено при проектировании чипа, Могут быть записаны только конкретные имена ключ. каждый key наличие каждого чипа efuse Из Пожалуйста, обратитесь к чипу для определения места хранения efuse map。

7.2 flash

Сохраните чип снаружи flash начальство, корень соответствии сохранитьиз flash областьиздоступнаправление Режим, точкадля Безопасность key ичастный key двадобрый。

7.2.1 Ключ безопасности (безопасное хранилище)

держатьсуществовать flash начальство, Сектора использования не сопоставляются с логическими секторами. Обычно flash Операцию невозможно выполнить. нормальное массовое производство не сотрётся.

Записать конфигурацию

​ картина 7-2: DragonSN горетьзаписывать Безопасность key Конфигурация

7.2.1.1 keybox

особенныйиз Безопасность key, Сохранить здесь key Искусство Мин не будет спасено, идадержать Зависит от secure os шифрование тоже измиискусство. Обратите внимание, что ОПТЭЭ OS использовать efuse в SSK key Приходитьшифрованиеяркийискусствочислов соответствии с,для Гарантированочислов соответствии с Безопасность,пожалуйстасуществоватьгоретьзаписывать SSK продолжить позже keybox числов соответствии сизгоретьзаписывать、использовать。

а. список ящиков для ключей

keybox роды secure storage середина。dragonSN Инструмент записи может указать только key Сжечь,чтобы secure storage。 key данет Сжечь, чтобы keybox середина, Зависит от uboot корень соответствии с key изимя называется решением. uboot использовать переменные среды keybox_list Определить текущую запись гореть из key да Нетдлянужно сохранить в keybox из key,даносуществоватьгоретьзаписывать、нагрузкачас做相отвечатьизиметь дело с.

keybox_list Переменные среды родные devides/config/chips/${chip}/configs/default/env.cfg середина,использовать逗Числоточкакаждый key. Внизлапшаизпримерребеноксередина,горетьзаписыватьчасимясказатьдля rsa_key или ecc_key или testkey из key будет сохранен в keybox для secure os Расшифроватьиспользовать。

Язык кода:javascript
копировать
keybox_list=rsa_key, ecc_key, testkey

б. сжечь

проходить dragonSN Инструменты для выжигания

​ картина 7-3: key Сжечь, чтобы keybox изпроцесс

в. Включение питания.

uboot читать key Отправить secure os。secure os Кэш после расшифровки, для TA проходитьинтерфейсдоступ。

​ картина 7-4: key от keybox серединанагрузкаизпроцесс

7.2.2 Закрытый ключ (частное хранилище)

держатьсуществовать private Раздел. Во время массового производства этот раздел будет перемещен в память. После завершения массового производства память будет восстановлена ​​до flash середина, достичь После массового производстваточка区содержаниебронироватьизглазиз。добавить вчастныйточка区нуждатьсясуществовать sys_partition.fex Добавить конфигурацию Внизсодержание。

Язык кода:javascript
копировать
[partition]
name = private
size = 1024
user_type = 0x8000

key Сохранить в имя файладля key имясказатьиздокументсередина,Можеткпроходитьдокументсистемадоступприезжать key изсодержание。

Записать конфигурацию

​ картина 7-5: DragonSn Сжечь личное key Конфигурация

Форматирование раздела

После массового производства private Содержимое раздела остается неизменным. Поэтому private Раздел не может быть отформатирован для массового производства. для неформатированного из раздела, гореть key Форматирование требуется, когда раздела。

​ картина 7-6: Форматировать частный раздел

документпуть

key Сохранить в имя файладля key имясказатьиздокументсередина,документпуть Можетксуществоватьгоретьзаписыватьчас Конфигурация。

​ картина 7-7: частный key горетьзаписыватьпуть

:::warning частьплатформа Может能встречачитатьидентификациячастный key, читатьчасиспользоватьизпутьдля Сжечь личное key Путь по умолчанию. Если Исправит пройдет key изгореть путь записи, Обратите внимание, что синхронизация Исправлять с элементами конфигурации. :::

существовать sys_config.fex серединаиспользовать

(keyname)_filename= "

(path_to_key_file)" из обозначения формы key изчитать。

8 Хранение данных при отключении питания в среде TEE

TrustZone Требовать Безопасностьи Нет Безопасностьресурссуществоватьжесткийкускиначальстворуководить隔离, Его набор ресурсов Безопасности должен быть заменен внутри чипа. Атаки нечиповых элементов на печатную плату. Но Зависит от Встановитьсякнигапричина, Большая часть устройств не интегрирована в чип, большая емкость не будет потеряна после сбоя питания, а стираемые носители данных (например, nand), поэтому TEE середину необходимо выключить, чтобы сохранить изцифры соответствии все необходимо сохранить на внешнем носителе данных середина. правда это TrustZone Технические характеристики также имеют соответствующее изнаправлениеслучай, тройник. извчислов соответствии с Необходимо сохранить на внешнем носителе данных, Необходимость удовлетворения определенных требований. опти Предлагается для удовлетворения требований Должена к поставке. Может использоваться для TEE средасерединачислов соответствии сиз Сохранить после выключения.

8.1 Функциональная структура безопасного хранения OPTEE

OPTEE Secure Storage с программной архитектурой, такой как Вниз:

​ картина 8-1: OPTEE Secure Storage мягкийкуски Архитектура

8.2 Процесс работы с файлами

TA вызов GP Trusted Storage API дляиз Писатьинтерфейс, этотинтерфейсвстречавызов TEE Trusted Storage Service в Похожие syscall Реализация попадает в OPTEE из kernel space середина, Должен syscall Вызову серию из TEEFile Operation Interface интерфейс Приходитьхранилище Писатьвходитьизчислов соответствии с。TEE система документов «Воля Писат» существует соответствии сруководитьшифрование, Затем провести серию из RPC сообщение для TEE supplicant отправлять REE документ操делать Заказкиужешифрованиеизчислов соответствии с。TEE supplicant верно разобрать эти сообщения, в соответствии с определением расчетов соответствии с Депозит на вер должен из Linux документсистемасередина(по умолчаниюда/data/tee глаззаписывать)。кначальстводаверно Писатьчислов соответствии сизпроцессинг, верночитатьчислов соответствии сиз обрабатывается аналогично.

8.3 Используйте безопасное хранилище OPTEE для обеспечения зашифрованного хранилища файлов для REE.

Конфигурация TA длясервервызов OPTEE OS дляизмагазинногоинтерфейса,могу позволить REE такжеиспользоватьэтотинтерфейс, надстановитьсячислов соответствии сизшифрование памяти. Подробную информацию см. demo в encrypt_file_storage。

9 ссылок

a. TrustZone

  1. PRD29-GENC-009492C_trustzone_security_whitepaper.pdf

b. GlobalPlatform

  1. GPD_TEE_SystemArch_v1.1.pdf
  2. GPD_TEE_Client_API_v1.0_EP_v1.0.pdf
  3. GPD_TEE_Internal_Core_API_Specification_v1.1.pdf
  4. GPD_TEE_TA_Debug_Spec_v1.0.pdf

c. OPTEE

  1. https://www.op-tee.org/documentation/
  2. optee_os/documentation/secure_storage.md
boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода