GNU/Linux >> Belajar Linux >  >> Linux

Apa itu halaman yang dipetakan memori dan halaman anonim?

Istilah yang benar adalah file yang dipetakan memori dan pemetaan anonim. Saat mengacu pada pemetaan memori, biasanya mengacu pada mmap(2). Ada 2 kategori untuk menggunakan mmap. Satu kategori adalah pemetaan BERSAMA vs SWASTA. Kategori lainnya adalah pemetaan FILE vs ANONYMOUS. Dicampur bersama Anda mendapatkan 4 kombinasi berikut:

  1. PEMETAAN FILE PRIBADI
  2. PEMETAAN FILE BERSAMA
  3. PEMETAAN ANONIM PRIBADI
  4. PEMETAAN ANONIM BERSAMA

Pemetaan File menentukan file, pada disk, yang akan memiliki N banyak byte yang dipetakan ke dalam memori. Fungsi mmap(2) mengambil, sebagai argumen ke-4 sebuah deskriptor file ke file yang akan dipetakan ke dalam memori. Argumen ke-5 adalah jumlah byte yang akan dibaca, sebagai offset. Proses umum menggunakan mmap untuk membuat file yang dipetakan memori berjalan

  1. buka(2) file untuk mendapatkan deskriptor file.
  2. fstat(2) file untuk mendapatkan ukuran dari struktur data deskriptor file.
  3. mmap(2) file menggunakan deskriptor file yang dikembalikan dari open(2).
  4. tutup(2) deskriptor file.
  5. lakukan apa pun pada file yang dipetakan memori.

Saat file dipetakan sebagai PRIVATE, perubahan yang dibuat tidak dilakukan ke file yang mendasarinya. Ini adalah salinan file dalam memori PRIVATE. Ketika sebuah file dipetakan DIBAGIKAN, perubahan yang dilakukan akan dilakukan ke file yang mendasarinya oleh kernel secara otomatis. File yang dipetakan sebagai dibagikan dapat digunakan untuk apa yang disebut Memory Mapped I/O, dan IPC. Anda akan menggunakan file yang dipetakan memori untuk IPC alih-alih segmen memori bersama jika Anda membutuhkan kegigihan file

Jika Anda menggunakan strace(1) untuk melihat proses diinisialisasi, Anda akan melihat bahwa berbagai bagian file dipetakan menggunakan mmap(2) sebagai pemetaan file pribadi. Hal yang sama berlaku untuk lib sistem.

Contoh keluaran dari strace(1) tempat mmap(2) digunakan untuk memetakan pustaka ke proses.

open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=42238, ...}) = 0
mmap(NULL, 42238, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff7ca71e000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY)      = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\356\341n8\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1926760, ...}) = 0
mmap(0x386ee00000, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x386ee00000

Pemetaan anonim tidak didukung oleh file. Untuk lebih spesifik, argumen ke-4 (file descriptor) dan ke-5 (offset) dari mmap(2) bahkan tidak digunakan saat flag MAP_ANONYMOUS digunakan sebagai argumen ke-3 untuk mmap(2). Alternatif untuk menggunakan flag MAP_ANONYMOUS adalah menggunakan /dev/zero sebagai file.

Kata 'Anonim', bagi saya, adalah pilihan yang buruk karena kedengarannya seolah-olah file tersebut dipetakan secara anonim. Sebaliknya, itu adalah file yang anonim, yaitu. tidak ada file yang ditentukan.

Penggunaan untuk pemetaan anonim pribadi sedikit dalam pemrograman tanah pengguna. Anda dapat menggunakan pemetaan anonim bersama sehingga aplikasi dapat berbagi wilayah memori, tetapi saya tidak tahu alasan mengapa Anda tidak menggunakan memori bersama SYSV atau POSIX.

Karena memori yang dipetakan dalam menggunakan pemetaan Anonim dijamin diisi nol, ini dapat berguna untuk beberapa aplikasi yang mengharapkan/mengharuskan daerah memori yang diisi nol untuk menggunakan mmap(2) dengan cara ini alih-alih malloc(2) + memset(2 ) kombo.


Seperti yang saya pahami, halaman anonim dinamai demikian, karena mereka tidak memiliki sumber sistem file bernama, sedangkan halaman yang dipetakan adalah pemetaan file konkret. Misalnya, Anda bisa mendapatkan halaman anonim menggunakan operasi malloc sederhana dalam proses ruang pengguna apa pun...

Tentang struktur kernel:Jelas ini adalah halaman struct , tetapi untuk halaman anonim Anda akan memiliki struct anon_vma duduk di halaman->pemetaan, dan dalam hal halaman yang dipetakan - struct address_space , yang terhubung dengan inode beton.


Linux
  1. Apa itu Tautan Simbolik (Tautan Lunak) dan cara membuatnya di Linux

  2. Apa itu file jarang di Linux

  3. Apa itu file /dev/zero dan /dev/null di Linux?

  1. Untuk apa file .la libtool?

  2. Apa itu file .pid dan apa isinya?

  3. Apa itu `S_ISREG()`, dan apa fungsinya?

  1. Apa itu NFS dan bagaimana cara menginstalnya di Linux

  2. Linux – Apa Memori Tinggi dan Memori Rendah Di Linux?

  3. Apa sebenarnya <() di bash (dan =() di zsh)?