Highmem ve Lowmem arasındaki farkla ilgileniyorum:
32 bit mimaride, RAM adresleme için adres alanı aralığı:
0x00000000 - 0xffffffff
veya
4'294'967'295 (4 CİGABAYT).
Linux çekirdeği 3/1 oranında yükselir (ayrıca 2/2 veya 1/3 olabilir) 1) kullanıcı alanına (yüksek bellek) ve çekirdek alanına (düşük bellek).
Kullanıcı alanı aralığı:
0x00000000 - 0xbfffffff
Her yeni ortaya çıkan kullanıcı işlemi bu alanın içinde bir adres (aralık) alır. Kullanıcı işlemleri genellikle güvenilir değildir ve bu nedenle çekirdek alanına erişmek yasaktır. Ayrıca, acil olmayan olarak kabul edilirler, genel bir kural olarak, çekirdek bu süreçlere bellek tahsisini ertelemeye çalışır.
Çekirdek alanı aralığı:
0xc0000000 - 0xffffffff
Bir çekirdek işlemleri adresini (aralığını) buraya alır. Çekirdek bu 1 GB adreslere doğrudan erişebilir (tam 1 GB değil, yüksek bellek erişimi için 128 MB ayrılmıştır).
Çekirdek alanında ortaya çıkan süreçler güvenilir, acil ve hatasız kabul edilir, bellek isteği anında işlenir.
Her çekirdek işlemi isterse kullanıcı alanı aralığına da erişebilir. Bunu başarmak için, çekirdek kullanıcı alanından (yüksek bellek) bir adrese çekirdek alanına (düşük bellek) bir adres eşler, yukarıda belirtilen 128 MB özellikle bunun için ayrılmıştır.
1 Bölmenin 3/1, 2/2 veya 1/3 olup olmadığı
CONFIG_VMSPLIT_... seçeneği; muhtemelen
/boot/config* çekirdeğiniz için hangi seçeneğin seçildiğini görmek için.
İdeal bir dünyada, her sistem bileşeni erişmek için ihtiyaç duyduğu tüm belleği eşleyebilir. Ve bu, Linux ve çoğu işletim sistemindeki işlemler için geçerlidir: 32 bit bir işlem yalnızca 2 ^ 32 bayttan az sanal belleğe erişebilir (aslında tipik bir Linux 32 bit mimarisinde yaklaşık 3 GB). Sistemin yürüttüğü çağrının tüm belleğini, ayrıca tüm fiziksel belleği ve diğer bellek eşlemeli donanım cihazlarını eşleştirmesi gereken çekirdek için zorlaşır.
Bu nedenle, 32 bitlik bir çekirdeğin 4 GB'den fazla belleği eşlemesi gerektiğinde, yüksek bellek desteği ile derlenmelidir. Yüksek bellek, çekirdeğin adres alanında kalıcı olarak eşlenmeyen bellektir. (Düşük bellek tam tersidir: her zaman eşlenir, böylece yalnızca bir işaretçiyi kaydırarak çekirdeğe erişebilirsiniz.)
Çekirdek kodundan yüksek belleğe eriştiğinizde, sayfa veri yapısından bir işaretçi elde etmek için önce
kmap öğesini aramanız gerekir (
struct page).
kmap çağrıldığında sayfa yüksek veya düşük bellekte olsun. Ayrıca birde şu var
kmap_atomic kısıtlamalar ekledi, ancak daha ince taneli kilitleme kullandığından çok işlemcili makinelerde daha verimli.
kmap aracılığıyla elde edilen işaretçi bir kaynaktır: adres alanını kullanır. İşiniz bittiğinde,
kunmap (veya
kunmap_atomic) bu kaynağı serbest bırakmak; imleç artık geçerli değildir ve siz
kmap tekrar aranana kadar sayfanın içeriğine erişilemez.
Bu Linux çekirdeği ile ilgilidir; Herhangi bir Unix çekirdeğinin bunu nasıl hallettiğinden emin değilim.
Yüksek Bellek, kullanıcı alanı programlarının ele alabileceği bellek bölümüdür. Düşük Bellek'e dokunamaz.
Düşük Bellek, Linux çekirdeğinin doğrudan ele alabileceği bellek bölümüdür. Çekirdeğin Yüksek Belleğe erişmesi gerekiyorsa, önce kendi adres alanına eşlemesi gerekir.
Son zamanlarda, segmentin nerede olduğunu kontrol etmenizi sağlayan bir yama eklendi. Bunun karşılığı, adreslenebilir belleği kullanıcı alanından uzaklaştırabilmenizdir, böylece çekirdek kullanmadan önce eşlemek zorunda kalmayacağı daha fazla belleğe sahip olabilir.
Ek kaynaklar:
HIGHMEM, çekirdeğin bellek alanıdır, ancak eriştiğiniz bellek DEĞİLDİR, ancak erişmek istediğiniz şeyi koyduğunuz bir yerdir.
Tipik bir 32bit Linux sanal bellek haritası aşağıdaki gibidir:
0x00000000-0xbfffffff: kullanıcı işlemi (3GB)
0xc0000000-0xffffffff: çekirdek alanı (1 GB)
(CPU'ya özgü vektör ve burada yok sayılır).
Linux, 1GB çekirdek alanını LOWMEM ve HIGHMEM olmak üzere 2 parçaya böler. Bölme, kurulumdan kuruluma değişir.
Bir kurulum DÜŞÜK ve YÜKSEK modemler için 512MB-512MB seçerse, 512MB LOWMEM (0xc0000000-0xdfffffff) çekirdek önyükleme zamanında statik olarak eşlenir; genellikle fiziksel belleğin ilk çok baytı bu amaçla kullanılır, böylece bu aralıktaki sanal ve fiziksel adresler sabit bir ofsete, örneğin 0xc0000000'e sahiptir.
Öte yandan, 512MB (HIGHMEM) statik haritalamaya sahip değildir (ancak sayfaları orada kalıcı olarak eşlenmiş olarak bırakabilirsiniz, ancak bunu sürücü kodunuzda açıkça yapmanız gerekir). Bunun yerine, sayfalar burada geçici olarak eşlenir ve eşleştirilir, böylece bu aralıktaki sanal ve fiziksel adreslerin tutarlı bir eşlemesi olmaz. HIGHMEM'in tipik kullanımları arasında tek seferlik veri tamponları bulunur.
Hatırladığım kadarıyla, uygulama alanı için "Yüksek Bellek" ve çekirdek için "Düşük Bellek" kullanılır.
Avantajı (kullanıcı alanı) uygulamalarının çekirdek alanı belleğine erişememesidir.
Birçok kişi, düşük belleğin işletim sistemi için olduğunu söyledi. Bu genellikle doğrudur ancak olmak zorunda değildir. Yüksek bellek ve düşük bellek, bellek alanının sadece iki bölümüdür, ancak Linux sisteminde düşük bellek yalnızca çekirdek ve kullanıcı işlemleri için yüksek bellek içindir.
"Dinozor kitabı (işletim sistemi kavramları)" ne göre, işletim sistemini düşük belleğe veya yüksek belleğe yerleştirebiliriz. Bu kararı etkileyen en önemli faktör kesinti vektörünün konumudur. Kesme vektörü genellikle düşük bellekte olduğundan, programcılar genellikle işletim sistemini de düşük belleğe yerleştirir.