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:
- Hiçbir şey değil. Sayfa kullanımda değil. Erişmeye çalış, segfault al.
- Fiziksel RAM MMU, sanal adresi bir yerdeki bir DIMM'deki kapasitörlere karşılık gelen fiziksel bir adrese çevirir.
- 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.
- 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 absent
Bellek satırında hiç farketmedim . Bu donanımınıza özel mi?