sanal adres alanında sayfa boyutu nasıl belirlenir?


43

Linux, tüm adreslerin fiziksel adres değil sanal adres olduğu sanal bir bellek sistemi kullanır. Bu sanal adresler işlemci tarafından fiziksel adreslere dönüştürülür.

Bu çeviriyi kolaylaştırmak için, sanal ve fiziksel bellek sayfalara ayrılmıştır. Bu sayfaların her birine benzersiz bir numara verilir; sayfa çerçeve numarası.

Bazı sayfa boyutları 2 KB, 4 KB, vb. Olabilir. Ancak bu sayfa boyut numarası nasıl belirlenir? Mimarinin büyüklüğünden etkileniyor mu? Örneğin, 32 bit veri yolu 4 GB adres alanına sahip olacaktır.

Yanıtlar:


56

Sistemin varsayılan sayfa boyutunu getconfkomutunu kullanarak komutunu sorgulayarak bulabilirsiniz :

$ getconf PAGE_SIZE
4096

veya

$ getconf PAGESIZE
4096

Not: Yukarıdaki birimler genellikle bayt cinsindendir, bu nedenle 4096, 4096 bayta veya 4kB'ye eşittir.

Buradaki Linux çekirdeğinin kaynağında kablo bağlantısı var:

Örnek

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

Vites değişimi size 4096 nasıl veriyor?

Bitleri kaydırırken, 2 ile ikili çarpma yapıyorsunuz. Dolayısıyla bitlerin sola kaydırılması ( 1 << PAGE_SHIFT), 2 ^ 12 = 4096 çarpımını yapıyor.

$ echo "2^12" | bc
4096

2
Modern donanım, 2 MB ve bazı 1 GB sayfa boyutlarını destekler. "PAGE_SHIFT", çekirdek oluşturma için varsayılan olarak 2 MB sayfalarda 21 olarak ayarlanabilir mi?
ReverseFlow

2
@ReverseFlow Böyle bir şeyi yanıtlamak için ayrı bir soru sorardım.
Kirill Bulygin

@sim, neden burada biraz manipülasyon kullanılıyor? Derleyicinin genellikle çarpımları bit manipülasyonlarına dönüştürdüğünü ve dolayısıyla aynı performansı verdiğini okudum.
InAFlash

17

Donanım (özellikle CPU'nun bir parçası olan MMU ) hangi sayfa boyutlarının mümkün olduğunu belirler. İşlemci kayıt büyüklüğü ile hiçbir ilişki yoktur ve yalnızca adres alanı boyutuyla dolaylı bir ilişki yoktur (MMU her ikisini de belirler).

Hemen hemen tüm mimariler 4kB sayfa boyutunu destekler. Bazı mimariler daha büyük sayfaları destekler (ve birkaçı da küçük sayfaları destekler), ancak 4kB çok yaygın bir varsayılandır.

Linux iki sayfa boyutunu destekler:

  • Bazı mimariler diğer değerlere izin gerçi inanıyorum Normal büyüklükteki sayfalar, tüm mimariler üzerinde varsayılan olarak 4KB'den vardır, üzerinde örneğin 16kb ARM64 veya üzerinde 8KB, 16kb veya 64kB IA64 . Bunlar, MMU’daki en derin tanımlayıcı seviyelerine karşılık gelir (Linux’un PTE adını verdiği ).
  • Derlenmişse, büyük sayfalar ( CONFIG_HUGETLB_PAGEgerekli ve CONFIG_HUGETLBFSçoğu kullanım için de gereklidir ). Bu, en derin ikinci MMU tanımlayıcı seviyesine karşılık gelir (Linux'un PMD dediği şey) (ya da en azından genellikle, tüm mimaride geçerli olup olmadığını bilmiyorum).

Sayfa boyutu, bellek kullanımı, bellek kullanımı ve hız arasında bir uzlaşmadır.

  • Daha büyük sayfa boyutu, bir sayfanın kısmen kullanılması durumunda daha fazla atık anlamına gelir, bu nedenle sistem belleği daha erken bitirir.
  • Daha derin bir MMU tanımlayıcı seviyesi, sayfa tabloları için daha fazla çekirdek belleği anlamına gelir.
  • Daha derin bir MMU tanımlayıcı seviyesi, sayfa tablosu geçişinde harcanan daha fazla zaman demektir.

Daha büyük sayfa boyutlarındaki kazançlar çoğu uygulama için küçük, maliyet ise önemli. Bu nedenle çoğu sistem yalnızca normal boyutlu sayfalar kullanır.

Sisteminizde (normal) sayfa boyutunu sorgu getconfveya C işleviyle sorgulayabilirsiniz sysconf.

$ getconf PAGE_SIZE
4096

Çok büyük sayfalar kullanmak , hugetlbfsdosya sistemini ve mmapping dosyalarını oraya yerleştirmeyi gerektirir .


Bilginize: Çok büyük sayfaları kullanmak, hugetlbfs takma işlemini gerektirmez, çünkü alt kısımdaki çekirdek doküman notları paylaşılan hafıza aramalarını veya mmap bayrağını da kullanabilirsiniz. Ayrıca, daha ilginç olanı, şeffaf büyük sayfaları etkinleştirebilirsiniz; ardından çekirdek, tüm uygulamalarda mümkün olduğunda normal sayfaları otomatik olarak büyük sayfalara dönüştürür.
derobert

Bu gerçekten temel bir cevaptır. Linux sadece disk belleği donanımını iyi kullanmak için tasarlanmıştır. Sayfalama hakkında daha fazla ayrıntı: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli,

0

Sayfa boyutu çoğunlukla işlemci mimarisine bağlıdır. X86'da, korumalı modu tanıtan 386 işlemcinin zamanından itibaren, sayfa boyutu 4 kB olmuştur.

X64 modunda, 2 MB boyutunda büyük sayfalar da olabilir. Ancak, bunları kullanmak biraz karmaşıktır.

Sayfa boyutuyla ilgili daha fazla bilgiyi Wikipedia makalesinde bulabilirsiniz.


0

İşlemci mevcut sayfa boyutlarını belirler. Çoğu amaç için, donanımın x86 ve x86_64 işlemcilerinde sayfa boyutu 4kb'dir. Ancak, işletim sistemi isterse bir kerede birden fazla sayfa tahsis edebilir ve böylece 8kb, 16kb veya 32kb sayfaları yazılımda etkin bir şekilde uygulayabilir.

X86 ve x86_64 işlemcileri sırasıyla standart 4kb sayfalarla birlikte 4mb ve 2mb sayfaları da birbirine karıştırabilir. Bu özellik hiç kullanılırsa, çoğunlukla çekirdek alanını tahsis etmek için kullanılır.

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.