X86-64 sistemleri neden yalnızca 48 bit sanal adres alanına sahiptir?


98

Bir kitapta şunları okudum:

32 bit işlemcilerin 2 ^ 32 olası adresi varken, mevcut 64 bit işlemcilerin 48 bit adres alanı vardır

Beklentim, 64 bitlik bir işlemci ise adres alanının da 2 ^ 64 olması gerektiğiydi.

Bu yüzden bu sınırlamanın nedeni nedir merak ediyordum?


12
Kitap, özellikle AMD64 mimarisinin (x86-64) mevcut uygulamasından bahsediyor olmalı. Yalnızca düşük sıralı 48 bit kullanılır. Bu bir donanım sınırlaması değildir - 64 bitin tümü mevcuttur.
Cody Grey

8
Kitabı tanımlamak her zaman iyi bir fikirdir.
Henk Holterman

1
Fiziksel adres hatlarının ücretsiz olmadığını tahmin ediyorum (en az 16 ekstra cpu pinine ihtiyacınız var). Ve henüz 48 bitlik bir alanı aynı işlemcideki fiziksel RAM yongalarıyla doldurabilen herhangi bir donanımdan haberdar değilim. Bu mümkün olduğunda AMD'nin eksik 16 pini ekleyeceğinden eminim :)
Torp

7
hatta, The 32-bit processors have 2^32 possible addressesmutlaka doğru değildir, bellek adresleme için sadece 24 "pin" ile 32bit cpu olabilir. Örneğin 68EC020 (daha ucuz 68020 versiyonu) 32bit bir cpu'dur, ancak hafızayı adreslemek için 24 bittir.
ShinTakezou

21
64 bit fiziksel adreslemeyle ilgili çok gerçek bir sorun var, sanal bellek sayfası boyutu çok küçük. Bu, her bağlam anahtarında muazzam sayfa dizinleri ve son derece pahalı TLB önbellek temizlemeleri sağlar. 4KB'den 4MB sayfalara geçmek bir seçenektir ancak mevcut işletim sistemleriyle çok uyumlu değildir.
Hans Passant

Yanıtlar:


136

Çünkü gereken tek şey bu. 48 bit size 256 terabaytlık bir adres alanı sağlar. Bu çok fazla. Bundan daha fazlasına ihtiyaç duyan bir sistemi yakın zamanda görmeyeceksiniz.

Bu yüzden CPU üreticileri bir kısayol kullandı. Tam 64 bit adres alanına izin veren bir komut seti kullanırlar, ancak mevcut CPU'lar yalnızca daha düşük 48 biti kullanır. Alternatif, uzun yıllar ihtiyaç duyulmayacak daha büyük bir adres alanını kullanmak için transistörleri boşa harcamaktı.

Yani, 48 bitlik sınıra yaklaştığımızda, bu sadece tam adres alanını idare eden CPU'ları serbest bırakmak meselesi, ancak komut setinde herhangi bir değişiklik gerektirmeyecek ve uyumluluğu bozmayacaktır.


121
640 kb herkes için yeterlidir.

7
Hala 8088 sistemi mi kullanıyorsun, bdares?
Joe

25
@bdares: Kötü benzetme. 8088/8086 kemerinin komut setinde yerleşik bir 640k limiti vardır. Sadece yeni bir ISA (386) yapmak bariyeri kırmak mümkündü. x86_64 ise ISA'daki 64 bitin tümünü destekler. Hepsinden yararlanamayan mevcut nesil donanımlar ...
R .. GitHub BUZ YARDIMINI DURDUR

16
@R. Aslında, CPU'daki sınırlama bir megabayttı. IBM PC, bunun bir bölümünü bellek eşlemeli çevre birimleri, BIOS, vb. İçin belirledi. Diğer bazı 8088/8086 tasarımları (bellek hizmet veriyorsa, Zenith Z100) çevre birimleri ve benzerleri için daha az ve buna bağlı olarak uygulama programları için daha fazla atandı.
Jerry Coffin

25
lwn.net/SubscriberLink/655437/9a48cd3e7a8cbe8a <- bu yanıttan üç yıl sonra zaten bu sınırlara ulaşıyoruz :) HP Makine 320TB belleğe sahip olacak ve 48 -bit adresleme sınırlaması.
agam

18

Veri yolu boyutuna ve fiziksel belleğe atıfta bulunan herhangi bir yanıt biraz yanlıştır, çünkü OP'nin sorusu fiziksel adres alanı değil sanal adres alanıyla ilgiliydi . Örneğin bazı 386'lardaki sözde benzer sınır, her zaman tam 32 bit olan sanal adres alanı değil, kullanabilecekleri fiziksel bellek üzerindeki bir sınırdı. Prensip olarak, yalnızca birkaç MB fiziksel bellekle bile tam 64 bit sanal adres alanı kullanabilirsiniz; elbette bunu değiştirerek veya aynı sayfayı çoğu adreste eşlemek istediğiniz özel görevler için (örneğin, belirli seyrek veri işlemleri) yapabilirsiniz.

Bence gerçek cevap, AMD'nin sadece ucuz olması ve kimsenin umursamayacağını umması, ancak alıntı yapacak referanslarım yok.


15
"Ucuz olmak" Sanırım asla kullanılmayacak pinler eklememeyi, kullanılmayacak transistörler için yonga alanı kaplamamayı ve mevcut talimatları daha hızlı hale getirmek için boş alanı kullanmayı mı kastediyorsunuz? Eğer ucuzsa, ben varım!
Olof Forshell

80386, her biri 4 GB'a kadar bellek (toplam 32 TB) içeren 2 * 4096 seçiciye izin verir. 80286, her biri 64 KB (1 GB) içeren 2 * 4096 seçiciye izin verdi.
Olof Forshell

Doğrusal olmayan bölümlere ayrılmış saldırılar kitabımda adres alanı olarak sayılmaz. Taşınabilir bir yazılımın bunları kullanmasının bir yolu yoktur.
R .. GitHub BUZA YARDIM ETMEYİ DURDUR

@R .. - Taşınabilir yazılımın tanımının bunu yapabileceğini düşündüm . :-) Örneğin, C ++ işaretçilerin farklı diziler halinde karşılaştırılmasını yasaklar, böylece ayrı 4GB'lık segmentlerde olabilirler.
Bo Persson

Derlemeniz aslında çok büyük işaretçiler üretirse ve her bellek özümlemesi için bir bölüm kaydı yüklerse, o zaman evet. Ama gerçekte bu çok yavaş ve bunun yerine herkes küçük bellek modelleri ve __far(veya daha da kötüsü FAR/ far!) İşaretçiler kullandı ...
R .. GitHub BUZ YARDIMINI DURDUR

10

Wikipedia makalesinin sınırlamalar bölümünü okuyun :

Bir PC, 4 petabayt bellek içeremez (başka hiçbir şey olmasa da 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ı öngördü ve 52 bit fiziksel adres, 64 bit fiziksel adresleri uygulama maliyetine katlanmamakla birlikte genişleme için geniş alan sağlar

Yani, bu noktada tam 64 bit adreslemeyi uygulamanın bir anlamı yok, çünkü böyle bir adres alanını tam olarak kullanabilecek bir sistem kuramıyoruz - bu yüzden bugünün (ve yarının) sistemleri için pratik olan bir şey seçiyoruz.


4 petabayttaki 4 nereden geliyor? 64 adres satırından bahsediyorsak, 4 gigabayt olan 32 adres satırının mümkün kıldığı adres alanının karesini bulmalıyız. Bunu kareleyin ve bizde 4 petabayt değil 16 olmalı. Bir şey mi kaçırıyorum?
Olof Forshell

1
Mevcut fiziksel sınırdan (52 bit) geliyor - nokta, 64 bitlik bir adres alanı için gerekli olanı bırakın, bu sınırlı aralığı desteklemek için bir PC'ye yeterli RAM koyamadığımızdır.
Damien_The_Unbeliever

9

Dahili yerel kayıt / işlem genişliğinin harici adres veriyolu genişliğine yansıtılmasına gerek yoktur .

Yalnızca 1 megabayt RAM'e erişmesi gereken 64 bit işlemciniz olduğunu varsayalım. Tüm gereken 20 bitlik bir adres veri yoludur. Kullanmayacağınız tüm ekstra pinlerin maliyeti ve donanım karmaşıklığıyla neden uğraşasınız?

Motorola 68000 böyleydi; Dahili olarak 32 bit, ancak 23 bit adres yolu (ve 16 bit veri yolu) ile. CPU, 16 megabayt RAM'e erişebiliyordu ve yerel veri türünü (32 bit) yüklemek için iki bellek erişimi gerekiyordu (her biri 16 bit veri taşıyordu).


1
ancak 68000, "16/32 bit" bir işlemci olarak kabul edilir, "tam" 32 bitlik bir işlemci olarak kabul edilmez, bu nedenle 16bit geçmişte hala bir ayağı olduğu söylenebilir; Örnek olarak 68020'yi seçtim, çünkü düşük maliyetli 68EC020 sürümü yalnızca adresler için 24 bit içeriyor, ancak 68020 "tam" 32 bitlik bir cpu ... +1 bu harika işlemci ailesini değerlendirdi!
ShinTakezou

@ShinTakezou: dürüst olmak gerekirse, 80386SX 16 bitlik bir CPU muydu (çünkü 80286 gibi bir adres alanına sahipti) yoksa 32 bit miydi (çünkü bir 80386DX'in dahili mimarisine sahipti)? Biri sizin yaptığınız gibi söyleyebilir, ancak bir diğeri (bu) "önemli olan içseldir" diyor - ve benden alıntı yapabilirsiniz.
Olof Forshell

@Sanırım, "bellek" (dış dünya) bağlamında, önemli olanın harici olduğunu düşünüyorum, bu nedenle 68000, 16 bitlik bir CPU'dur (32 bit verileri okumak için 2 "adım" gerekir): D
ShinTakezou

@ShinTakezou: Bellek bağlamı, hatta önbellekler, modern işlemcilerde son derece sıkı bir şekilde bağlanmış olsalar bile, her zaman cpu'nun kendisinin dışındadır. 8088 dahili olarak 8086'ya eşitti, ancak 8086'nın onaltısına sekiz veri yolu hattı vardı. Açıkça gördüğünüz şeyi, 8088'in Z80, 8080, 8085 ile aynı grupta sınıflandırılması gerektiğini görmüyorum. Veri yolunun genişliği sorusu bu bağlamda önemsiz görünüyor
Olof Forshell

Ben böyle bir konuda uzman değilim, bu yüzden bana açık hiçbir şeyim yok. 68000'in hala "eski zaman" bir işlemci olduğunu düşünebileceğiniz geçmişle daha keskin bir kesim ihtiyacını fark etmek istedim, bu yüzden adres alanının 32 bitten daha azıyla sınırlı olması "doğal" görünebilir; 68020 32 bit olabilir, böylece sınırıyla 68EC020'nin varlığı bunun "sınırından değil" bir seçim olduğunu açıkça ortaya koyar ( veya bu) zaman "ama başka bir düşünceye göre (64 iğneye sahip olmanın gerçek bir avantajı yoksa daha ucuz hale getirmek gibi), ki bu da bu cevabın aşağı yukarı argümanıdır.
ShinTakezou

8

Transistörleri CPU adres yolunda kaydetmekten daha ciddi bir neden vardır: adres alanının boyutunu artırırsanız, sayfa boyutunu artırmanız, sayfa tablolarının boyutunu artırmanız veya daha derin bir sayfa tablosu yapısına sahip olmanız gerekir ( daha fazla çeviri tablosu düzeyidir). Tüm bunlar, performansı düşüren bir TLB ıskalama maliyetini artırır.


2
Intel, mevcut 48 bitten 57 bite genişletmek için 5 seviyeli bir sayfalama şeması öneriyor . (Seviye başına aynı 9 bit / 4k sayfa, mevcut x86-64 sayfa tablolarıyla aynı). Seviye başına 10 veya 11 bit kullanmak, sayfalarda gezinme donanımını değiştirmeyi gerektirecekti, bu nedenle bu, büyük bellek için en uygun tasarım olmayabilir, ancak 4 için maksimum performansı da desteklemesi gereken çift modlu bir CPU için mantıklı bir uzantıdır. mevcut formattaki seviye tabloları.
Peter Cordes

Elbette, 2M veya 1G hugepages ile, bir sayfa dizini işaretçisi yerine üst düzeyden büyük sayfalı bir tablo girişine kadar yalnızca 4 veya 3 düzey sayfa tablosu vardır.
Peter Cordes

6

Benim bakış açıma göre bu, sayfa boyutunun bir sonucudur. Her sayfa en fazla 4096/8 = 512 sayfa tablosu girişi içerir. Ve 2 ^ 9 = 512. Yani 9 * 4 + 12 = 48.


4

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

Sunucular maksimum bellek miktarına 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ı 8 Soketli bir sistemdir. Bir 8S sistemi, tek bir düğüm oluşturmak için yüksek hızlı tutarlı bir ara bağlantı (veya basitçe, yüksek hızlı bir "veri yolu") ile bağlanan 8 Sunucu CPU'sundan başka bir şey değildir. Dışarıda daha büyük kümeler var, ancak bunlar çok az ve çok uzak, burada yaygın olarak kullanılan yapılandırmalardan bahsediyoruz. Gerçek dünyadaki kullanımlarda, 2 Soket sisteminin en yaygın kullanılan sunuculardan biri olduğunu ve 8S'nin genellikle çok yüksek son olarak kabul edildiğini unutmayın.

2) Sunucular tarafından kullanılan ana bellek türleri, bayt adreslenebilir normal DRAM bellek (örneğin, DDR3 / DDR4 bellek), Bellek Eşlemeli IO - MMIO (bir eklenti kartı tarafından kullanılan bellek gibi) ve yapılandırmak için kullanılan Yapılandırma Alanıdır. sistemde bulunan cihazlar. İlk bellek türü 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ının ne olduğuna bağlı olarak büyük miktarda MMIO kullanır.

3) Her sunucu CPU'sunun her yuvada 16 DDR4 DIMM barındırabileceğini varsayın. Maksimum 256 GB DDR4 DIMM boyutuyla. (Sunucunun sürümüne bağlı olarak, yuva başına bu olası DIMM sayısı aslında 16 DIMM'den azdır, ancak örnek için okumaya devam edin).

Yani her soket teorik olarak 16 * 256GB = 4096GB = 4 TB'ye sahip olabilir. Örnek 8S sistemimiz için DRAM boyutu maksimum 4 * 8 = 32 TB olabilir. Bu, bu DRAM alanını adreslemek 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 nokta, bugün mevcut olan en büyük DDR4 DIMM türlerine (256 GB) sahip 8 Soketli bir sistem için en "talepkar" bellek türünün olmasıdır. DIMM'ler) yalnızca 45 bit kullanır.

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

Özetlemek gerekirse: 1) 48 bitlik Fiziksel adres, bol miktarda DDR4 ile "tam olarak yüklenmiş" günümüzün en büyük sistemlerini ve ayrıca MMIO alanı gerektiren birçok diğer IO cihazını desteklemek için bol miktarda bittir. Tam olarak 256 TB.

Bu 256TB adres alanının (= 48 bit fiziksel adres) SATA sürücüleri gibi herhangi bir disk sürücüsünü İÇERMEDİĞİNİ unutmayın çünkü bunlar adres haritasının bir parçası DEĞİLDİR, yalnızca bayt adreslenebilir belleği içerir ve işletim sistemine açıktır.

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

Bunun kullanıcı için anlamı, bir kişinin 48 bitten fazla adreslemeyi destekleyebilen büyük, ultra modern bir sunucu CPU'suna sahip olmasına rağmen, yalnızca 48 bit PA'yı destekleyen bir işletim sistemi çalıştırırsanız, yalnızca 256 TB'den yararlanabilirsiniz. .

3) Sonuç olarak, daha yüksek sayıda adres bitinden yararlanmak için iki ana faktör vardır (= daha fazla bellek kapasitesi).

a) CPU donanımınız kaç biti destekliyor? (Bu, Intel CPU'lardaki CPUID talimatı ile belirlenebilir).

b) Hangi işletim sistemi sürümünü çalıştırıyorsunuz ve kaç bit PA'yı tanıyor / destekliyor.

(A, b) 'nin minimum değeri, nihayetinde sisteminizin yararlanabileceği adreslenebilir alan miktarını belirleyecektir.

Bu cevabı diğer cevaplara detaylı olarak bakmadan yazdım. Ayrıca, MMIO, MMCFG'nin nüanslarını ve adres haritası yapısının bütününü ayrıntılı olarak incelemedim. Ama bunun yardımcı olacağını umuyorum.

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


Bu soru, 48 bitlik sanal adres alanı boyutunu sormaktadır (sanal adreslerin standart olmasını gerektirir). Fiziksel bitlerden daha fazla sanal bit istiyorsunuz, bu nedenle yüksek yarı çekirdek tüm fiziksel belleği tek bir adres alanına (kendi veya kullanıcı alanı) eşleyebilir. Dediğiniz gibi, HW'nin yalnızca DRAM denetleyicileri + MMIO'nun kullanabileceği kadar çok PA biti uygulaması gerekir ve x86-64 sayfa tablosu biçiminde 52 bit sınırına kadar herhangi bir sayıyı kullanabilir. ( Neden 64bit'te sanal adres fiziksel adresle (52 bit uzunluğunda) karşılaştırıldığında 4 bit kısa (48 bit uzunluğunda)? )
Peter Cordes

1
4 seviyeli sayfa tablosu formatı ayrıca, HW + SW 57 bitlik VA'lar için PML5 sayfa tablolarını destekleyene kadar 48 bitlik VA sınırını da uygular. Her neyse, bu yararlı bir cevap, ancak yanlış soru altında gönderilmiş gibi görünüyor. Bunun için daha iyi bir yer olup olmadığından emin değilim, bu yüzden sanırım burada bırakabiliriz, umarım PA ile VA hakkında bir şeyler söylemek için bir başlık eklemek için bir düzenleme ile.
Peter Cordes

2

Birçok insan bu yanılgıya sahiptir. Ama söz veriyorum, bunu dikkatlice okursanız, bunu okuduktan sonra tüm yanlış anlamalarınız netleşecektir.

Bir işlemcinin 32 bit veya 64 bit, sırasıyla 32 bit adres veriyoluna veya 64 bit adres veri yoluna sahip olması gerektiği anlamına gelmediğini söylemek için! ... Tekrar ediyorum DOESN'T !!

32 bit işlemci, 32 bit ALU'ya (Aritmetik ve Mantık Birimi) sahip olduğu anlamına gelir ... bu, 32 bit ikili işlenen üzerinde çalışabileceği (veya sadece 32 basamaklı bir ikili sayı söyleyerek) ve benzer şekilde 64 bit işlemcinin 64 bit ikili üzerinde çalışabileceği anlamına gelir. işlenen. Bu nedenle, bir işlemci 32 bit veya 64 bit, takılabilecek maksimum bellek miktarını GÖSTERMEZ. Sadece işlenenin ne kadar büyük olabileceğini gösteriyorlar ... (benzetme için 10 basamaklı bir hesap makinesinin sonuçları 10 basamağa kadar hesaplayabileceğini düşünebilirsiniz ... bize 11 basamak veya daha büyük bir sonuç veremez ... ondalık olarak ama bu benzetmeyi basitlik için söylüyorum) ... ama sizin söylediğiniz şey, doğrudan arabirimin maksimum bellek boyutu (RAM) olan adres alanıdır. Hafıza' Olası maksimum boyut, adres veriyolunun boyutuna göre belirlenir ve veri yolunun boyutu veya hatta işlemcinin boyutunun tanımlandığı ALU (32/64 bit) değildir. Evet, bir işlemcinin 32 bit "Adres veriyolu" varsa, o zaman 2 ^ 32 bayt = 4 GB RAM'i adresleyebilir (veya 64 bit için 2 ^ 64 olacaktır) ... ancak 32 bit veya 64 bit işlemcinin bu adres alanıyla hiçbir ilgisi yoktur (adres alanı = belleğe veya maksimum RAM boyutuna ne kadar erişebilir) ve yalnızca ALU'nun boyutuna bağlıdır. Elbette veri yolu ve adres yolu aynı boyutta olabilir ve o zaman 32 bit işlemci 2 ^ 32 bayt veya 4 GB belleğe erişeceği anlamına gelebilir ... ancak bu yalnızca bir tesadüf ve aynı olmayacak hepsi için.... örneğin intel 8086 16 bitlik bir işlemcidir (16 bit ALU'ya sahip olduğu için), sizin söylediğiniz gibi 2 ^ 16 bayt = 64 KB belleğe erişmiş olması gerekir, ancak bu doğru değil. 20 bit adres veriyoluna sahip olmak için 1 MB'a kadar belleğe erişebilir .... Herhangi bir şüpheniz varsa google'a gidebilirsiniz :)

Sanırım amacımı netleştirdim. Şimdi sorunuza gelince ... 64 bit işlemci 64 bit adres veriyoluna sahip olması gerektiği anlamına gelmez, bu nedenle 64 bit işlemcide 48 bit adres veriyolunun olması yanlış değildir. ... tasarımı ve üretimi ucuz hale getirmek için adres alanını daha küçük tuttular .... hiç kimse bu kadar büyük bir bellek (2 ^ 64 bayt) kullanmayacağından ... bugünlerde 2 ^ 48 bayt fazlasıyla yeterli.


Sanırım amacınızı çok net belirttiniz, 16 bitlik 8086 CPU hakkında söylediklerinizde anlamadığım bir şey var: 16 bitlik bir CPU 20 bitlik bir adresi nasıl işleyebilir? Bunu 2 adımlı bir işlemle hallediyor mu? Adres veriyolu 20 bit genişliğinde olsa bile, CPU'ya ulaştığında, yazmaç genişliği açıkça sadece 16 bit alabilir ... Bunu nasıl yaparlar?
programmersn

2
Hmm ... 2 adımlı işlem. Segment kaydı yalnızca üstteki 16 biti içerir. Daha sonra 20 bit yapmak için 10H ile çarpılır ve ofset eklenir.
hafiz031

1

En azından Intel 64 ile 64 bitlik bir VA'nın sadece düşük sıralı 48 bitinin kullanıldığı doğru değildir. Üstteki 16 bit, bir nevi kullanılır.

Bölüm 3.3.7.1 Intel® 64 ve IA-32 Mimarileri Yazılım Geliştirici Kılavuzundaki Kanonik Adresleme şunları söylüyor:

kanonik bir adres, 63'ten 48'e kadar olan bitleri sıfırlara veya birlere ayarlanmış olmalıdır (bit 47'nin sıfır veya bir olmasına bağlı olarak)

Dolayısıyla 47 ile 63 arasındaki bitler, hepsi 1 veya tümü 0 olmak üzere bir süper bit oluşturur. Bir adres kanonik biçimde değilse, uygulama hata vermelidir.

AArch64'te bu farklı. ARMv8 Komut Setine Genel Bakış'a göre , bu bir 49-bit VA'dır .

AArch64 bellek çeviri sistemi 49 bitlik bir sanal adresi (çeviri tablosu başına 48 bit) destekler. Sanal adresler 49 bitten imzayla genişletilir ve 64 bitlik bir işaretçi içinde 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ükleme / depolama adresi veya dolaylı bir dalın hedefi olarak kullanıldığında yok sayılacak bir "etiket" tutabilir.


1
Yalnızca alttaki 48 önemlidir, ancak donanım doğru şekilde imzalanarak 64 bite genişletildiğini kontrol eder. IDK neden sıfır uzantı belirtmediler; belki yüksek ve alçak yarı adresleri kontrol etmeyi daha kolay hale getirmek istediler (sadece işaret bitini kontrol ederek). Ya da belki 2 ^ 48 sınırını özel yapmaktan kaçınmak için, üste yakın adresler 32-bit işaret-genişletilmiş sabitlere uygun şekilde sığabilir. Bence ikincisi daha olası.
Peter Cordes

Her neyse, kanonik için mevcut HW denetimi, yazılımın gelecekteki donanımda bozulacak etiketli işaretçiler için yok sayılan bitleri kullanmasını engeller, bu nedenle, gerektiğinde gelecekteki donanımları genişletmeyi mümkün kılan mekanizmanın bir parçasıdır. (Geçici olmayan belleğin doğrudan fiziksel ve sanal adres alanına bağlanması sayesinde beklenenden daha erken olabilirdi.)
Peter Cordes

Core i5'imdeki Linux'ta procfs, 7ffd5ea41000-7ffd5ea62000 ile eşlendiğini söylüyor. Bu adres aralığı, yukarıdaki 'kanonik' kurala göre anlamlıdır. Bit 48-63, onu doğru bir kanonik adres yapar. Biraz tuhaf olan, Linux kaynağındaki bazı adreslerdir. İnclude / asm / pgtable_64_types'te #define __VMALLOC_BASE _AC (0xff92000000000000, UL) yazıyor. Bu kurallı bir adres DEĞİLDİR. Böyle bir adres 0xffff8 ile başlar. Neden bilmiyorum.
Olsonist

Evet, IIRC Linux kullanıcı alanı için kanonik aralığın düşük yarısını kullanır ve (çoğunlukla) yalnızca çekirdek eşlemeleri için yüksek yarısını kullanır. Ancak bazı çekirdek belleği, [vsyscall]sayfa gibi kullanıcı alanına aktarılır. (Bu, şu anki PID gibi şeyleri dışa aktarıyor olabilir getpid(), böylece tamamen kullanıcı alanıdır. Ayrıca gettimeofday(), yalnızca çekirdek tarafından dışa aktarılan kullanıcı alanı + ölçek faktörlerinde rdtsc kullanabilir. Sanırım [vdso]bunların bir kısmı, üst kısmına yakın olan alt yarısı)
Peter Cordes

IDK ne __VMALLOC_BASEyapar. Muhtemelen doğrudan kullanılmıyor.
Peter Cordes

0

Bir CPU, esas olarak veri yolu boyutuna ve varlıklarının büyük bir kısmına (dahili mimari) göre "N-bit" olarak kabul edilir : Yazmaçlar, Akümülatörler, Aritmetik-Mantık Birimi (ALU), Komut Seti, vb. Örneğin: Eski güzel Motorola 6800 (veya Intel 8050) CPU, 8 bitlik bir CPU'dur. 8 bitlik bir veri yoluna, 8 bitlik bir iç mimariye ve 16 bitlik bir adres yoluna sahiptir.


  • N-bit CPU olmasına rağmen, N-boyutlu öğelerden başka bazı öğeler olabilir. Örneğin 6809'daki 6800 üzerindeki iyileştirmeler (her ikisi de 8 bit veri yollu 8 bit CPU'dur). 6809'da sunulan önemli geliştirmeler arasında iki adet 8 bitlik akümülatör (A ve B, tek bir 16 bitlik kayıtta birleştirilebilir, D), iki 16 bitlik indeks kaydı (X, Y) ve iki 16 bit yığın işaretçileri.

Motorola 68000/68020 ile bu noktayı örnek olarak veren bir cevap zaten var . Bu soru gerçekten özellikle x86-64 ile ilgilidir, eski 8/16-bit CPU'larla değil. X86-64 durumunda, ana faktörlerden biri, daha geniş sanal adreslerin daha derin bir sayfa tablosuna ihtiyaç duyması ve bahsettiğiniz eski çipler için bu faktörün mevcut olmamasıdır.
Peter Cordes

veri yolu genişliğinin kayıt veya ALU genişliğiyle eşleşmesi gerekmez. Örneğin, P5 Pentium'un 64 bitlik bir veri yolu vardır (hizalanmış 64 bitlik yükler / depolamaların atomik olduğu garanti edilir), ancak yazmaçlar / ALU'lar yalnızca 32 bittir (entegre FPU ve daha sonraki Pentium MMX'te SIMD hariç) ALUs.)
Peter Cordes

OP şunu yazıyor: "Beklentim, 64 bitlik bir işlemci ise adres alanının da 2 ^ 64 olması gerektiğiydi." ........ "Bu soru gerçekten özellikle x86-64 ile ilgili, eski 8/16-bit CPU'lar değil" diye yazıyorsunuz. ........ OP sorusunun özünü kaçırdığınızı düşünüyorum. OP sorusu, 64 bitlik bir CPU'nun 64 bitlik bir adres yoluna sahip olması gerektiği şeklindeki yanlış varsayımın bir sonucudur. ALU hakkında varlıklarının büyük bir kısmını yazdım ; Hepsi değil.
Amit G.

Bu yorumu tekrar yayınlayarak bana spam göndermeyi bırakın. Evet, elbette OP, tarif ettiğiniz nedenle yanlış, ancak cevabınızın da benzer bir hata yapıyor gibi göründüğünü belirtmiştim. " Ve sonuç olarak varlıklarının büyük bir kısmı: Yazmaçlar ve Toplayıcılar, Aritmetik-Mantıksal Birim (ALU) ... " diyorsunuz, bu şeylerin veri yolu genişliğiyle eşleştiğini söylüyorsunuz. "Büyük bir kısım" ifadesi, sadece bazen o kısımlar için doğru olduğunu değil, hangi kısımları söylediğinizi ima eder .
Peter Cordes
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.