Cài đặt chương trình 64 bit trên HĐH 32 bit với bộ xử lý 64 bit


8

Tôi tò mò. Có thể cài đặt chương trình 64 bit trên HĐH 32 bit với bộ xử lý 64 bit không?

Tôi đang chạy Linux trên raspberry pi 3 và tôi cố gắng cài đặt phiên bản MongoDB mới hơn:

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

1
Thay vào đó hãy xem xét sử dụng HĐH 64 bit. Raspbian là cách đằng sau thời đại; Fedora 64 bit đã có sẵn cho RPi3 .
Michael Hampton

Câu trả lời:


19

Có thể cài đặt chương trình 64 bit trên HĐH 32 bit với bộ xử lý 64 bit không?

Về nguyên tắc có, nhưng bộ xử lý và HĐH phải hỗ trợ nó.

Trên ARMv8, hạt nhân 32 bit (Aarch32) không thể chạy các quy trình 64 bit (Aarch64). Đây là một hạn chế của bộ xử lý.

Có những bộ xử lý khác không có giới hạn này, ví dụ, có thể chạy các quy trình x86_64 trên hạt nhân x86_32 trên bộ xử lý x86_64, nhưng có lẽ ít hạt nhân hỗ trợ nó, có lẽ vì tiện ích hạn chế (chủ yếu là bạn lưu bit RAM trong kernel bằng cách làm cho nó 32 bit). Linux không hỗ trợ nó, nhưng Solaris thì có.

Bạn có thể giữ HĐH 32 bit hiện tại nếu chạy kernel 64 bit . Một nhân Linux Aarch64 có thể chạy các quy trình Aarch32. Raspbian không hỗ trợ điều này ngay lập tức, vì vậy bạn cần duy trì cả HĐH 32 bit và HĐH 64 bit. Bạn có thể sử dụng một trong hai hệ điều hành chính (tức là hệ điều hành chạy các dịch vụ init và hệ thống) và hệ điều hành khác để chạy một chương trình cụ thể bằng chroot. Xem Làm cách nào để chạy chương trình 32 bit trên Debian / Ubuntu 64 bit? cho một cách tiếp cận thực tế.

Lưu ý rằng bạn sẽ cần cài đặt tất cả các thư viện mà chương trình 64 bit yêu cầu. Bất kỳ quy trình nhất định nào cũng phải là 32 bit hoặc toàn bộ 64 bit, vì vậy bạn không thể sử dụng thư viện 32 bit trong tệp thực thi 64 bit.

Trừ khi bạn có lý do mạnh mẽ để giữ hệ thống 32 bit, nếu bạn cần chạy tệp thực thi 64 bit, việc cài đặt hệ thống 64 bit sẽ dễ dàng hơn.

Lưu ý rằng điều duy nhất mà các chương trình 64 bit có thể làm được nhưng các chương trình 32 bit không thể giải quyết được nhiều hơn khoảng 3 GB bộ nhớ ảo, đây là tiện ích hạn chế trên hệ thống có RAM 1GB. Bạn có thể nhận được lợi ích hiệu suất từ ​​các thanh ghi bổ sung, lớn hơn, nhưng bạn cũng sẽ mất hiệu suất từ ​​các truy cập bộ nhớ thêm.


3
@Wildcard Tóm lại, tại bất kỳ thời điểm nào, bộ xử lý đều ở chế độ 32 bit (trạng thái thực thi của Aarch32) và mong đợi các lệnh Aarch32 hoặc ở chế độ 64 bit mong đợi các lệnh Aarch64. Cách duy nhất để chuyển đổi chế độ là chuyển đổi giữa tiến trình và kernel (hoặc kernel và hypanneror, hoặc hypanneror và màn hình). Chuyển sang chế độ đặc quyền thấp hơn không thể chuyển từ chế độ 32 bit sang 64 bit và chuyển sang chế độ đặc quyền cao hơn luôn khôi phục chế độ trước đó. Vì vậy, không thể sắp xếp để có mã 32 bit chạy ở đặc quyền cao hơn mã 64 bit.
Gilles 'SO- ngừng trở nên xấu xa'

2
@Wildcard (tt) Có lẽ lý do cho sự hạn chế này là có khá nhiều trạng thái bộ xử lý dành riêng cho Aarch64 và mã Aarch32 không thể truy cập. Ví dụ, nhân Aarch32 sẽ không thể lưu các thanh ghi của quy trình Aarch64.
Gilles 'SO- ngừng trở nên xấu xa'

2
@crellee, Gilles: Bạn không cần phải xem các HĐH kỳ lạ để tìm các ví dụ về hạt nhân 32 bit với vùng người dùng 64 bit. Các hạt nhân Mac OS X 10,4 "Tiger", 10,5 "Leopard" và 10,6 "Snow Leopard" được vận chuyển trong cấu hình K32 cho hầu hết tất cả các máy Mac, tiết kiệm cho một số máy chủ được phép khởi động K64 của Snow Leopard , nhưng tất cả chúng có khả năng chạy các quy trình người dùng 64 bit (với các hạn chế dần dần ít hơn).
Idillotexist Idonotexist

3
@Serge: Những gì bạn mô tả là đúng với 286 -> 386: bạn có thể sử dụng kích thước toán hạng 32 bit ở chế độ thực 16 bit với tiền tố, trong đó kích thước toán hạng mặc định là 16. Nhưng Intel thậm chí không phát triển x86-64; đó là AMD (đó là lý do tại sao đôi khi nó vẫn được gọi là AMD64). Và không, bạn hoàn toàn không thể sử dụng kích thước toán hạng 64 bit ở chế độ 32 bit. Tiền tố REX tái sử dụng opcodes một byte inc/ decthanh ghi ( 0x40 .. 0x4F). Ở chế độ dài (chế độ 64 bit), kích thước toán hạng mặc định là 32, nhưng kích thước địa chỉ mặc định là 64.
Peter Cordes

2
@Wildcard: IDK nếu không gian người dùng chế độ compat / chế độ dài là một sự cân nhắc thiết kế. Để lưu trạng thái thanh ghi số nguyên cho các chuyển đổi ngữ cảnh, Solaris (và OS X) vẫn phải ở chế độ dài để truy cập r8-r15 và nửa trên của rax-rsi. IDK nếu xsave/ xrstortrong chế độ compat có thể lưu trạng thái vectơ đầy đủ. Vì vậy, nó chắc chắn không được hỗ trợ tốt hoặc phục vụ rõ ràng cho. Có lẽ các điểm nhập kernel chạy ở chế độ 64 bit (dài) và chuyển sang chế độ 32 bit (compat) trước khi chuyển sang phần còn lại của kernel. (công tắc chế độ x86 chỉ mất một far jmpvà không ảnh hưởng đến regs.)
Peter Cordes

5

Trên một số kiến ​​trúc, có. Nhưng không phải trên ARM hoặc x86.

Bạn có thể sử dụng QEMU để mô phỏng hệ thống 64 bit, nhưng bạn không muốn.


Sẽ là một thảm họa khi sử dụng một trình giả lập như QEMU để cài đặt và chạy cơ sở dữ liệu mongo?
crellee

Nó sẽ rất, rất chậm. Và không đáng, vì RPi3 chỉ có 1GB RAM. Thay vào đó, hãy xem xét xây dựng gói 32 bit.
Ignacio Vazquez-Abrams

2
Bạn có thể chạy chương trình 64 bit bên trên kernel 32 bit trên x86 nếu kernel hỗ trợ. Linux thì không, nhưng Solaris thì có. Trên cánh tay điều đó là không thể.
Gilles 'SO- ngừng trở nên xấu xa'

@ IgnacioVazquez-Abrams Hãy thử điều này. Đó là chậm, nhưng không phải là thảm họa. Lý do chính là qemu chỉ mô phỏng cpu trong không gian người dùng, các lệnh gọi kernel (tức là thời gian chờ io) vẫn giữ nguyên. Trên các hệ thống gia đình, tôi thích sử dụng nhị phân arm hoặc mips cho một số công cụ, chỉ để giải trí :-) Hoặc, đôi khi, nếu không có tải cpu rất lớn, một số công cụ quan trọng về bảo mật, nhưng không sử dụng cpu có thể sử dụng một số kiến trúc kỳ lạ, để giảm xác suất tấn công tràn bộ đệm.
peterh - Phục hồi Monica

4

Chỉ nâng cấp kernel của bạn lên 64 bit, do đó bạn sẽ có thể chạy các tệp nhị phân 64 bit. Về cơ bản, nó sẽ chạy toàn bộ phân phối của bạn ở chế độ compat 32 bit và mongodb 64 bit duy nhất của bạn sẽ là chế độ bình thường.

Nhưng nó không xứng đáng với giá của nó. Tốt hơn để chuyển mongodb của bạn thành 32 bit. Tuy nhiên, trong trường hợp này có một hạn chế, cơ sở dữ liệu của bạn có thể lớn hơn 2GB, vì nó trực tiếp ánh xạ toàn bộ điều trong bộ nhớ ảo. Nếu db của bạn lớn hơn, chỉ còn nâng cấp kernel. (Cảm ơn @duskwuff phần mở rộng!)

Btw, nếu db của bạn không muốn tải rất lớn hoặc bạn có thể sử dụng một số giải pháp bộ đệm trước nó (ví dụ: khác, nhưng mongo 32 bit), thì mô phỏng cpu có thể hoạt động. Đối với điều đó, bắt đầu một googling cho "qemu qemu-system-x86_64". Mặc dù một giải pháp như vậy có thể sẽ có nhu cầu công việc không khả thi và nó có thể được coi là kỳ lạ trong môi trường sản xuất.

Ở vị trí của bạn, tôi sẽ sử dụng mongo 32 bit nếu nó đủ cho db của tôi hoặc kernel 64 bit nếu không.


Có ý nghĩa, nhưng làm thế nào bạn sẽ chuyển mongodb của bạn thành 32 bit?
crellee

@crellee apt-get install mongodb:i386hay một số tương tự?
peterh - Phục hồi Monica

sẽ trả về lỗi 'Không thể xác định vị trí gói mongodb: i386'
crellee

1
Chạy MongoDB 32 bit là một ý tưởng tồi. Cơ sở dữ liệu được ánh xạ bộ nhớ, do đó, việc chạy nó trên hệ thống 32 bit giới hạn bạn <2GB dữ liệu.
duskwuff -inactive- 11/12/17

Có, và bạn bị giới hạn ở phiên bản: 2.4,14, có rất nhiều hạn chế.
crellee

3

Tôi sẽ nói nó không phải là không thể nhưng thực sự khó quản lý. Vì HĐH 32 bit thường được đóng gói với (và chỉ chấp nhận) 32 bit chỉ nhị phân và thư viện, bạn cần tinh chỉnh rất nhiều hệ thống để làm cho nó hoạt động với 64 bit.

Vấn đề chính mà bạn gặp phải với RPI3 là thiếu kernel 64 bit (ít nhất là với raspbian).

Câu chuyện dài: sử dụng nhị phân 32 bit và bạn sẽ ổn.

BIÊN TẬP :

Nếu bạn muốn sử dụng kernel 64 bit, bạn sẽ cần cài đặt một bản phân phối hỗ trợ kiến ​​trúc ARM64. Bạn nên xem ArchLinux ARM ( tại đây ), nhưng nó không được hỗ trợ đầy đủ.

Thông tin bạn đang tìm kiếm nằm ở cuối tab cài đặt.

Bạn cũng có thể xem qua một cổng debian chính thức , tuy nhiên vẫn còn vấn đề lớn với cổng RPI3, do đó, bạn phải quyết định xem nó có đáng để gặp rắc rối không


Vấn đề là CPU được khởi động (bằng kernel) ở chế độ 32 bit, do đó, nó trông giống như một máy 32 bit cũ. Các thanh ghi và hướng dẫn 64 bit không khả dụng.
Johan Myréen

1
Đúng vậy, đó là lý do tại sao bạn cần một hạt nhân 64 bit (mà Thomas đã đề cập).
Stephen Kitt

Cảm ơn lời giải thích tốt đẹp. Vậy giải pháp cho tôi là cài đặt một HĐH khác trên RPI3 của tôi?
crellee

Tôi chỉ cập nhật câu trả lời của tôi.

@Thomas, một số distro hỗ trợ hoạt động 32- / 64 bit kết hợp, bắt đầu với biến thể 32 bit. Debian là một ví dụ, ít nhất là trên x86: bạn có thể cài đặt i386biến thể và bao gồm kernel 64 bit, cho phép các thư viện và nhị phân 64 bit cũng được cài đặt. Hỗ trợ ARM trong Debian không cho phép điều này trên các hệ thống ARM (nhưng bạn có thể cài đặt kết hợp arm64armhf, nếu bạn bắt đầu với arm64).
Stephen Kitt

1

Tôi đã sử dụng kernel 64 bit với hệ thống 32 bit trong một thời gian dài (đó là điều kiện tiên quyết tối thiểu để chạy các tệp thực thi 64 bit, cộng với tất cả các thư viện 64 bit cần thiết). Tôi sẽ không khuyên bạn nên nó. Điều cuối cùng khiến tôi nâng cấp lên hệ thống bán buôn 64 bit là nhận ra rằng các tiêu đề ALSA, đặc biệt liên quan đến các cuộc gọi Midi ioctl, không phải là kích thước bất khả tri, có nghĩa là những thứ được biên dịch ở chế độ 32 bit sẽ không tương thích tốt với hạt nhân 64 bit.

Tất nhiên đây có thể được coi là một lỗi đáng sửa, nhưng tốc độ phát triển ALSA hoàn toàn bị đóng băng và tôi không thể chờ vài năm để hỗ trợ nền tảng hỗn hợp được sửa chữa (và theo cách không tương thích nhị phân cho không trộn lẫn thực thi) khi quan tâm đến các nền tảng hỗn hợp đang suy giảm nhanh chóng.

Đối với một số ứng dụng, công cụ hoạt động ở chế độ hỗn hợp (thực sự đáng ngạc nhiên), nhưng nếu bạn đang làm nhiều hơn phần chia sẻ cơ bản của giao diện với kernel, thậm chí thông qua các thư viện bên ngoài, thì đó chỉ là quá mức.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.