Мне любопытно. Можно ли установить 64-разрядную программу на 32-разрядную ОС с 64-разрядным процессором?
Я использую Linux на Raspberry Pi 3 и пытаюсь установить более новую версию MongoDB:
armv7l GNU/Linux
PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
NAME="Raspbian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=raspbian
ID_LIKE=debian
Ответы:
В принципе да, но процессор и ОС должны его поддерживать.
В ARMv8 32-битное (Aarch32) ядро не может запускать 64-битные (Aarch64) процессы. Это ограничение процессора.
Есть другие процессоры, которые не имеют этого ограничения, например, можно запускать процессы x86_64 поверх ядра x86_32 на процессоре x86_64, но немногие ядра поддерживают его, предположительно, потому что он имеет ограниченную полезность (в основном, вы сохраняете немного оперативной памяти в ядре, сделав его 32-битным). Linux не поддерживает это, но Solaris поддерживает.
Вы можете сохранить существующую 32-битную ОС, если вы используете 64-битное ядро . Ядро Linux Aarch64 может запускать процессы Aarch32. Raspbian не поддерживает это из коробки, поэтому вам нужно поддерживать как 32-битную, так и 64-битную ОС. Вы можете использовать одну из них в качестве основной ОС (то есть ту, которая запускает init и системные службы), а другую - для запуска определенной программы с использованием chroot. Смотрите Как мне запускать 32-битные программы на 64-битном Debian / Ubuntu? для практического подхода.
Обратите внимание, что вам нужно будет установить все библиотеки, которые требуются для 64-битной программы. Любой данный процесс должен быть либо полностью 32-разрядным, либо полностью 64-разрядным, поэтому нельзя использовать 32-разрядную библиотеку в 64-разрядном исполняемом файле.
Если у вас нет веских причин сохранить 32-разрядную систему, если вам нужно запустить 64-разрядный исполняемый файл, установить 64-разрядную систему будет проще.
Обратите внимание, что единственное, что могут делать 64-битные программы, а 32-битные программы - это адрес более 3 ГБ виртуальной памяти, что имеет ограниченную полезность в системе с 1 ГБ ОЗУ. Вы можете получить выигрыш в производительности от дополнительных, более крупных регистров, но вы также потеряете производительность из-за дополнительных обращений к памяти.
источник
inc
/dec
регистрируют коды операций (0x40 .. 0x4F
). В длинном режиме (64-разрядный режим) размер операнда по умолчанию равен 32, но размер адреса по умолчанию равен 64.xsave
/xrstor
in compat mode может также сохранить полное векторное состояние. Так что это, конечно, не очень хорошо поддерживается или явно обслуживается. Вероятно, точки входа в ядро работают в 64-битном (длинном) режиме и переключаются в 32-битный (компат) режим, прежде чем переходить к остальной части ядра. (Переключатель режима x86 просто принимаетfar jmp
и не влияет на регистры.)На некоторых архитектурах да. Но не на ARM или x86.
Вы можете использовать QEMU для эмуляции 64-битной системы, но не хотите.
источник
Обновите только ваше ядро до 64-битного, чтобы вы могли запускать 64-битные двоичные файлы. По сути, он будет запускать весь ваш дистрибутив в режиме 32-битного сжатия, и ваш единственный 64-битный mongodb будет работать в обычном режиме.
Но это не заслуживает своей цены. Лучше переключить ваш mongodb на 32 бит. Однако в этом случае есть ограничение, что ваша база данных не может быть больше, чем 2 ГБ, так как она напрямую отображает всю вещь в виртуальной памяти. Если ваша база данных больше, остается только обновление ядра. (Спасибо @duskwuff расширение!)
Кстати, если ваша база данных не хочет очень большой нагрузки или вы можете использовать какое-то решение для кэширования перед этим (например, другое, но 32-битное монго), тогда эмуляция процессора может работать. Для этого начните поиск в Google для «qemu qemu-system-x86_64». Хотя такое решение, вероятно, будет иметь непосильную потребность в работе, и его можно будет считать странным в продуктивной среде.
На вашем месте я бы использовал 32-битный монго, если этого достаточно для моей базы данных, или 64-битное ядро, если его нет.
источник
apt-get install mongodb:i386
или что-то подобное?Я бы сказал, что это не невозможно, но очень сложно управлять. Так как 32-битная ОС обычно поставляется с 32-битными двоичными файлами и библиотеками (и принимает их), вам нужно сильно настроить систему, чтобы она работала с 64-битными.
Основная проблема, с которой вы столкнетесь с RPI3, - это отсутствие 64-битного ядра (по крайней мере, с raspbian).
Короче говоря: используйте 32-битные двоичные файлы, и все будет в порядке.
РЕДАКТИРОВАТЬ :
Если вы хотите использовать 64-битное ядро, вам нужно установить дистрибутив, поддерживающий архитектуру ARM64. Вы должны взглянуть на ArchLinux ARM ( здесь ), но он не полностью поддерживается.
Информация, которую вы ищете, находится внизу вкладки установки.
Вы также можете взглянуть на официальный порт Debian , однако все еще есть большие проблемы с портом RPI3, так что вам решать, стоит ли эта проблема
источник
i386
вариант, который включает в себя 64-битное ядро, которое позволяет также устанавливать 64-битные библиотеки и двоичные файлы. Однако поддержка ARM в Debian не допускает этого в системах ARM (но вы можете установить комбинированныйarm64
иarmhf
, если вы начнете сarm64
).Я довольно долго использовал 64-битное ядро с 32-битной системой (это минимальная предпосылка для собственного запуска 64-битных исполняемых файлов плюс все необходимые 64-битные библиотеки). Я бы не рекомендовал это. В конечном итоге я перешел на оптовую продажу 64-битных систем, когда осознал, что заголовки ALSA, особенно в отношении вызовов Midi ioctl, не зависят от размера, а это означает, что компоненты, скомпилированные в 32-битном режиме, не будут хорошо взаимодействовать с 64-битным ядром.
Конечно, это можно считать ошибкой, которую стоит исправить, но темпы развития ALSA практически заморожены, и я не мог ждать несколько лет, пока поддержка смешанной платформы не будет исправлена (и не совместима с двоичными данными, а не смешана). исполняемые файлы), когда интерес к смешанным платформам все равно быстро падает.
Для некоторых приложений все работает в смешанном режиме (на самом деле удивительно много), но если вы делаете больше, чем просто основную часть взаимодействия с ядром, даже через внешние библиотеки, это просто чрезмерно оптимистично.
источник