Лого Сделано у нас
176

Организовано серийное производство персональных компьютеров Эльбрус-401 РС

В АО «МЦСТ» завершён цикл подготовки серийного производства отечественных персональных компьютеров Эльбрус-401 РС. В связи со снижением производственных издержек, снижена их розничная цена.

читать полностью

  • 3
    krotozer krotozer
    30.12.1622:58:38

    Двоичная трансляция x86-кода

    * Какие возможности и ограничения имеет двоичная трансляция?

    Эта тема заслуживает рассмотрения в отдельной статье, но вкратце картина складывается следующая. Трансляция бывает двух видов — на уровне системы и на уровне приложения. В первом случае для гостевой операционной системы обеспечивается доступ ко всему аппаратному окружению компьютера, а во втором, соответственно, только выполняется передача системных вызовов из гостевой программы в ядро хозяйской системы Linux. Это можно сравнить с эмуляторами qemu-system-x86_64 и qemu-i386 соответственно, однако транслятор не занимается эмуляцией гостевого процессора, а сразу перекомпилирует гостевой машинный код в нативные инструкции своей архитектуры. Причём преобразование выполняется многократно, постепенно увеличивая степень оптимизации для наиболее часто встречающихся участков кода, а результаты сохраняются в долговременный кэш.

    Транслятор уровня системы (неофициально он называется «lintel» — «эль-интел») поддерживает наборы команд x86 и x86-64, а транслятор уровня приложений («rtc», то есть run time compiler) пока совместим только с 32-битным программами, — 64-битная версия находится в стадии тестирования. Однако совместимость с архитектурой AMD64 / EM64T не означает автоматической поддержки всех новых наборов инструкций, которые можно встретить в тех или иных процессорах Intel / AMD, как-то последние версии SSE, AVX, AES-NI, — соответствующие флаги в информации CPUID будут отсутствовать.

    * Как воспользоваться транслятором уровня системы?

    Очень просто: при запуске компьютера надо указать флэш-карту в качестве загрузочного диска. Если карта оказалась пуста, либо пользователь сам стёр оттуда систему трансляции, то записать её повторно можно в любой момент, выполнив копирование образа командой dd.

    Транслятор уровня системы имеет BIOS оригинальной разработки, и после запуска на экране возникает привычная всем POST-последовательность, в ходе которой можно зайти в меню настроек. Большинство этих настроек — самые обыкновенные, но есть и специфические. Например, можно очень гибко управлять идентификацией процессора по CPUID, меняя не только номер семейства и модели или отдельные флаги способностей, но и текстовое название, — это необходимо для противодействия анти-конкурентному поведению программ, собранных при помощи Intel C++ Compiler. Другая специфическая опция — прозрачное превращение SATA-контроллера в PATA, чтобы обеспечить совместимость с более широким кругом операционных систем. Но, несмотря на наличие таких «волшебных палочек», работа операционных систем, установка которых производилась на настоящей x86-машине, не гарантируется, — особенно это касается Windows с её привязкой лицензии к оборудованию и трепетным отношением к драйверу системного диска.

    * Как воспользоваться транслятором уровня приложений?

    Ещё проще: запустив программу трансляции, передав ей путь к гостевому приложению и путь к корневому каталогу воссоздаваемого окружения. Весь вопрос в том, как сперва получить образ этого окружения. Пока что штатно поставляется только окружение x86-версии системы «Эльбрус», однако допускается использование и других. Если клиент затрудняется сформировать образ нужной системы самостоятельно, специалисты МЦСТ могут оказать необходимую помощь.

    Из-под запущенного гостевого приложения (например, коммандного интерпретатора) пользователь может осуществлять запуск прочих гостевых программ — совершенно прозрачно. В один момент времени может быть запущено сразу несколько экземпляров транслятора, и каждый экземпляр может работать в своём собственном окружении; поэтому, например, можно опробовать одну и ту же версию браузера в разных дистрибутивах, или, наоборот, разные версии браузера в одной системе (пример надуманный, конечно, но суть раскрывает).

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

    Такое действительно возможно, например, когда нативная версия JVM или JS-движка умеет только интерпретировать пользовательский код, а сравниваемая с ней x86-версия располагает полноценным JIT-компилятором. При этом, даже не смотря на то, что имеет место многократная трансляция, — сначала выбранный для оптимизации байт-код компилируется в машинный язык x86, затем ещё через какое-то время он перекомпилируется в E2K (причём трижды, по одному разу на каждый уровень оптимизации), — всё равно итоговый выигрыш от компиляции перевешивает.

    Что касается нативных программ на языках C/C++, то здесь тоже существует логическое объяснение, даже целых два. Во-первых, хоть компилятор LCC и проделывает титаническую работу по оптимизации генерируемого кода, никто не гарантирует, что какой-нибудь компилятор для x86, особенно коммерческий, не справится лучше в том или ином частном случае. Во-вторых, более вероятно, что хорошо оптимизированная программа для x86 попросту была собрана с учётом предварительного профилирования, тогда как компилятору LCC скормили голые исходники без подсказок. Но при прочих равных, конечно, нативные программы должны работать как минимум не медленнее транслируемых, — если это не так, надо отправлять баг-репорт разработчикам LCC.

Написать комментарий
Отмена
Для комментирования вам необходимо зарегистрироваться и войти на сайт,