Highmem ve Lowmem arasındaki farkla ilgileniyorum:
- Neden böyle bir farklılaşma var?
- Bunu yaparak ne kazanıyoruz?
- Her birinin hangi özellikleri var?
Highmem ve Lowmem arasındaki farkla ilgileniyorum:
Yanıtlar:
32 bit mimaride, RAM adresleme için adres alanı aralığı:
0x00000000 - 0xffffffff
veya 4'294'967'295
(4 GB).
Linux çekirdeği, sırasıyla 3/1 (2/2 veya 1/3 1 ) kullanıcı alanına (yüksek bellek) ve çekirdek alanına (düşük bellek) ayrılır.
Kullanıcı alanı aralığı:
0x00000000 - 0xbfffffff
Yeni doğmuş her kullanıcı işlemi bu alanın içinde bir adres (aralık) alır. Kullanıcı süreçleri genellikle güvenilmezdir ve bu nedenle çekirdek alanına erişmek yasaktır. Ayrıca, acil olmayanlar olarak kabul edilirler, genel bir kural olarak, çekirdek, bu işlemlere bellek tahsisini ertelemeye çalışır.
Çekirdek uzay aralığı:
0xc0000000 - 0xffffffff
Bir çekirdek işlemleri burada adresini (menzilini) alır. Çekirdek bu 1 GB'lik adrese doğrudan erişebilir (tam 1 GB değil, yüksek bellek erişimi için ayrılmış 128 MB vardır).
Çekirdek uzayda ortaya çıkan işlemler güvenilir, acil ve hatasız kabul edilir, bellek talebi anında işleme alınır.
Her çekirdek işlemi, isterse kullanıcı alanı aralığına da erişebilir. Ve bunu başarmak için, çekirdek kullanıcı alanından (yüksek bellek) ç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 olması CONFIG_VMSPLIT_...
seçenek ile kontrol edilir ; /boot/config*
Çekirdeğiniz için hangi seçeneğin seçildiğini görmek için büyük olasılıkla işaretleyebilirsiniz .
Başvurulacak ilk referans Linux Aygıt Sürücüleridir (hem çevrimiçi hem de kitap şeklinde mevcuttur), özellikle konuyla ilgili bir bölümü olan 15. bölüm.
İdeal bir dünyada, her sistem bileşeni erişmesi gereken tüm hafızayı haritalayabilecekti. Ve bu Linux ve çoğu işletim sistemindeki süreçler için geçerlidir: 32 bitlik bir işlem yalnızca 2 ^ 32 bayt sanal belleğin (aslında tipik bir Linux 32 bit mimarisinde 3GB civarında) sanal belleğin 2 ^ 32 baytından daha azına erişebilir. Sistemi çağıran sürecin tüm hafızasını, tüm fiziksel hafızayı ve diğer hafıza haritalı donanım cihazlarını haritalayabilmesi gereken çekirdek için zorlaşır.
Bu nedenle, 32 bit bir çekirdeğin 4 GB'den fazla belleği eşlemesi gerektiğinde, yüksek bellek desteğiyle derlenmelidir. Yüksek bellek, çekirdeğin adres alanında kalıcı olarak eşlenmemiş bir bellektir. (Düşük bellek tam tersidir: her zaman eşlenir, böylece çekirdeğe yalnızca bir işaretçiyi silerek de erişebilirsiniz.)
Çekirdek kodundan yüksek belleğe eriştiğinizde kmap
, bir sayfa veri yapısından ( struct page
) bir işaretçi almak için önce onu aramanız gerekir . Arama kmap
, sayfanın yüksek veya düşük hafızada olup olmadığına bakar. Ayrıca bazı kmap_atomic
kısıtlamalar ekledi ancak çok işlemcili makinelerde daha verimli, çünkü daha hassas taneli kilitleme kullanıyor. Elde edilen işaretçi kmap
bir kaynaktır: adres alanı kullanır. Bununla işiniz bittiğinde, bu kaynağı serbest bırakmak için aramanız kunmap
(veya kunmap_atomic
) yapmanız gerekir ; daha sonra işaretçi artık geçerli değildir ve siz kmap
tekrar arama kadar sayfanın içeriğine erişilemez .
Bu Linux çekirdeği ile ilgilidir; Unix çekirdeğinin bunu nasıl ele aldığından emin değilim.
Yüksek Bellek, kullanıcı alanı programlarının adresleyebileceği bellek parçasıdır. Düşük Belleğ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 kullanıma sunuldu. Değişken, adreslenebilir belleği kullanıcı alanından uzaklaştırabilmenizdir, böylece çekirdek kullanmadan önce eşlemesi gerekmeyen daha fazla belleğe sahip olabilir.
Ek kaynaklar:
HIGHMEM bir dizi çekirdek bellek alanıdır, ancak eriştiğiniz bellek DEĞİLDİR, ancak erişmek istediğinizi koyduğunuz bir yer.
Tipik bir 32bit Linux sanal bellek haritası şöyledir:
0x00000000-0xbfffffff: kullanıcı işlemi (3GB)
0xc0000000-0xffffffff: çekirdek alanı (1GB)
(CPU'ya özgü vektör ve burada herhangi bir şekilde göz ardı edilir).
Linux, 1GB çekirdek alanını LOWMEM ve HIGHMEM olmak üzere 2 parçaya ayırır. Bölünmüş kurulumdan kuruluma değişir.
Bir kurulum, LOW ve HIGH memeleri için 512MB-512MB'yi seçerse, 512MB LOWMEM (0xc0000000-0xdfffffff) çekirdek önyükleme zamanında statik olarak eşlenir; genellikle fiziksel belleğin ilk bu kadar baytı, bu aralıktaki sanal ve fiziksel adreslerin 0xc0000000 gibi sabit bir kaymaya sahip olması için kullanılır.
Öte yandan, son 512 MB (HIGHMEM) statik eşleme içermez (sayfalar orada yarı kalıcı olarak eşlenmiş halde bırakılabilir, ancak bunu sürücü kodunuzda açıkça yapmanız gerekir). Bunun yerine, sayfalar geçici olarak eşlenir ve burada eşleştirilmez; böylece bu aralıktaki sanal ve fiziksel adreslerin tutarlı bir eşlemesi olmaz. HIGHMEM'in tipik kullanımları, tek seferlik veri tamponlarını içerir.
Birçok insan düşük hafızanın 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 kullanıcı işlemleri için çekirdek ve yüksek bellek içindir.
"Dinozor kitabı (işletim sistemi kavramları)" na göre, işletim sistemini düşük ya da yüksek belleğe yerleştirebiliriz. Bu kararı etkileyen en önemli faktör, kesme vektörünün yeridir. Kesme vektörü genellikle düşük bellekte olduğundan, programcılar genellikle işletim sistemini de düşük belleğe yerleştirir.