Что нужно для запуска 64-битного пользовательского программного обеспечения на 32-битном ядре?

10

В Linux и Windows я привык к тому, что мне требуется 64-битное ядро, чтобы иметь систему с multiarch / WoW, где я мог бы запускать 32-битное и 64-битное программное обеспечение параллельно.

А потом, много лет назад, я был поражен, когда кто-то показал мне, что MacOS 10.6 Snow Leopard может запускать 64-битные приложения с ядром в 32-битном режиме. Это может быть в значительной степени забыто сейчас, потому что это был разовый технологический переход. Насколько мне известно, аппаратное обеспечение опережает мобильное пространство, так как оно никогда не требовалось при переходе на 64-разрядную версию для iOS и Android.

Мой вопрос: что нужно для того, чтобы получить такую ​​же возможность в 32-битном ядре Linux (i386 или armhf)?

Я понимаю, что это, вероятно, не тривиально. Если бы это было так, Microsoft могла бы включить эту функцию в 32-разрядную версию Windows XP. Каковы общие требования, хотя? Был ли когда-либо предложенный патч или подтверждение концепции?

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

jdonald
источник
Вы уверены, что Snow Leopard может запускать 64-битные приложения с 32-битным ядром? IIRC ядро ​​также было обновлено на способном оборудовании до 64-битного.
Муру
5
Неважно, вы были правы: superuser.com/a/340591/334516
Муру

Ответы:

16

Для запуска 64-битных приложений требуется некоторая поддержка со стороны ядра: ядру необходимо как минимум настроить таблицы страниц, таблицы прерываний и т. Д., Чтобы поддерживать запуск 64-битного кода на ЦП, и ему необходимо сохранить полную 64-битную версию. контекст при переключении между приложениями (и из приложений в ядро ​​и обратно). Таким образом, чисто 32-битное ядро ​​не может поддерживать 64-битное пользовательское пространство.

Однако ядро ​​может выполнять 32-битный код в пространстве ядра, поддерживая при этом 64-битный код в пространстве пользователя. Это включает в себя обработку, аналогичную поддержке, необходимой для запуска 32-разрядных приложений с 64-разрядным ядром: в основном ядро ​​должно поддерживать 64-разрядные интерфейсы, ожидаемые приложениями. Например, он должен предоставить некоторый механизм для вызова 64-битного кода в ядре и сохранить значение параметров (в обоих направлениях).

Тогда возникает вопрос: стоит ли это того? На Mac и некоторых других системах это можно сделать, поскольку поддержка 32-битного кода ядра означает, что не всем драйверам приходится переключаться одновременно. В Linux модель разработки отличается: все, что в ядре, переносится по мере необходимости, когда вносятся большие изменения, и что-либо вне ядра на самом деле не поддерживается разработчиками ядра. Поддержка 32-битного пользовательского пространства с 64-битным ядром, безусловно, полезна и стоит затраченных усилий (по крайней мере, это было, когда была добавлена ​​поддержка x86-64), я не уверен, что есть смысл рассматривать 64-битные на 32 -немного...

Стивен Китт
источник
Спасибо, это полезно, хотя теперь, когда Жиль указал на свой связанный ответ на unix.stackexchange, я думаю, что для завершенности желательнее. Из того, что я собираюсь похоронить там в потоке комментариев, очевидно, что это все еще невозможно на armhf из-за архитектурных ограничений, хотя теоретически возможно для i386? Дело будет сделано: первоначальной мотивацией был Raspbian, где план фонда - поддерживать одно ядро ​​на долгие годы, сохраняя совместимость с Pi Zero.
JDONALD
3

Snow leopard смог запустить 64-разрядные двоичные файлы в 64-разрядном процессоре Intel.

Он также мог загружаться с 64-битным ядром, когда ваш efi был уже 64-битным (моя серийная версия MacBook Pro с переходной моделью уже была такой машиной).

Эмуляция не была задействована, вы просто заплатили меньшую стоимость при загрузке в 32-битном режиме.

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

Руи Ф Рибейро
источник