RAM'ime ne oldu?


6

Linux işletim sisteminin temellerini anlamaya çalışıyorum. 64 bit CPU'da 64 bit Ubuntu 12.04 kullanıyorum. Sistem 2GB RAM'e sahiptir.

cat /proc/meminfo 
MemTotal:        2012040 kB

Soru 1 : Eksik 85112KB RAM nerede?

2097152 (2 gb in kilobytes)
2012040 -
______________
 85112

Bu başka bir şey için mi ayrılmış veya sistemin RAM'in% 4'ünü kullanamadığı bir donanım sınırlaması mı?

Soru 2 : İlk okumam, kullanıcı çekirdeği alanı için 3: 1'lik bir bölünme olduğunu söylüyor. Neden burası böyle değil?

(3/4)*2097152 =1572864 for user space
(1/4)*2097152 =524288  for kernel space

Linux RAM önbelleklerinin ve tamponlarının farkındayım (en azından bunu anlamak için biraz araştırma çabası harcadım), ama bu durumun bununla hiçbir ilgisi yok, peki ne oluyor?

Yanıtlar:


9

Gerçekten birinde iki soru sormamalısın, ama ...

Soru 1

Bu belleğin bir kısmı çekirdek kodunun kendisi için kullanılır, bazıları saklanır, vb. Çekirdek onu sistem önyükleme iletilerinde dağıtır:

[    0.000000] Memory: 6106920k/7340032k available (3633k kernel code, 1057736k absent, 175376k reserved, 3104k data, 616k init)

"Yok" satırı aslında orada olmayan hafızadır (bu makinede şu anda 6GiB RAM kurulu). Çekirdek ayrıca bellek haritasını da tükürür (bu, önyükleme iletilerinde daha erkendir):

[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000e2c00-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bf77ffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000bf780000-0x00000000bf797fff] ACPI data
[    0.000000] BIOS-e820: [mem 0x00000000bf798000-0x00000000bf7d9fff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x00000000bf7da000-0x00000000bfffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000ffe00000-0x00000000ffffffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000001bfffffff] usable

Daha sonra çekirdek, daha fazla bellek ayıran bu haritaya çeşitli düzeltmeler yapar. Özellikle sürücüler yüklenirken.

soru 2

Çekirdek / kullanıcı bölünmesi, hafızadan değil , sanal adres alanından oluşur . 64 bitlik bir kutuda oldukça alakasız, çünkü dolaşılacak çok fazla adres alanı var.

32 bitlik bir kutuda, sanal adresler 0x00000000–0xBFFFFFFF, kullanıcı adres alanı için kullanıldı. 0xC0000000–0xFFFFFFFF, çekirdek tarafından kullanıldı (bu 3: 1 bölünmüş, diğer seçenekler 2: 2 bölünmüş. Bu sayıların gigabayt olduğunu, bu nedenle 2: 2 değil 1: 1). Sanal adresler de işleme özgüdür (her işlem 0x00001000'de bir sayfaya sahip olabilir ve bu farklı bir sayfadır).

Ancak sanal bir adres belleği bir bayt ile eşleşmiyor Temelde dört şey tarafından desteklenebilir:

  1. Hiçbir şey değil. Sayfa kullanımda değil. Erişmeye çalış, segfault al.
  2. Fiziksel RAM MMU, sanal adresi bir yerdeki bir DIMM'deki kapasitörlere karşılık gelen fiziksel bir adrese çevirir.
  3. Takas (veya hafıza eşlenmiş dosya). Buna erişirseniz, sayfa hatası olur ve çekirdek, verileri belleğe okurken işleminizi askıya alır (ve muhtemelen yer açmak için diske başka veriler yazar). Daha sonra, çekirdek sayfa tablolarını güncelleyerek bunu # 2 durumuna döndürür.
  4. Sıfır sayfa Bu, henüz kullanılmamış, yeni ayrılmış bir sayfadır. Bu durumda, çekirdek bir fiziksel hafıza sayfası bulur (muhtemelen başka şeyleri değiştirir), sıfırlarla doldurun (güvenlik için) ve sonra durum # 2.

Şeffaf büyük sayfalar daha fazla vaka yapar. Muhtemelen unutmuş olduğum birkaç önemli şey daha var ...

Her neyse, 64 bit yongamın 48 bit sanal adres boyutuna sahip. Çekirdeğin hangi bölmeyi kullandığından emin değilim, ancak yarısı bile olsa, bu 36 bitlik fiziksel adres boyutunun üzerinde 47 alandır. 131,072 GiB RAM çok pahalı ... (Ve, daha ucuz hale geldiğinde, 64'te çok fazla bit kaldı, gelecekteki işlemciler muhtemelen daha fazlasına izin vereceklerdir).


nnnk absentBellek satırında hiç farketmedim . Bu donanımınıza özel mi?
ott--

@ ott-- Mine oldukça standart bir Intel i7 kutusudur. Muhtemelen sadece var çünkü> 4GiB RAM (PCI alanından kaynaklanıyor sanırım)
derobert

@derobert Açıklama için teşekkürler, 7340032k dışında, nasıl 6106920k olabilir, bunu doğrulayabilir misiniz? 7340032k-6106920k = 1233112k. Biz (ayrılmış 3633k çekirdek kodu, + 1057736k yoktur, + 175376k + 3104k verileri + 616k init) ekleyin ve 7340032k onu çıkarmak bile, teyit ediniz olabilir fark var hâlâ
öğrenen

Öğrenci toplamı - yok - ayrılmış = kullanılabilir.
derobert

3

Donanım rezervasyonları, özellikle de kendi işlemleri için RAM kullanan yerleşik bir grafik kartınız varsa, az miktarda RAM alacaktır. Bu, tüm işletim sistemlerinde olur.


Hatta virual bir ortamda denedim, ama yine de bir fark var, umarım donanım sınırlaması sanal ortamlarda etkilenmez.
Öğrenci

{Sanal ortamda çalışan yazılım, sanal olmayan durumda olduğu gibi sanal donanım ile iletişim kurmaya ihtiyaç duyar. Yazılım ve donanımın veri alışverişinde bulunabilmesi için bellekte bir alan olması gerekir. Bu bellek bir yerden gelmelidir - gerçek bir aygıt için aygıt üstü RAM veya ana aygıt RAM'i, sanal aygıt için VM belleği.
Gilles

Yerleşik grafik kartının "paylaşılan hafıza" olarak kullandığı hafıza, içinde "çalınan hafıza" olarak rapor edilir dmesg | grep stolen. Derobert'in cevabının açıkladığı gibi, başka bir tür ayrılmış bellek de vardır.
tanius
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.