GNU/Linux >> Belajar Linux >  >> Linux

bagaimana ukuran halaman ditentukan dalam ruang alamat virtual?

Anda dapat mengetahui ukuran halaman default sistem dengan menanyakan konfigurasinya melalui getconf perintah:

$ getconf PAGE_SIZE
4096

atau

$ getconf PAGESIZE
4096

CATATAN: Satuan di atas biasanya dalam byte, sehingga 4096 sama dengan 4096 byte atau 4 kB.

Ini tertanam dalam sumber kernel Linux di sini:

Contoh

$ 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))

Bagaimana pergeseran memberi Anda 4096?

Saat Anda menggeser bit, Anda melakukan perkalian biner dengan 2. Jadi efeknya adalah pergeseran bit ke kiri (1 << PAGE_SHIFT ) melakukan perkalian 2^12 =4096.

$ echo "2^12" | bc
4096

Perangkat keras (khususnya, MMU, yang merupakan bagian dari CPU) menentukan ukuran halaman yang memungkinkan. Tidak ada hubungan dengan ukuran register prosesor dan hanya hubungan tidak langsung dengan ukuran ruang alamat (di mana MMU menentukan keduanya).

Hampir semua arsitektur mendukung ukuran halaman 4kB. Beberapa arsitektur mendukung halaman yang lebih besar (dan beberapa juga mendukung halaman yang lebih kecil), tetapi 4kB adalah default yang sangat umum.

Linux mendukung dua ukuran halaman:

  • Halaman berukuran normal, yang menurut saya adalah 4kB secara default pada semua arsitektur, meskipun beberapa arsitektur mengizinkan nilai lain, mis. 16kB pada ARM64 atau 8kB, 16kB atau 64kB pada IA64. Ini sesuai dengan tingkat deskriptor terdalam di MMU (yang disebut Linux PTE).
  • Halaman besar, jika dikompilasi dalam (CONFIG_HUGETLB_PAGE diperlukan, dan CONFIG_HUGETLBFS juga untuk sebagian besar penggunaan). Ini sesuai dengan deskriptor MMU level terdalam kedua (yang disebut Linux sebagai PMD) (atau setidaknya biasanya demikian, saya tidak tahu apakah ini berlaku untuk semua arsitektur).

Ukuran halaman merupakan kompromi antara penggunaan memori, penggunaan memori, dan kecepatan.

  • Ukuran halaman yang lebih besar berarti lebih banyak pemborosan saat halaman digunakan sebagian, sehingga sistem kehabisan memori lebih cepat.
  • Level deskriptor MMU yang lebih dalam berarti lebih banyak memori kernel untuk tabel halaman.
  • Level deskriptor MMU yang lebih dalam berarti lebih banyak waktu dihabiskan dalam penjelajahan tabel halaman.

Keuntungan dari ukuran halaman yang lebih besar kecil untuk sebagian besar aplikasi, sedangkan biayanya besar. Inilah sebabnya kebanyakan sistem hanya menggunakan halaman berukuran normal.

Anda dapat menanyakan ukuran halaman (normal) pada sistem Anda dengan getconf utilitas atau fungsi C sysconf .

$ getconf PAGE_SIZE
4096

Menggunakan halaman besar membutuhkan pemasangan hugetlbfs sistem file dan mmap ping file di sana.


Linux
  1. Seberapa portabel mmap?

  2. malloc mengembalikan memori atau ruang alamat virtual

  3. Bagaimana mengalokasikan memori yang ukuran halamannya selaras?

  1. Bagaimana Mengurutkan Du Output Berdasarkan Ukuran?

  2. Berapa Banyak Ruang Tukar untuk Ditambahkan untuk Oracle Database di Linux

  3. Mengkompilasi kernel Linux, berapa ukuran yang dibutuhkan?

  1. Cara Memeriksa Ruang Disk di Linux

  2. Cara Menginstal RHEL 8 di Mesin Virtual

  3. Bagaimana cara mengakses alamat fisik dari ruang pengguna di Linux?