it-swarm.dev

X86-64 sistemlerinde neden yalnızca 48 bit sanal adres alanı var?

Bir kitapta aşağıdakileri okudum:

32 bit işlemciler 2 ^ 32 olası adrese sahipken, mevcut 64 bit işlemciler 48 bit adres alanına sahip

Beklentim, 64 bit bir işlemci olması durumunda, adres alanının da 2 ^ 64 olması gerektiği idi. 

Yani bu sınırlamanın sebebinin ne olduğunu merak ediyordum?

66
er4z0r

Çünkü ihtiyaç duyduğu tek şey bu. 48 bit size 256 terabaytlık bir adres alanı verir. Bu çok fazla. Yakında herhangi bir zamanda bundan daha fazlasını gerektiren bir sistem görmeyeceksiniz.

Böylece CPU üreticileri kısayol aldı. Tam 64 bit adres alanı sağlayan bir komut seti kullanırlar, ancak mevcut CPU'lar sadece 48 bitin sadece altını kullanır. Alternatif, transistörleri uzun yıllar boyunca ihtiyaç duyulmayacak daha büyük bir adres alanı kullanma konusunda harcıyordu.

Dolayısıyla, 48 bit sınırına yaklaştığımızda, bu tam adres alanını işleyen CPU'ları serbest bırakmaktan ibarettir, ancak komut setinde herhangi bir değişiklik gerektirmez ve uyumluluğu bozmaz.

104
jalf

Veri yolu büyüklüğüne ve fiziksel belleğe atıfta bulunan herhangi bir cevap, OP'nin sorusu sanal adres alanı değil fiziksel adres alanı hakkında olduğu için biraz yanlıştır. Örneğin, bazı 386'larda sözde benzer sınır, her zaman tam bir 32 bit olan sanal adres alanı değil, kullanabilecekleri fiziksel bellek üzerindeki bir sınırdı. Prensip olarak, yalnızca birkaç MB fiziksel belleğe sahip olsa bile, 64 bitlik bir sanal adres alanı kullanabilirsiniz; Elbette, bunu değiştirerek veya aynı sayfayı çoğu adresle (örneğin, belirli seyrek veri işlemleri) eşlemek istediğiniz özel işler için yapabilirsiniz.

Bence asıl cevap, AMD'nin sadece ucuz olması ve hiç kimsenin umursamayacağını umduğudur, ancak alıntı yapacak referanslarım yok.

16
R..

wikipedia makalesinin :

Bir PC 4 petabayt bellek içeremez (başka bir şey yoksa mevcut bellek yongalarının boyutu nedeniyle) ancak AMD büyük sunucular, paylaşılan bellek kümeleri ve öngörülebilir gelecekte buna yaklaşabilecek diğer fiziksel adres alanı kullanımlarını ve bit fiziksel adresi, 64 bit fiziksel adresleri uygulama maliyetine neden olmamakla birlikte genişleme için yeterli alan sağlar

Yani, bu noktada tam 64 bit adresleme uygulamanın bir anlamı yoktur, çünkü böyle bir adres alanını tam olarak kullanabilecek bir sistem yapamayız - bu nedenle bugünün (ve yarının) sistemleri için pratik bir şey seçeriz.

9

Dahili yerel kayıt/işlem genişliği, harici adres veri yolu genişliğine yansımasını ihtiyaç yapmasını gerektirmez.

Yalnızca 1 megabayt RAM'e erişmesi gereken 64 bit bir işlemciniz olduğunu varsayalım. Gerekli olan tek şey 20 bitlik bir adres veriyolu. Kullanmayacağınız tüm ekstra pinlerin maliyeti ve donanım karmaşıklığını neden rahatsız etmiyorsunuz?

Motorola 68000 bu gibiydi; 32 bit dahili olarak, ancak 23 bit adres yolu (ve 16 bit veri yolu). CPU 16 megabayt RAM'e erişebiliyordu ve yerel veri tipini yüklemek için (32 bit) iki bellek erişimi (her biri 16 bit veri taşıyan) aldı.

9
user82238

Transistörleri CPU adres yoluna kaydetmekten çok daha ciddi bir neden var: Eğer adres alanının boyutunu arttırırsanız sayfa boyutunu arttırmanız, sayfa tablolarının boyutunu arttırmanız veya daha derin bir sayfa tablosu yapısına sahip olmanız gerekir daha fazla çeviri tablosu seviyesi var). Tüm bunlar, performansın zarar verdiği bir TLB hanesinin maliyetini arttırıyor. 

6
Brendan

Benim bakış açımdan, bu sayfa boyutundan kaynaklanıyor. Ve 2 ^ 9 = 512. Öyleyse 9 * 4 + 12 = 48.

6
linzuojian

Orijinal soruyu cevaplamak için: En fazla 48 Bit PA eklemeye gerek yoktu.

Sunucular en fazla belleğe ihtiyaç duyar, bu yüzden daha derine inmeye çalışalım.

1) En büyük (yaygın olarak kullanılan) sunucu yapılandırması bir 8 Soket sistemidir. 8S sistemi, tek bir düğüm oluşturmak için yüksek hızlı tutarlı bir ara bağlantıyla (veya sadece yüksek hızlı bir "veri yolu") bağlanan 8 Sunucu CPU'sundan başka bir şey değildir. Dışarıda daha büyük kümeler var ama aralarında çok az yer var, burada sık kullanılan yapılandırmalardan bahsediyoruz. Gerçek dünyada kullanımlarda, 2 Soket sisteminin en sık kullanılan sunuculardan biri olduğunu ve 8S'nin genellikle çok yüksek uç olarak kabul edildiğini unutmayın.

2) Sunucular tarafından kullanılan ana bellek türleri, byte adreslenebilir normal DRAM belleğidir (örn. DDR3/DDR4 belleği), Bellek Eşlenmiş IO - MMIO (örneğin, bir eklenti kartı tarafından kullanılan bellek) Sistemde mevcut aygıtları yapılandırmak için kullanılan Yapılandırma Alanı olarak. İlk bellek tipi genellikle en büyük olanıdır (ve bu nedenle en fazla adres bitine ihtiyaç duyar). Bazı üst düzey sunucular, sistemin gerçek yapılandırmasına bağlı olarak büyük miktarda MMIO kullanır.

3) Her bir sunucunun CPU'yu her yuvaya 16 DDR4 DIMM barındırabileceğini varsayınız. 256GB maksimum boyut DDR4 DIMM ile. (Sunucunun sürümüne bağlı olarak, soket başına bu olası DIMM sayısı 16 DIMM'den daha azdır, ancak örnek uğruna okumaya devam edin).

Böylece her soket teorik olarak 16 * 256GB = 4096GB = 4 TB olabilir .. __ Örnek 8S sistemimizde DRAM boyutu maksimum 4 * 8 = 32 TB olabilir. Bu, Bu DRAM alanını ele almak için gereken maksimum bit sayısının 45 olduğu anlamına gelir (= log2 32TB/log2 2).

Diğer bellek türlerinin (MMIO, MMCFG vb.) Ayrıntılarına girmeyeceğiz, ancak buradaki amaç, bugün mevcut olan en büyük DDR4 DIMM türlerine sahip 8 Soketli bir sistem için en "zorlu" bellek türünün olmasıdır (256 GB). DIMM'ler) yalnızca 45 bit kullanır.

48 bit'i destekleyen bir işletim sistemi için (örneğin, WS16), (48-45 =) 3 kalan bit vardır .. __ Bu, yalnızca 32TB DRAM için daha düşük 45 bit kullanırsak, hala 2 ^ 3 değerine sahip olduğumuz anlamına gelir. MMIO/MMCFG için toplam 256 TB adreslenebilir alan için kullanılabilen adreslenebilir belleğin zamanları.

Dolayısıyla, özetlemek gerekirse: 1) 48 bit Fiziksel adres, bugünün en fazla miktarda DDR4 ve aynı zamanda birçok diğer IO cihazla dolu olan "en fazla yüklü" sistemlerini desteklemek için bol miktarda bit içerir. Bu MMIO alanı gerektirir. Tam olarak 256TB. 

Bu 256 TB adres alanının (= 48 bit fiziksel adres) SATA sürücüleri gibi disk sürücüleri içermediğini, çünkü adres haritasının bir parçası olmadıklarını, sadece byte adreslenebilir belleği ve işletim sistemine maruz kaldıklarını unutmayın.

2) CPU donanımı, sunucunun üretimine bağlı olarak 46, 48 veya> 48 bit uygulamayı seçebilir. Ancak bir başka önemli faktör de işletim sisteminin kaç bit tanıdığıdır .. WS16 bugün 48 bit Fiziksel adresleri (= 256 TB) destekliyor. 

Bunun kullanıcı için anlamı, birinin 48 bit adreslemeyi destekleyebilen büyük, ultra modern bir sunucu işlemcisi olmasına rağmen, yalnızca 48 bit PA'yı destekleyen bir işletim sistemi kullanıyorsanız, yalnızca 256 TB'den yararlanabilirsiniz. . 

3) Sonuç olarak, daha yüksek adres bitlerinden (= daha fazla bellek kapasitesi) faydalanmanın iki ana faktörü vardır.

a) CPU HW'nuz kaç bit destekliyor? (Bu, Intel CPU'larda CPUID talimatı ile belirlenebilir).

b) Hangi işletim sistemi sürümünü kullanıyorsunuz ve kaç tane PA parçasını tanıdığını/desteklediğini.

En sonunda (a, b), sisteminizin faydalanabileceği adreslenebilir alan miktarını belirler.

Bu cevabı, diğer cevapları ayrıntılı olarak incelemeden yazdım. Ayrıca, MMIO, MMCFG nüansları ve adres haritası yapımının tamamı hakkında ayrıntılı bilgi vermedim. Ama umarım bu yardımcı olur.

Teşekkürler, Anand K Enamandram, Sunucu Platformu Mimarı.

2

En azından Intel 64 ile yalnızca 64 bitlik VA düşük dereceli 48 bitlerin kullanıldığı doğru değildir. En üstteki 16 bit, bir nevi kullanılır.

Bölüm 3.3.7.1 Intel® 64 ve IA-32 Architectures Yazılım Geliştirici El Kitabı'ndaki Canonical Adresleme:

bir kanonik adresin, 63 ile 48 arasındaki bitlerin sıfırlara veya sıfırlara ayarlanmış olması gerekir (bit 47'nin sıfır veya bir olmasına bağlı olarak)

Öyleyse, 47'den 63'e kadar olan bitler, 1 veya tümü 0 gibi bir süper bit oluşturur. Bir adres kurallı biçimde değilse, uygulama hata vermelidir.

AArch64'te bu farklı. ARMv8 Komut Seti Genel Bakış 'a göre, 49 bit VA. 

AArch64 bellek çeviri sistemi 49 bitlik bir sanal adresi (çeviri tablosu başına 48 bit) destekler. Sanal adresler 49 bitten itibaren işaretlenir ve 64 bitlik bir işaretçide saklanır. İsteğe bağlı olarak, bir sistem kaydının kontrolü altında, 64 bitlik bir işaretçinin en önemli 8 biti, bir yük/mağaza adresi veya dolaylı bir dalın hedefi olarak kullanıldığında göz ardı edilecek bir "etiket" tutabilir 

1
Olsonist

Birçok insan bu yanılgı var. Ama bunu dikkatlice okuyorsanız size söz veriyorum, okuduktan sonra tüm düşüncelerinizi gidereceksiniz.

Bir işlemcinin 32 bit veya 64 bit olduğunu, sırasıyla 32 bit adres yolunun veya 64 bit adres yolunun olması gerektiğini göstermediğini söyleyin! ... Tekrar ediyorum!

32 bit işlemci 32 bit ALU'ya (Aritmetik ve Mantık Birimi) sahip olduğu anlamına gelir ... yani 32 bit ikili işlemcide çalışabilir (veya sadece 32 rakamlı bir ikili sayı söyleyerek) ve benzer şekilde 64 bit işlemci 64 bit ikili üzerinde çalışabilir işlenen. Yani işlemciyi 32 bit veya 64 bit bir işlemciye takmak en fazla bellek miktarını göstermez. Sadece işlenenin ne kadar büyük olabileceğini gösteriyorlar ... (10 basamaklı hesap makinesini düşünebileceğiniz analoji için 10 basamağa kadar sonuçları hesaplayabilir ... bize 11 basamak ya da daha büyük herhangi bir sonuç veremez ... Ondalık ancak bu analojiyi basitlik için söylüyorum) ... ama söylediğiniz şey, doğrudan doğrudan arayüzlenebilir boyutta bellek (RAM) olan adres alanıdır. RAM'ın mümkün olan maksimum boyutu, adres veriyolunun boyutuna göre belirlenir ve veri yolunun boyutu veya işlemcinin boyutunun tanımlandığı ALU bile değildir (32/64 bit). Evet, eğer bir işlemcide 32 bit "Adres veri yolu" varsa, o zaman 2 ^ 32 byte = 4GB RAM adresine ulaşabilir (veya 64 bit için 2 ^ 64 olacaktır) ... ancak bir işlemci 32 bit diyebilir veya 64 bit'in bu adres alanıyla hiçbir ilgisi yoktur (adres alanı = belleğe veya maksimum RAM boyutuna ne kadar erişebildiği) ve yalnızca ALU'sunun boyutuna bağlıdır. Tabii ki veri yolu ve adres veri yolu aynı büyüklükte olabilir ve daha sonra 32 bit işlemcinin 2 ^ 32 bayt veya 4 GB belleğe erişeceği anlamına gelebilir ... ancak bu sadece bir tesadüf ve aynı olmayacak herkes için .... örneğin intel 8086, 16 bit işlemciye (16 bitlik ALU'ya sahip), bu nedenle dediğiniz gibi 2 ^ 16 bayt = 64 KB belleğe erişmiş olmalı ancak doğru değil. 20 bit adres veriyoluna sahip olmak için 1 MB belleğe kadar erişebilir .... Herhangi bir şüpheniz varsa google'da olabilir :)

Sanırım net bir noktaya değindim. Şimdi sorunuza geliyoruz ... çünkü 64 bit işlemci 64 bit adres yoluna sahip olması gerektiği anlamına gelmez, bu yüzden 64 bit işlemcide 48 bit adres yoluna sahip olmanın yanlış bir yanı yoktur ... tasarım ve üretimi ucuz hale getirmek için adres alanını daha küçük tuttular .... hiç kimse böyle büyük bir anı kullanmayacak (2 ^ 64 byte) ... ki burada 2 ^ 48 byte bugünlerde fazlasıyla yeterli.

1
hafiz031

Bir CPU, esas olarak veri yolu büyüklüğüne ve varlıkların büyük bir kısmına (iç mimari) bağlı olarak "N bit" olarak kabul edilir : Kayıtlar, Akümülatörler, Aritmetik-Mantık Birimi (ALU), Talimat Seti Örneğin: Eski güzel Motorola 6800 (veya Intel 8050) CPU, 8 bitlik bir CPU'dur. 8 bit veri veri yolu, 8 bit iç mimariye ve 16 bit adres veriyoluna sahiptir.


  • Her ne kadar N-bit CPU'da N-boy varlıklar dışında bir miktar olabilir. Örneğin, 6809'daki 6800 üzerindeki gelişmeler (her ikisi de 8 bit veri yollu 8 bit CPU'dur). 6809'da ortaya konan önemli gelişmeler arasında iki adet 8 bitlik akümülatör (A ve B, tek bir 16 bitlik kayıt biriminde birleştirilebilecek A ve B), iki adet 16 bitlik dizin kaydı (X, Y) ve iki adet kullanıldı. 16-bit yığın işaretçisi.
0
Amit G.