bagaimana ukuran halaman ditentukan dalam ruang alamat virtual?

43

Linux menggunakan sistem memori virtual di mana semua alamat adalah alamat virtual dan bukan alamat fisik. Alamat virtual ini dikonversi menjadi alamat fisik oleh prosesor.

Untuk mempermudah terjemahan ini, memori virtual dan fisik dibagi menjadi beberapa halaman. Masing-masing halaman ini diberi nomor unik; nomor bingkai halaman.

Beberapa ukuran halaman bisa 2 KB, 4 KB, dll. Tetapi bagaimana cara menentukan ukuran ukuran halaman ini? Apakah itu dipengaruhi oleh ukuran arsitektur? Misalnya, bus 32-bit akan memiliki ruang alamat 4 GB.

JohnMerlino
sumber

Jawaban:

56

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

$ getconf PAGE_SIZE
4096

atau

$ getconf PAGESIZE
4096

CATATAN: Unit-unit di atas biasanya dalam byte, sehingga 4096 setara dengan 4096 byte atau 4kB.

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 4.096?

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

$ echo "2^12" | bc
4096
slm
sumber
2
Perangkat keras modern mendukung 2MB, dan beberapa 1GB, ukuran halaman. Bisakah "PAGE_SHIFT" disetel ke 21 untuk halaman 2MB sebagai default untuk pembuatan kernel?
ReverseFlow
2
@ ReverseFlow Untuk menjawab hal seperti itu, saya akan mengajukan pertanyaan terpisah.
Kirill Bulygin
@sim, bertanya-tanya mengapa manipulasi bit digunakan di sini? saya membaca bahwa kompiler biasanya mengubah perkalian menjadi manipulasi bit, karenanya memberikan kinerja yang sama.
InAFlash
17

Perangkat keras (khususnya, MMU , yang merupakan bagian dari CPU) menentukan ukuran halaman apa yang mungkin. Tidak ada hubungan dengan ukuran register prosesor dan hanya hubungan tidak langsung dengan ukuran ruang alamat (dalam hal 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 standar yang sangat luas.

Linux mendukung dua ukuran halaman:

  • Halaman berukuran normal, yang saya percaya adalah 4kB secara default pada semua arsitektur, meskipun beberapa arsitektur memungkinkan nilai-nilai lain, misalnya 16kB pada ARM64 atau 8kB, 16kB atau 64kB pada IA64 . Ini sesuai dengan level deskriptor terdalam pada MMU (apa yang disebut Linux PTE ).
  • Halaman besar , jika dikompilasi ( CONFIG_HUGETLB_PAGEdiperlukan, dan CONFIG_HUGETLBFSjuga untuk sebagian besar kegunaan). Ini sesuai dengan level terdalam kedua dari deskriptor MMU (apa yang disebut Linux PMD) (atau setidaknya biasanya, saya tidak tahu apakah ini berlaku pada semua arsitektur).

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

  • Ukuran halaman yang lebih besar berarti lebih banyak pemborosan ketika 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 yang dihabiskan dalam traversal tabel halaman.

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

Anda dapat query (normal) ukuran halaman di sistem anda dengan getconfutilitas atau fungsi C sysconf.

$ getconf PAGE_SIZE
4096

Menggunakan halaman besar membutuhkan pemasangan sistem hugetlbfsfile dan mmapping file di sana.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
FYI: Menggunakan halaman besar tidak memerlukan pemasangan hugetlbfs, karena kernel doc mencatat di bagian bawah Anda juga dapat menggunakan panggilan memori bersama atau flag mmap. Selain itu, yang lebih menarik, Anda dapat mengaktifkan halaman transparan yang besar, maka kernel akan secara otomatis mengkonversi halaman normal ke halaman besar jika memungkinkan di semua aplikasi.
derobert
Ini adalah jawaban yang sangat mendasar. Linux hanya dirancang untuk menggunakan perangkat keras paging dengan baik. Lebih detail tentang paging: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
0

Ukuran halaman sebagian besar tergantung pada arsitektur prosesor. Pada x86, dari masa prosesor 386 yang memperkenalkan mode terlindungi, ukuran halaman adalah 4 kB.

Dalam mode x64, ada juga halaman besar, yang berukuran 2 MB. Namun, menggunakan itu agak rumit.

Anda dapat menemukan informasi lebih lanjut tentang ukuran halaman di artikel Wikipedia

Tero Kilkanen
sumber
0

Prosesor menentukan ukuran halaman yang tersedia. Untuk sebagian besar tujuan, perangkat keras yang menerapkan ukuran halaman pada prosesor x86 dan x86_64 adalah 4kb. Namun, sistem operasi dapat mengalokasikan lebih dari satu halaman sekaligus jika diinginkan, dan dengan demikian secara efektif mengimplementasikan halaman 8kb, 16kb, atau 32kb dalam perangkat lunak.

Prosesor x86 dan x86_64 masing-masing juga dapat memadukan halaman 4mb dan 2mb bersama dengan halaman standar 4kb. Jika kemampuan itu digunakan sama sekali, sebagian besar akan digunakan untuk mengalokasikan ruang kernel.

Leslie
sumber