Instal program 64 bit pada OS 32 bit dengan prosesor 64 bit

8

Saya penasaran. Apakah mungkin untuk menginstal program 64 bit pada OS 32 bit dengan prosesor 64 bit?

Saya menjalankan Linux pada raspberry pi 3 dan saya mencoba menginstal versi MongoDB yang lebih baru:

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
Crellee
sumber
1
Pertimbangkan untuk menggunakan OS 64-bit sebagai gantinya. Raspbian jauh ketinggalan zaman; Fedora 64-bit sudah tersedia untuk RPi3 .
Michael Hampton

Jawaban:

19

Apakah mungkin untuk menginstal program 64 bit pada OS 32 bit dengan prosesor 64 bit?

Pada prinsipnya ya, tetapi prosesor dan OS harus mendukungnya.

Pada ARMv8, kernel 32-bit (Aarch32) tidak dapat menjalankan proses 64-bit (Aarch64). Ini adalah batasan prosesor.

Ada prosesor lain yang tidak memiliki batasan ini, misalnya dimungkinkan untuk menjalankan proses x86_64 di atas kernel x86_32 pada prosesor x86_64, tetapi beberapa kernel mendukungnya, mungkin karena itu terbatas utilitas (kebanyakan, Anda menyimpan bit RAM di kernel dengan membuatnya 32-bit). Linux tidak mendukungnya, tetapi Solaris mendukungnya.

Anda dapat mempertahankan OS 32-bit yang ada jika menjalankan kernel 64-bit . Kernel Aarch64 Linux dapat menjalankan proses Aarch32. Raspbian tidak mendukung hal ini, jadi Anda harus mempertahankan OS 32-bit dan 64-bit. Anda dapat menggunakan salah satu sebagai OS utama (yaitu yang menjalankan init dan layanan sistem) dan yang lainnya untuk menjalankan program tertentu menggunakan chroot. Lihat Bagaimana cara menjalankan program 32-bit pada Debian / Ubuntu 64-bit? untuk pendekatan praktis.

Perhatikan bahwa Anda harus menginstal semua perpustakaan yang diperlukan oleh program 64-bit. Setiap proses yang diberikan harus seluruhnya 32-bit atau 64-bit sepenuhnya, sehingga Anda tidak dapat menggunakan perpustakaan 32-bit dalam 64-bit yang dapat dieksekusi.

Kecuali Anda memiliki alasan kuat untuk mempertahankan sistem 32-bit, jika Anda perlu menjalankan 64-bit yang dapat dieksekusi, akan lebih mudah untuk menginstal sistem 64-bit.

Perhatikan bahwa satu-satunya hal yang dapat dilakukan oleh program 64-bit tetapi program 32-bit tidak dapat menangani lebih dari sekitar 3GB memori virtual, yang merupakan utilitas terbatas pada sistem dengan 1GB RAM. Anda mungkin mendapatkan manfaat kinerja dari register ekstra yang lebih besar, tetapi Anda juga akan kehilangan kinerja dari akses memori tambahan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
3
@Wildcard Singkatnya, pada waktu tertentu, prosesor dalam mode 32-bit ("Aarch32 eksekusi state") dan mengharapkan instruksi Aarch32, atau dalam mode 64-bit mengharapkan instruksi Aarch64. Satu-satunya cara untuk beralih mode adalah beralih antara proses dan kernel (atau kernel dan hypervisor, atau hypervisor dan monitor). Beralih ke mode privilege lebih rendah tidak dapat beralih dari 32-bit ke 64-bit, dan beralih ke mode privilege lebih tinggi selalu mengembalikan mode sebelumnya. Jadi tidak mungkin untuk mengatur agar kode 32-bit berjalan pada hak istimewa yang lebih tinggi daripada kode 64-bit.
Gilles 'SO- stop being evil'
2
@Wildcard (lanjutan) Agaknya alasan pembatasan ini adalah bahwa ada cukup banyak status prosesor khusus Aarch64 dan kode Aarch32 tidak dapat diakses. Sebagai contoh, kernel Aarch32 tidak akan dapat menyimpan register dari proses Aarch64.
Gilles 'SO- stop being evil'
2
@crellee, Gilles: Anda tidak perlu melihat OS eksotis untuk menemukan contoh kernel 32-bit dengan userlands 64-bit. Kernel Mac OS X 10.4 "Tiger", 10.5 "Leopard" dan 10.6 "Snow Leopard" yang sangat populer dikirimkan dalam konfigurasi K32 untuk hampir semua Mac, kecuali untuk beberapa mesin server yang diizinkan untuk mem-boot K64 Snow Leopard , tetapi semua mereka mampu menjalankan proses userland 64-bit (dengan semakin sedikit pembatasan).
Iwillnotexist Idonotexist
3
@Serge: Apa yang Anda jelaskan berlaku untuk 286 -> 386: Anda dapat menggunakan ukuran operan 32-bit dalam mode real 16-bit dengan awalan, di mana ukuran operan default adalah 16. Tetapi Intel bahkan tidak mengembangkan x86-64; itu adalah AMD (itulah sebabnya masih kadang-kadang disebut AMD64). Dan tidak, Anda tidak dapat menggunakan ukuran operan 64-bit dalam mode 32-bit, sama sekali. Awalan REX menggunakan kembali opcode satu-byte inc/ decregister ( 0x40 .. 0x4F). Dalam mode panjang (mode 64-bit), ukuran operan default adalah 32, tetapi ukuran alamat default adalah 64.
Peter Cordes
2
@Wildcard: IDK jika compat-mode kernel / long-mode userspace adalah pertimbangan desain sama sekali. Untuk menyimpan status register integer untuk sakelar konteks, Solaris (dan OS X) harus masih dalam mode lama untuk mengakses r8-r15, dan bagian atas rax-rsi. IDK jika xsave/ xrstordalam mode compat dapat menyimpan status vektor penuh, baik. Jadi itu jelas tidak baik didukung atau eksplisit dipenuhi. Mungkin titik entri kernel berjalan dalam mode 64-bit (panjang), dan beralih ke mode 32-bit (compat) sebelum melompat ke seluruh kernel. (sakelar mode x86 hanya membutuhkan a far jmpdan tidak memengaruhi regs.)
Peter Cordes
5

Pada beberapa arsitektur, ya. Tetapi tidak pada ARM atau x86.

Anda bisa menggunakan QEMU untuk mengemulasi sistem 64-bit, tetapi Anda tidak mau.

Ignacio Vazquez-Abrams
sumber
Apakah bencana jika menggunakan emulator seperti QEMU untuk menginstal dan menjalankan database mongo?
crellee
Akan sangat, sangat lambat. Dan tidak sepadan, karena RPi3 hanya memiliki 1GB RAM. Pertimbangkan untuk membangun paket 32-bit sebagai gantinya.
Ignacio Vazquez-Abrams
2
Anda dapat menjalankan program 64-bit di atas kernel 32-bit pada x86 jika kernel mendukungnya. Linux tidak, tetapi Solaris melakukannya. Di lengan itu tidak mungkin.
Gilles 'SO- stop being evil'
@ IgnacioVazquez-Abrams Cobalah ini. Ini lambat, tetapi tidak serempak. Alasan utama adalah bahwa qemu melakukan emulasi cpu hanya di ruang pengguna, panggilan kernel (yaitu io waktu tunggu) tetap sama. Pada sistem rumah, saya suka menggunakan binari lengan atau mips untuk beberapa alat, hanya untuk bersenang-senang :-) Atau, kadang-kadang, jika tidak ada beban cpu yang sangat besar, beberapa alat yang sangat kritis terhadap keamanan, tetapi bukan alat intensif cpu dapat menggunakan beberapa arsitektur eksotis, untuk mengurangi kemungkinan serangan buffer overrun.
peterh
4

Tingkatkan hanya kernel Anda menjadi 64-bit, sehingga Anda dapat menjalankan binari 64-bit. Pada dasarnya, ini akan menjalankan seluruh distribusi Anda dalam mode compat 32-bit, dan mongodb 64-bit Anda hanya akan menjadi mode normal.

Tapi itu tidak pantas harganya. Lebih baik untuk mengganti mongodb Anda ke 32 bit. Namun, dalam hal ini ada batasan, bahwa database Anda tidak boleh lebih besar dari 2GB, karena secara langsung memetakan semuanya dalam memori virtual. Jika db Anda lebih besar, hanya pembaruan kernel yang tersisa. (Terima kasih @duskwuff ekstensi!)

Btw, jika db Anda tidak ingin beban yang sangat besar, atau Anda dapat menggunakan beberapa solusi caching sebelumnya (misalnya: yang lain, tetapi 32bit mongo), maka emulasi cpu dapat bekerja. Untuk itu, mulailah googling untuk "qemu qemu-system-x86_64". Meskipun solusi seperti itu mungkin memiliki kebutuhan kerja yang tidak layak dan dapat dianggap aneh di lingkungan yang produktif.

Di tempat Anda, saya akan menggunakan 32 bit mongo jika itu untuk db saya cukup, atau kernel 64 bit jika tidak.

peterh - Pasang kembali Monica
sumber
Masuk akal, tetapi bagaimana Anda mengubah mongodb Anda ke 32bit?
crellee
@rellee apt-get install mongodb:i386atau yang serupa?
peterh
yang akan mengembalikan kesalahan 'Tidak dapat menemukan paket mongodb: i386'
crellee
1
Menjalankan MongoDB 32-bit adalah ide yang buruk. Basis data dipetakan dalam memori, jadi menjalankannya pada sistem 32-bit membatasi Anda untuk data <2GB.
duskwuff -inactive-
Ya, dan Anda terbatas pada versi: 2.4.14, yang memiliki banyak batasan.
crellee
3

Saya akan mengatakan itu bukan tidak mungkin tetapi sangat sulit untuk dikelola. Karena OS 32bit biasanya dikemas dengan (dan menerima) 32bit hanya binari dan pustaka, Anda harus mengubah sistem untuk membuatnya bekerja dengan 64bits.

Masalah utama yang akan Anda hadapi dengan RPI3 adalah kurangnya kernel 64bits (setidaknya dengan raspbian).

Singkat cerita: gunakan binari 32 bit dan Anda akan baik-baik saja.

EDIT:

Jika Anda ingin menggunakan kernel 64bits, Anda harus menginstal distro yang mendukung arsitektur ARM64. Anda harus melihat ArchLinux ARM (di sini ), tetapi itu tidak sepenuhnya didukung.

Informasi yang Anda cari ada di bagian bawah tab instalasi.

Anda juga dapat melihat port debian resmi , namun masih ada masalah besar dengan port RPI3, jadi terserah Anda untuk memutuskan apakah itu sepadan dengan masalahnya


sumber
Masalahnya adalah bahwa CPU dimulai (oleh kernel) dalam mode 32-bit, sehingga terlihat seperti mesin 32-bit yang lama. Registrasi dan instruksi 64-bit tidak tersedia.
Johan Myréen
1
Benar, itulah sebabnya Anda membutuhkan kernel 64-bit (yang disebutkan Thomas).
Stephen Kitt
Terima kasih atas penjelasannya. Jadi solusi bagi saya adalah menginstal OS lain di RPI3 saya?
crellee
Saya baru saja memperbarui jawaban saya.
@ Thomas, beberapa distro mendukung operasi gabungan 32- / 64-bit, dimulai dengan varian 32-bit. Debian adalah salah satu contoh, setidaknya pada x86: Anda dapat menginstal i386varian, dan itu termasuk kernel 64-bit, yang memungkinkan pustaka dan binari 64-bit untuk diinstal juga. Dukungan ARM di Debian tidak mengizinkan ini pada sistem ARM (tetapi Anda dapat menginstal gabungan arm64dan armhf, jika Anda mulai dengan arm64).
Stephen Kitt
1

Saya telah menggunakan kernel 64bit dengan sistem 32bit cukup lama (itu adalah prasyarat minimum untuk menjalankan executable 64bit secara native, ditambah semua pustaka 64bit yang diperlukan). Saya tidak akan merekomendasikan itu. Apa yang akhirnya membuat saya meng-upgrade ke sistem 64bit grosir adalah kesadaran bahwa header ALSA, khususnya yang berkaitan dengan panggilan Midi ioctl, bukan ukuran agnostik, yang berarti bahwa hal-hal yang dikompilasi dalam mode 32bit tidak akan beroperasi dengan baik dengan kernel 64bit.

Tentu saja ini dapat dianggap sebagai bug yang perlu diperbaiki, tetapi laju pengembangan ALSA semuanya membeku dan saya tidak bisa menunggu beberapa tahun untuk dukungan platform campuran untuk diperbaiki (dan dengan cara non-biner yang kompatibel untuk non-campuran dieksekusi) ketika minat pada platform campuran menyusut cepat pula.

Untuk beberapa aplikasi, hal-hal berfungsi dalam mode campuran (ternyata sangat banyak sebenarnya), tetapi jika Anda melakukan lebih dari pembagian dasar interfacing ke kernel, bahkan melalui perpustakaan eksternal, itu hanya terlalu optimis.


sumber