В Linux 7.3 binfmt_misc научится выбирать интерпретатор через BPF

· Linux и open source
Механизм запуска неродных исполняемых файлов в ядре Linux получает программируемый выбор интерпретатора — вплоть до подключения BPF-программ, определяющих окружение для каждого запуска.

cover.svg

Подсистема ядра Linux binfmt_misc отвечает за запуск «неродных» и нестандартных файлов: именно она передаёт Windows-исполняемые файлы в Wine, а JAR-архивы — в среду исполнения Java. К открытию окна слияния Linux 7.3 этот механизм ждёт заметное расширение возможностей.

Основной набор изменений VFS уже отправил Кристиан Браунер, заранее — до старта цикла разработки 7.3, который должен открыться сразу после запланированного на 17 августа выхода релиза 7.2 (при условии, что тот выйдет вовремя). Помимо исправления давних ошибок и переработки блокировок, патчи меняют саму логику реестра форматов.

Интерпретатор вычисляется на лету

Раньше при регистрации формата интерпретатор задавался фиксированной строкой. Теперь тип бинарного файла можно сопоставлять программно, а сам интерпретатор — вычислять при каждом запуске. Ключевое нововведение: к записям binfmt_misc разрешено подключать BPF-программы, которые динамически выбирают среду исполнения — загрузчик или интерпретатор — индивидуально для каждого файла.

По словам Браунера, это открывает дорогу к перемещаемым (relocatable) исполняемым файлам, где динамический загрузчик определяется, например, относительно расположения самого бинарника. Такая гибкость особенно интересна для NixOS и других систем с нестандартной структурой путей; механизм универсален и допускает и другие политики.

Два режима диспетчеризации

Вместе с переработкой добавлены два режима запуска. До сих пор выбранный интерпретатор фактически перехватывал всю «личность» процесса: argv[0], /proc/pid/cmdline и /proc/self/exe указывали на него, а не на исходный файл. Из-за этого, в частности, спотыкался gdb — значения AT_ENTRY и AT_PHDR не совпадали с реальным исполняемым файлом, и символы PIE оставались нерелоцированными.

Первый режим — прозрачная диспетчеризация: интерпретатор загружает бинарник через AT_EXECFD, вектор аргументов остаётся ровно таким, каким его сформировал вызывающий, а mm->exe_file и comm помечаются именем самого файла. При этом выставляется бит AT_FLAGS_TRANSPARENT_INTERP, а контроль над отображением бинарника остаётся у интерпретатора. Второй режим — подстановка загрузчика: файл выполняется нативно, а меняется лишь интерпретатор.

Если Линус Торвальдс не выскажет возражений во время окна слияния, обновлённый binfmt_misc войдёт в 7.3. Как именно дистрибутивы и среды исполнения воспользуются новыми возможностями — покажет время.


Источник: Phoronix

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.