64-bit çekirdek, ancak tüm 32-bit ELF yürütülebilir çalışan süreçler, bu nasıl?


9

Çıktı 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

Ancak /sbin/inityürütülebilir 32-bit olarak görünür:

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

Sistemin diğer yönleri de çelişiyor gibi görünüyor:

root@debian:~ # echo $HOSTTYPE
i486

root@debian:~ # getconf LONG_BIT
32

Yanıtlar:


13

64bit çekirdek Debian 32bit'e kurulabilir. Amd64 çekirdeğinin 32bit Debian için paket sayfasında mevcut olduğunu görebilirsiniz . Bu, toplam 4G'den fazla RAM'i desteklemek için PAE özellikli bir çekirdek kullanmaya alternatif olarak kullanılabilir. 32bit ikili dosyaların işlem başına kabaca 3G RAM'den fazlasına erişemediğini unutmayın.


Teşekkür! cevaplarınız bir kristal küre kadar açıktır ~: D Debian'ın çekirdek paketini daha önce bu şekilde ele almamıştı.
kiiwii

1
Bu doğru değil: 32 bit programlar 64 bit çekirdeğe çalışırken (ADDR_LIMIT_3GB kişiliğiyle çalışmadığı sürece) 4Gio'yu sanal adres alanının tamamını kullanabilir.
ysdx

@ysdx Peki 2GB ile sınırlamak Windows'a özgü bir şeydir ve 0x80000000 üzerindeki adreslere 32 bit kullanıcı alanında izin verilecek mi?
Paul Stelian

1
@PaulStelian, 32 bit Windows'da, varsayılan olarak geriye dönük uyumluluk için en düşük 2GB sanal bellekle sınırlısınız (bazı programların özel amaçlı amaç için en yüksek 2GB sanal belleğe işaret ayırmak için kullanıldığını düşünüyorum). LARGEADDRESSAWARE bayrağını, yürütülebilir belleğinizde ( docs.microsoft.com/fr-fr/cpp/build/reference/… ), 4GB'lık sanal belleğin tamamına erişmeyi seçmek için ayarlayabilirsiniz .
ysdx

15

X64 yönerge kümesini destekleyen (x86_64 veya amd64 olarak da bilinir) tüm işlemciler , x86 yönerge kümesini de destekler (ayrıca x86'nın belirli sürümleri olan i386 veya i686 olarak da bilinir). Aynı için de geçerli ARM için A64 (yeni 64-bit komut ARMv8 görünen seti) ve A32 ( “klasik” 32 bit komut seti için isim) SPARC64 ve SPARC ve ben için iman MIPS64 ve MIPS . Yani tüm bu mimari ailelerde, eğer bir işlemci 64 bit kod çalıştırabilirse, 32 bit kod da çalıştırabilir.

Linux çekirdeği, 64 bit çekirdekli 32 bit kullanıcı alanı kodunu çalıştırmayı destekler (sanırım yukarıda bahsedilen tüm mimari ailelerde). Çekirdek homojen olmalıdır (tümü 64 bit veya tümü 32 bit) ve her işlem homojen olmalıdır, ancak 64 bit çekirdek üzerinde 32 bit ve 64 bit işlemlerin bir karışımına sahip olabilirsiniz. Bunun tersi mümkün değildir: 32 bit çekirdekle 64 bit işlemler çalıştıramazsınız.

Bu, Linux'ta mevcut 32 bit ikili dosyaları 64 bit kurulumlarda çalıştırma isteği ile motive edilen bir tasarım seçimidir. Diğer Unix varyantları farklı seçimler yapmıştır: Solaris, 32-bit çekirdeğinde 64-bit programları ve diğer yönde çalışabilirken, OpenBSD 64-bit çekirdeğinde 32-bit programları çalıştıramaz.

Sen alabilirsiniz CPU hakkında bilgi de /proc/cpuinfo. X86 CPU'nuzda lmbayrak varsa, 64 bit CPU'dur.

Varsayılan olarak uname -mveya archçekirdeğin derlendiği mimariyi gösterir. Linux personalitysistem çağrısıyla bir sürecin “kişiliğini” ayarlayabilir . Komutla farklı bir kişiliğe sahip bir alt işlem çalıştırabilirsiniz setarch; setarch i686 someprogramya linux32 someprogrambir ortamda belirli bir program çalıştırır nerede uname -mdöner i686iken setarch amd64 someprogramveya linux64 someprogramnerede bir ortamda belirli bir program çalıştırır uname -mdöner amd64.

file /sbin/initinitprogramın hangi mimari için derlendiğini söyler . Bir kurulumda 32 bit ve 64 bit yürütülebilir dosyaları karıştırmak mümkün olsa da, genellikle tüm temel işletim sistemi programları aynı mimariden gelir, çünkü yönetilmesi çok daha kolaydır.

$HOSTYPEbir bash değişkenidir ve bashprogramın hangi mimariyi derlediğini söyler .

getconf LONG_BITvarsayılan C derleyicisinin 32 bit veya 64 bit programları derleyecek şekilde ayarlanıp ayarlanmadığını bilmenizi sağlar. Bir daha kesin testi derlemek ve baskılar bu bir programı çalıştırmaktır sizeof(void*)veya sizeof(size_t)çağıran - getconfyalnızca ne hakkında bilgi verebilir getconfdüşündüğü varsayılan derleyici.


1
Gerçekten de, 32 bit Solaris 64 bit moda geçmek için 64 bit moduna geçiyor mu? Bunun büyük bir yükü olmalı ve sadece mantıklı değil, çünkü o zaman çekirdek etkili bir şekilde 64 bit.
Ruslan

1
@Ruslan Neden devasa bir yükü olsun ki? Bir bağlam anahtarında modları değiştirmek çok pahalıya mal olmaz (eğer bir şey varsa, x86'yı yeterince düşük bir seviyede bilmiyorum). Çekirdek 32 bit olarak kalır: Çekirdek eşlemeleri için 32 bit sanal adresler, komut kümesinin 32 bit kullanımı.
Gilles 'SO- kötü olmayı bırak'

1
Çekirdek, 64 bit uygulamaları, en az 64 bit uyumlu sayfa tablolarını desteklemek için 64 bit'e özgü bazı veri yapılarını korumalıdır. Bu gerçekten 32 bit bir çekirdek değil yapar. Gerçekten amd64 kemer içine almak için çalışmadım, ama bence 64 bit desteği kapatmak özel tasarlanmış uyumluluk modunu kullanmak yerine önemli ölçüde ek yük olacak.
Ruslan

1
@Ruslan Sadece 64-bit farkında sayfa tabloları ve gerçekten gerekli ve bu küçük bir maliyet. Doğru çekirdek tasarımı ile her şeyden kaçınılabilir. Solaris çekirdeğine hiç girmedim, yeterince esnek hale getirmek için düzenlediklerini varsayıyorum (SPARC64 ile önceden deneyime sahiplerdi).
Gilles 'SO- kötü olmayı bırak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.