Может ли ядро ​​Linux работать как защищенная ОС ARM TrustZone?

Я пытаюсь запустить ядро ​​Linux в качестве безопасной ОС на плате разработки с поддержкой TrustZone (Samsung exynos 4412). Хотя кто-то скажет, что безопасная ОС должна быть маленькой и простой. Но я просто хочу попробовать. И если это возможно, то написать или перенести приложение Trustlet в эту безопасную ОС будет легко, особенно для приложений с UI(доверенный UI).

Я купил плату разработки с работающей защищенной ОС на базе Xv6, и нормальная ОС - это Android(версия Android 4.2.2, версия ядра 3.0.15). Я попытался заменить простую безопасную операционную систему ядром Android на Android, то есть с небольшим ассемблерным кодом, таким как очистка бита NS в регистре SCR, непосредственно называемом записью ядра Linux (с передачей необходимого списка тегов ядра).,

Несжатый код ядра выполняется правильно, и первая функция C ядра, start_kernel(), также выполняется. Почти все функции инициализации работают хорошо, кроме запуска в calibrate_delay(). Эта функция будет ждать изменения jiffies:

/* wait for "start of" clock tick */
ticks = jiffies;
while (ticks == jiffies);

Я предполагаю, что причина в том, что прерывание часов не генерируется (я печатаю логи в функциях обратного вызова прерывания часов, они никогда не поступают). Я проверил состояние CPSR до и после функции local_irq_enable(). Бит IRQ и FIQ установлены правильно. Я также печатаю некоторые журналы в обработчике IRQ ядра Linux, определенном в таблице векторов прерываний. Ничего не вошло.

Я знаю, что могут быть некоторые различия в системе прерываний между безопасным миром и небезопасным миром. Но я не могу найти различия ни в одной документации. Кто-нибудь может указать на них? И самый важный вопрос, так как Linux - очень сложная ОС, может ли ядро ​​Linux работать как безопасная ОС TrustZone?

Я новичок в ядре Linux и ARM TrustZone. Пожалуйста, помогите мне.

3 ответа

Запуск Linux как безопасной мирной ОС должен быть стандартным по умолчанию. То есть, надзиратель за безопасным миром пользуется наибольшим доверием и может легко переходить в другие режимы. Безопасный мир - это операционная концепция процессора ARM.

Примечание. То, что Linux работает в безопасном мире, не делает вашу систему безопасной! TrustZone и безопасный мир - это функции, которые вы можете использовать для создания защищенной системы.

Но я просто хочу попробовать. И если это возможно, то написать или перенести приложение Trustlet в эту безопасную ОС будет легко, особенно для приложений с UI(доверенный UI).

TrustZone позволяет разделять программное обеспечение. Если вы запускаете и Linux, и приложение trustlet на одном уровне, это бесполезно. Трастлет - это просто нормальное приложение.

Обычный режим для трастлетов - это настройка векторной страницы монитора при загрузке и блокировка физического доступа. Ядро Linux может затем использовать smc инструкция для вызова подпрограмм в трастлете для доступа к функциям типа DRM для расшифровки носителей и т. д. В этом режиме Linux работает как обычная операционная система, но может вызывать ограниченную функциональность в безопасном мире через SMC API вы определяете.

Почти все функции инициализации работают хорошо, кроме запуска calibrate_delay(),

Это является симптомом неработающих прерываний. calibrate_delay() выполняет жесткий цикл, ожидая увеличения числа тиков через прерывания системного таймера. Если вы работаете в безопасном мире, вам может потребоваться маршрутизировать прерывания. Регистр GICD_ISPENDR может использоваться для принудительного прерывания. Вы можете использовать это для проверки правильности работы ARM GIC. Кроме того, опция командной строки ядра lpj=XXXXX (где XXXX - некоторое число) может пропустить этот шаг.

Скорее всего, некоторый периферийный маршрутизатор прерываний, конфигурация часов или другая инициализация прерывания / таймера выполняется загрузчиком в обычной системе, и вы упускаете это. Загрузка новой доски всегда трудна; тем более с TrustZone.

Технически ничто не мешает Linux работать в безопасном состоянии процессора ARM. Но это побеждает всю цель TrustZone. Большое сложное ядро ​​и ОС, такие как Linux, невозможно формально проверить до такой степени, что их можно считать "безопасными".

Для получения дополнительной информации по этому аспекту см. http://www.ok-labs.com/whitepapers/sample/sel4-formal-verification-of-an-os-kernel

Что касается конкретной проблемы, с которой вы сталкиваетесь - не должно быть ничего особенного в обработке прерываний в безопасном и небезопасном состоянии (если вы явно не сконфигурируете это как другое). Но может случиться так, что удаленная безопасная ОС выполняла некоторые первоначальные инициализации таймера, которые сейчас не выполняются.

Также 3.0.15 является абсолютно древним ядром - оно было выпущено 2,5 года назад, на основе чего-то, выпущенного более 3 лет назад.

Есть несколько проблем с тем, что вы говорите, которые необходимо прояснить. Во-первых, вы пытаетесь запустить ядро ​​безопасного мира или ядро ​​нормального мира? Вы сказали, что хотите запустить Linux на SW и Android на NW, но в вашем вопросе говорилось: "Я пытался заменить простую безопасную операционную систему ядром Android на Android". Так с каким ядром у вас проблемы?

Во-вторых, вы упомянули об очистке NS-бита. Это на самом деле не имеет смысла. Если бит NS установлен, то для его очистки необходимо, чтобы вы уже работали в NW (как бы указывал установленный бит), вы выполнили команду SMC, переключились в режим монитора, установите бит NS в 0, а затем восстановил регистры SW. Это тот случай?

Что касается прерываний, правильно ли вы инициализировали VBAR для каждого режима выполнения, т.е. Безопасный мир VBAR, Обычный мир VBAR и MVBAR. Все три должны быть настроены, в дополнение к установке правильных значений в NSACR и других, чтобы гарантировать, что прерывания направляются в правильный мир выполнения, а не все просто обрабатываются SW. Кроме того, вам нужны отдельные таблицы векторов исключений и обработчики для всех трех режимов. Возможно, вам сначала удастся обойтись только с одним набором, но как только вы разделите свою систему памяти с помощью TZASC, вам понадобится отделить все.

TZ требует много настроек и не просто обрабатывается путем установки / сброса NS-бита. Для Exynos 4412 - многочисленные регистры управления TZ, которые должны быть правильно установлены для выполнения в NW. К сожалению, никакая информация о них не включена в Публичную версию Руководства пользователя. Вам нужна полная версия, чтобы получить все значения и адреса, необходимые для фактического запуска ядра SW и NW на этом процессоре.

Другие вопросы по тегам