Debian Linux neden işlem başına 128 TB sanal adres alanına izin veriyor, ancak sadece 64 TB fiziksel belleğe izin veriyor?


23

Ben sadece burada okudum :

  • İşlem başına 128 TB'a kadar sanal adres alanı (2Gib yerine)
  • 4GiB yerine 64TiB fiziksel bellek desteği (veya PAE uzantılı 64GiB)

Neden? Yani, fiziksel bellek desteği çekirdekten mi yoksa mevcut donanımdan mı kaynaklanıyor?

Neden gerçekten adresleyebileceğiniz fiziksel bellekten iki kat daha fazla sanal bellek alanına ihtiyacınız var?


Ayrıca takas ekleyebilirsiniz.
Thorbjørn Ravn Andersen

2
bu çok RAM ...
dalearn

4
@dalearn - Önce bunları 4096KB kadar atalım 8 bitlik mikro düzeyde için banka-anahtarlamalı hafıza genişletme alabilir öğrenince bilirsin dedim aynen aynı şey ...
Jules

Yanıtlar:


35

Bu sınırlar Debian'dan veya Linux'tan gelmiyor, donanımdan geliyorlar. Farklı mimarilerin (işlemci ve bellek veri yolu) farklı sınırlamaları vardır.

Mevcut x86-64 PC işlemcilerinde MMU, 48 bit sanal adres alanına izin verir . Bu, adres alanının 256 TB ile sınırlı olduğu anlamına gelir. Çekirdek adreslerini kullanıcı adreslerinden ayırt etmek için bir bit kullanıldığında, işlemin adres alanı için 128 TB bırakılır.

Mevcut x86-64 işlemcilerde, fiziksel adresler 48 bit kullanabilir , bu da 256 TB'a kadar sahip olabileceğiniz anlamına gelir. Amd64 mimarisinin tanıtılmasından bu yana limit giderek arttı (doğru hatırlıyorsam 40 bitten). Her adres alanı bir miktar kablolama ve kod çözme mantığına (işlemciyi daha pahalı, daha yavaş ve daha sıcak hale getirir) mal olur, bu nedenle donanım üreticilerinin boyutu düşürmek için bir teşviği vardır.

Linux yalnızca fiziksel adreslerin 2 ^ 46'ya kadar çıkmasına izin verir (bu nedenle yalnızca 64 TB'a kadar sahip olabilirsiniz) çünkü fiziksel belleğin çekirdek alanda tamamen eşlenmesini sağlar. 48 bit adres alanı bulunduğunu unutmayın; çekirdek / kullanıcı için bir bit, çekirdek adres alanı için 47 bit bırakır. Bunun yarısı çoğu durumda doğrudan fiziksel belleğe hitap eder ve diğer yarısı çekirdeğin ihtiyaç duyduğu her şeyi eşlemesini sağlar. (Linux, aynı anda tam olarak haritalanamayan fiziksel hafıza ile başa çıkabilir, ancak bu ilave bir karmaşıklık sunar, bu yüzden yalnızca PAE ile x86-32 ve LPAE ile armv7 gibi ihtiyaç duyduğu platformlarda yapılır .)

Sanal belleğin çeşitli nedenlerden dolayı fiziksel bellekten daha büyük olması yararlıdır:

  • Çekirdeğin tüm fiziksel belleği eşlemesini sağlar ve sanal eşlemeler için yer kalmasına izin verir.
  • Fiziksel bellek eşlemelerine ek olarak, takas, dosya ve aygıt sürücülerinin eşlemeleri de vardır.
  • Yerlerinde eşlenmemiş belleğe sahip olmak yararlıdır: arabellek taşmaları , ASLR nedeniyle büyük eşlenmemiş bölgeler vb.

9
Fiziksel bellekteki 46 bit sınırlaması, Linux bellek haritasıyla ilgilidir : çekirdek alandaki fiziksel belleğin tam eşlenmesini içerir; bu, fiziksel belleğin yalnızca kullanılabilir adres alanının dörtte birine karşılık gelebileceği anlamına gelir.
Stephen Kitt

Herhangi biri @StephenKitt yorumunu detaylandırabilir mi? Bunu anlamakla çok ilgileniyorum ama atıfta bulunduğunu okuduktan sonra bile anlamadım;)
gsi-frank

@ gsi-frank Çekirdeğin tüm fiziksel belleği kalıcı olarak eşleştirmesi uygundur. Böylece, 2 ^ 48 adres alanında, 2 ^ 47, kullanıcı adreslerine, 2 ^ 46, çekirdek adreslerine gider ve 2 ^ 46, fiziksel bellek adreslemesi içindir.
Gilles 'SO- kötü olmayı'

@ gsi-frank Eğer " Kendi 32-bit İşletim Sisteminizi Geliştirme " adlı klasik kitabın bir kopyasını alabilirseniz , yazarın kendi işletim sistemi için benzer bir karar vermesinin nedeni hakkında derinlemesine gider (bu durumda, 80386'nın 4GiB sanal adres alanının 1GiB fiziksel RAM eşlemesi ve 2GiB kullanıcı segmenti içeren bir 2GiB çekirdek segmentine bölünmesi). İşletim sistemi kurumları ile ilgilenen herkes muhtemelen okumalıdır - anlaşılması için yeterince basit fakat kullanışlı bir işletim sistemi çekirdeği olacak kadar gelişmiş bir tasarım sunar.
Jules,

Çekirdeğin 4.13 sürümünden bu yana, x86-64 (ve diğer bazı mimariler) beş seviyeli sayfalarla oluşturulabilir ; bu, x86-64'teki adres alanını fiziksel RAM için 52 bit ve sanal için 57 bit (4 PiB / 128 PiB). Çekirdek alanındaki bellek haritasının güvenlikle ilgili sorunları ortaya çıkardığını ve bu nedenle yakın gelecekte değişebileceğini unutmayın.
Stephen Kitt

9

Neden olduğunu bilmiyorum ama fiziksel belleğin iki katı kadar adres alanını desteklemenin neden yedi neden olduğunu düşünebiliyorum.

  1. İlki, fazladan belleğe ihtiyaç duyan uygulamaları çalıştırabilmenizdir - diske geçmek anlamına gelse bile.
  2. Bellek kullanımını bölmek için daha temiz bellek düzenleri. Örneğin, bir işletim sistemi daha fazla numaralı adresleri alabilir ve ayrımı daha temiz hale getirmek için uygulamalar için daha düşük numaralı adresleri bırakabilir.
  3. Adres alanı düzeni randomizasyonu biraz daha etkili.
  4. Sayfaları çalıştırılabilir olarak işaretlemek, kalan hafıza anlamına gelebilir.
  5. Bellek eşlemeli G / Ç.
  6. Bellek tahsisi daha kolaydır: bir defada daha büyük parçalar tahsis edilebilir.
  7. Azaltılmış hafıza parçalanması

1
Teşekkürler! 1) o kadar açık ve basit ki, sorudan utanıyorum;)
gsi-frank

2
(3) de gerçekten önemlidir. Sen gerçekten rastgele tahmin neredeyse kesinlikle tuzakları neden olacak şekilde tahsis olacağım bellek miktarından daha büyük boyutlu siparişler olan bir sanal adres alanı istiyorum.
R.,

6

Bunlar donanımsal sınırlamalar. Mevcut x86_64 / amd64 donanımı, 48 bitlik sanal adreslere ve çeşitli boyutlara izin verir (uygulamaya bağlıdır - örneğin, iş istasyonum yalnızca 36 bitleri destekler) fiziksel adresleri. Linux çekirdeği sanal adres alanını ikiye böler (çekirdeğin yarısını, kullanıcı alanının yarısını kullanarak - tıpkı x86'daki gibi).

Yani sen:

2⁴⁸ bayt ÷ 2 = 2⁴⁷ bayt = 128 TiB

Fiziksel adres boyutu genellikle daha küçüktür, çünkü fizikseldir. CPU üzerindeki / içindeki pinleri / pedleri, transistörleri, bağlantıları vb. Alır ve kart üzerindeki iz hatlarını alır. Muhtemelen aynı zamanda yonga setlerinde de aynı. İşlemcinin çekirdeğinin veya soketinin tasarım ömrü boyunca düşünülemez bir tokmağı desteklemesinin bir anlamı yoktur - tüm bunlar paraya mal olur. (Her birinde 32 DIMM yuvası ve 64GiB DIMM olsa bile, hala sadece 2TiB'desiniz. DIMM kapasitesi yılda iki katına çıksa bile, 64TiB'den 5 yıl uzaktayız.

As Peter Cordes işaret, insanlar artık gibi uçucu olmayan depolama iliştiriyorsanız 3D xPoint akla adres alanı azalıyor yapar bellek veri yolu için. Daha yeni işlemciler fiziksel adres alanını 48 bit'e çıkardılar; Debian wiki’nin henüz güncellenmemiş olması muhtemel.


Doğrudan bellek veriyoluna (örn. 3D XPoint) bağlanan uçucu olmayan depolama bir şey haline geliyor ve bu, önümüzdeki birkaç yıl içinde fiziksel adres alanına olan talebi büyük ölçüde artırabilir (DRAM'den daha yoğun olduğundan ve bunun tekne yüklerine sahip olması yararlıdır. tekne yükleri RAM'in olması yararlı olduğundan daha fazla durumda). Bkz zdnet.com/article/the-non-volatile-memory-revolution değil-çok-teknik makale için (ya da daha iyi şeyler için google). Intel Skylake, onu clflushve clflushopttalimatları ile desteklemektedir .
Peter Cordes

1
96 yuvaya ( örneğin Tyan'ın dört yuvalı HPC sistemi ) 12TiB RAM'e sahip sistemleri zaten satın alabilirsiniz , bu nedenle 64TiB beş yıldan daha az bir zaman alabilir. Bazı insanlar onları alıp bu kadar RAM'e
sığdırıyorlar

@StephenKitt hmm, tamam çünkü DIMM kapasitesi 3 yıla iki katına yaklaşıyor 😁
derobert

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.