Sunday, June 21, 2015

Сила эмуляции

Если посмотреть на современные компьютеры с несколько необычного угла,то можно увидеть: что ничего по сути не поменялось. Да все стало миниатюрнее и содержит большее количество транзисторов, но количество реально работающих транзисторов и объёмы памяти доступные для процессора не поменялись. Конечно это не совсем так и я сильно утрирую, но всё же посмотрим к чему это нас приведет.

Рассмотрим, как же современная аппаратура работает.
  • При включении питания процессор включается и инициализирует свои внутренние структуры можно даже считать, что он вычитывает из своего ROM внутри себя начальную программу, так как современные процессоры кроме совсем простых RISC процессоров, содержат собственный микрокод который при старте конфигурирует внутренние структуры и загружает интерпретатор внешнего бинарного кода, так как сам процессор не знает ничего о своих CISC командах и все эти команды интерпретируются, скорее даже прекомпилируются в начале конвейера в VLIW(very long instruction word) и уже эти команды он выполняет. При этом благодаря идее темного кремния - части процессора которые в данный момент не работают отключают и уменьшают количество включенных транзисторов на каждом этапе. И по сути пытаются не делать универсальные блоки - так как экономить на транзисторном бюджете не нужно, можно создать отдельные блоки для сложения и вычитания и просто выключать лишнее и получать более оптимальное соотношение потребляемой мощности к производительности так как специализированная схема, заточенная под одну операцию всегда эффективнее.
  • После этого начинается загрузка BIOSа, которая содержит совсем маленький загрузчик цель которого включить уровне кеша выше первого, так как только первый уровень кеша доступен на этапе старта и это очень ограниченное количество килобайт. Или почти intel 80. Эти инструкции настраивают следующие уровни кеша и остальную встроенную в процессор периферию, и уж затем копируют туда следующие участки кода BIOSа перекрывая участки оригинального BIOSа и распаковывая его.
  • Инициализируем самые критичные блоки и обновляем микрокод процессора и мы имеем несколько мегабайт доступной памяти и можем регулировать питание внешних устройств и т.п.. Или почти intel 86 процессор.
  • И вот теперь можно протестировать внешнюю память и настроить ее - и мы получаем intel 386 и выше процессор и у нас несколько гигабайт адресное пространство. И начинаем инициализировать остальную периферию. И если это старые BIOS мы выходим в состояние 86 процессора в 16 режиме или если это UEFI - то в родном 32/64 режиме это уже зависит, как повезет.
  • И так мы имеем первый уровень интерпретации. Процессор интерпретирует CISС инструкции - память отображена один в один по адресам, но уже работает система когда все обращении к участку памяти он скрытно копируется в кеш и уже там над ним что-то делают.
Ползем далее - операционная система создает виртуальное адресное пространство или TLB структуры и блокирует все обращение к привилегированным инструкциям. Далее код уже не видит память и не может общаться с периферией. Но можно работать с виртуальными файловыми системами и получать данные не зная, как же это все работает внутри.
Далее мы идем в следующий уровень виртуализации - контейнеры браузеры, виртуальные машины. Нам создают отдельную нить исполнения и перехватывают все наши действия и обращения к памяти и эмулируют новую аппаратуру если нужно - и от сюда нам уже не выбраться - мы не видим ровным образом ничего - нам только сказали - захочешь чего либо - вызови это прерывание.

Аппаратура и драйвера тоже ничего по сути не видят, им их запросы к памяти через IOMMU блокируют с аппаратной стороны и через вынесение их кода на менее привилегированные уровни блокируют обращении с периферией - разрешая через прерывания вызывать код ядра из уровня ниже. Или используя отображение памяти - когда пробрасывается в область памяти процесса память с видеокарты или dma - для скрытого копирования памяти между устройствами удаётся скрыть все особенности аппаратуры и обращения к памяти.

А что этот код будет делать? и кто там? - мы не узнаем, может там совсем другая архитектура и мы в виртуалке?

А есть же еще TrustZone и SMM(system managment mode) код - который может стартовать до BIOSа или быть отдельным процессором, который видит наш процессор и его память с периферией, а мы его нет. На этих механизмах построен менеджмент серверов когда через отдельную сеть управляется состоянием сервера - без его участия, например вход в BIOS и проброс кадра видеокарты через сеть или DRM(digital rights management) логика.

No comments: