Linux'ta yüksek bellek ve düşük bellek nedir?


92

Highmem ve Lowmem arasındaki farkla ilgileniyorum:

  1. Neden böyle bir farklılaşma var?
  2. Bunu yaparak ne kazanıyoruz?
  3. Her birinin hangi özellikleri var?

@hiro, "HIGHMEM", ldd3 tarafından tanımlandığı gibi "çekirdek sanal adres" anlamına geliyor. Size katılıyorum. kafa karıştırıcı, ldd3 "LOWMEM", "HIGHMEM", ayrıca "sanal çekirdek adresi", "çekirdek mantık adresi" olarak tanımlandı. Onlar aynı şey, ama farklı bir adı var. Bu, yazılımın "güzelliği" dir, dile göre tanımlanmıştır.
steve

Yanıtlar:


69

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 .


Bu eski ve buralarda olduğundan emin değilim. Ancak bir şey sormak istiyorum: çekirdek alandaki 128 MB ayrılmış (yüksek bellek erişimi için), kullanıcı alanı bellek alanının tüm referansları mı? Böylece, bir çekirdek işlemi bu alana bakarak herhangi bir kullanıcı alanına erişebilir, değil mi?
Amumu

1
Neden hep 1 / 4'lerde? Yani neden 5/1 veya başka bir şey bölemediniz?
mgalgs

Burada "doğrudan erişim" tam olarak ne anlama geliyor? Demek istediğim, çekirdeğin kendisine sanal bellek mekanizması ile erişilmesi mümkün değil mi?
telenn

1
Yüksek / düşük bellek hakkında söylediklerinizin yanlış olduğuna inanıyorum: Saf bir 32bit sistemde, çekirdeğin tam 3GB kullanıcı alanına doğrudan erişebildiğine inanıyorum (çekirdek, çekirdek alanına ve kullanıcı alanına erişebilir). Ancak bir PAE çekirdeğiniz varsa, işler daha karmaşık hale gelirse, şimdi 3 GB RAM'den fazlasına sahipsiniz, her işlem 3 GB olabilir ve kullanıcı alanının tamamına doğrudan erişemezsiniz. Çekirdek alanındaki yüksek mem ve 128 MB'lık belleğin girdiği yer burasıdır. 64bit çekirdekte, çekirdeğin tüm kullanıcı alanlarına erişilebildiği için, yüksek erkeklerde bir kez daha kolaylaşmaz.
ctrl-alt-delor

2
@mgalgs ¼, 2/4 ve ¾ yalnızca açık bir varsayılan seçenek grubuydu. 2007'den beri 5/16 ve 15 / 32. seçilebilir. Hangi #define satırını düzenlemeyi biliyorsanız, kendinize ait neredeyse rastgele bir bölümü seçebilirsiniz.
jørgensen

28

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_atomickısıtlamalar ekledi ancak çok işlemcili makinelerde daha verimli, çünkü daha hassas taneli kilitleme kullanıyor. Elde edilen işaretçi kmapbir 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 kmaptekrar arama kadar sayfanın içeriğine erişilemez .


2
Cevabınız için teşekkürler Gilles .. Ama yine de tüm kavramı alamıyorum. Lütfen içindeki bilgileri azaltmadan biraz daha basit olabilir misiniz?
Sen

17

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:


4

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.


3

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.


0

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.

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.