Nhân 64 bit, nhưng tất cả các quy trình chạy thực thi ELF 32 bit, làm thế nào đây?


9

Đầu ra từ uname:

root@debian:~ # uname -a
Linux 5asnb 2.6.32-5-amd64 #1 SMP Mon Jun 13 05:49:32 UTC 2011 x86_64 GNU/Linux

Tuy nhiên, /sbin/inittệp thực thi hiển thị là 32 bit:

root@debian:~ # file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

Các khía cạnh khác của hệ thống dường như cũng mâu thuẫn với mọi thứ:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32

Câu trả lời:


13

Hạt nhân 64 bit có thể được cài đặt trên Debian 32bit. Bạn có thể thấy rằng hạt nhân amd64 có sẵn cho Debian 32 bit trên trang gói của nó . Điều này có thể được sử dụng thay thế cho việc sử dụng hạt nhân hỗ trợ PAE để hỗ trợ hơn 4G tổng RAM. Lưu ý rằng các tệp nhị phân 32 bit vẫn không thể truy cập nhiều hơn khoảng 3G RAM cho mỗi quy trình.


cám ơn! câu trả lời của bạn rõ ràng như một quả cầu pha lê ~: D Chưa bao giờ nhận thấy Debian đối xử với gói kernel như cách này trước đây.
kiiwii

1
Điều đó không đúng: Các chương trình 32 bit có thể sử dụng toàn bộ 4Gio không gian địa chỉ ảo của chúng khi chạy trên kernel 64 bit (trừ khi chúng đang chạy với tính cách ADDR_LIMIT_3GB).
ysdx

@ysdx Vì vậy, giới hạn ở mức 2GB là một điều cụ thể của Windows và địa chỉ trên 0x80000000 sẽ được phép trong không gian người dùng 32 bit?
Paul Stelian

1
@PaulStelian, Trên Windows 32 bit, theo mặc định, bạn bị giới hạn ở mức 2GB bộ nhớ ảo thấp nhất để tương thích với retro (Tôi nghĩ rằng một số chương trình được sử dụng để dự trữ con trỏ tới 2GB bộ nhớ ảo cao nhất cho mục đích đặc biệt). Bạn có thể đặt cờ LARGEADDRESSAWARE trong tệp thực thi của mình ( docs.microsoft.com/fr-fr/cpp/build/reference/ trộm ) để chọn quyền truy cập vào toàn bộ 4GB bộ nhớ ảo.
ysdx

15

Tất cả các bộ xử lý hỗ trợ tập lệnh x64 (còn được gọi là x86_64 hoặc amd64) cũng hỗ trợ tập lệnh x86 (còn được gọi là i386 hoặc i686, là các phiên bản cụ thể của x86). Điều tương tự cũng xảy ra với ARM A64 (bộ hướng dẫn 64 bit mới xuất hiện trong ARMv8) và A32 (tên của bộ hướng dẫn 32-bit classic classic), cho SPARC64SPARC , và tôi tin cho MIPS64 MIPS . Vì vậy, trên tất cả các họ kiến ​​trúc này, nếu bộ xử lý có thể chạy mã 64 bit, thì nó cũng có thể chạy mã 32 bit.

Nhân Linux hỗ trợ chạy mã vùng người dùng 32 bit với nhân 64 bit (tôi nghĩ rằng trên tất cả các họ kiến ​​trúc được đề cập ở trên). Hạt nhân phải đồng nhất (tất cả 64 bit hoặc tất cả 32 bit) và mỗi quy trình phải đồng nhất, nhưng bạn có thể có hỗn hợp các quy trình 32 bit và 64 bit trên nhân 64 bit. Điều ngược lại là không thể: với kernel 32 bit, bạn không thể chạy các tiến trình 64 bit.

Đây là một lựa chọn thiết kế trong Linux, được thúc đẩy bởi mong muốn chạy các tệp nhị phân 32 bit hiện có trên các bản cài đặt 64 bit. Các biến thể Unix khác đã đưa ra các lựa chọn khác nhau: Solaris có thể chạy các chương trình 64 bit trên kernel 32 bit cũng như cách khác, trong khi OpenBSD không thể chạy các chương trình 32 bit trên kernel 64 bit.

Bạn có thể nhận được thông tin về CPU trong /proc/cpuinfo. Nếu CPU x86 của bạn có lmcờ, đó là CPU 64 bit.

Theo mặc định, uname -mhoặc archhiển thị kiến ​​trúc mà kernel đã được biên dịch. Linux có thể thiết lập tính cách cá nhân trên mạng của một quá trình (với personality) cuộc gọi hệ thống. Bạn có thể chạy một quy trình con trong một tính cách khác với setarchlệnh; setarch i686 someprogramhoặc linux32 someprogramchạy chương trình đã chỉ định trong môi trường uname -mtrả về i686trong khi setarch amd64 someprogramhoặc linux64 someprogramchạy chương trình đã chỉ định trong môi trường uname -mtrả vềamd64 .

file /sbin/init cho bạn biết kiến ​​trúc nào init chương trình được biên dịch cho. Mặc dù có thể kết hợp các tệp thực thi 32 bit và 64 bit trong một bản cài đặt, nhưng thông thường tất cả các chương trình HĐH cốt lõi đều có cùng kiến ​​trúc, bởi vì nó dễ quản lý hơn rất nhiều.

$HOSTYPE là một biến bash và cho bạn biết kiến ​​trúc nào bash chương trình được biên dịch cho.

getconf LONG_BITcho bạn biết liệu trình biên dịch C mặc định được thiết lập để biên dịch các chương trình 32 bit hay 64 bit. Một thử nghiệm chính xác hơn là biên dịch a và chạy một chương trình in sizeof(void*)hoặc sizeof(size_t)- gọi getconfchỉ có thể cung cấp thông tin về những gì getconfđược cho là trình biên dịch mặc định.


1
Thật vậy, Solaris 32 bit có chuyển sang chế độ 64 bit để chuyển sang quá trình 64 bit và sau đó quay lại không? Điều này phải có một chi phí rất lớn và không có ý nghĩa gì, vì khi đó kernel có hiệu quả 64 bit.
Ruslan

1
@Ruslan Tại sao nó có một chi phí rất lớn? Chuyển đổi chế độ trên một công tắc ngữ cảnh không tốn nhiều chi phí (nếu có bất cứ điều gì, tôi không biết x86 ở mức thấp đủ tốt). Hạt nhân vẫn giữ nguyên 32 bit: địa chỉ ảo 32 bit cho ánh xạ kernel, sử dụng tập lệnh 32 bit.
Gilles 'SO- đừng trở nên xấu xa'

1
Hạt nhân phải duy trì một số cấu trúc dữ liệu cụ thể 64 bit để hỗ trợ các ứng dụng 64 bit, ít nhất là các bảng trang nhận biết 64 bit. Điều này làm cho nó không thực sự là một hạt nhân 32 bit. Tôi đã không cố gắng để thực sự đi sâu vào vòm amd64, nhưng tôi nghĩ việc tắt hỗ trợ 64 bit sẽ có chi phí đáng kể tương phản với việc sử dụng chế độ tương thích được thiết kế đặc biệt.
Ruslan

1
@Ruslan Chỉ có các bảng trang nhận biết 64 bit và thực sự cần thiết, và đó là một chi phí nhỏ. Mọi thứ khác có thể tránh được với thiết kế kernel đúng. Tôi chưa bao giờ đào sâu vào nhân Solaris, tôi cho rằng họ đã sắp xếp để làm cho nó đủ linh hoạt (họ đã có kinh nghiệm trước với SPARC64).
Gilles 'SO- ngừng trở nên xấu xa'
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.