GNU/Linux >> Znalost Linux >  >> Linux

Co je to stránka mapovaná v paměti a anonymní stránka?

Správné termíny jsou soubory mapované v paměti a anonymní mapování. Když se odkazuje na mapování paměti, obvykle se odkazuje na mmap(2). Existují 2 kategorie pro použití mmap. Jedna kategorie je SDÍLENÁ vs. SOUKROMÁ mapování. Další kategorií je mapování FILE vs. ANONYMNÍ. Smícháním dohromady získáte 4 následující kombinace:

  1. MAPOVÁNÍ SOUKROMÝCH SOUBORŮ
  2. MAPOVÁNÍ SDÍLENÝCH SOUBORŮ
  3. SOUKROMÉ ANONYMNÍ MAPOVÁNÍ
  4. SDÍLENÉ ANONYMNÍ MAPOVÁNÍ

Mapování souborů určuje soubor na disku, který bude mít N mnoho bajtů namapovaných do paměti. Funkce mmap(2) bere jako svůj 4. argument deskriptor souboru k souboru, který má být mapován do paměti. Pátý argument je počet bajtů, které mají být načteny, jako offset. Typický proces použití mmap k vytvoření souboru mapovaného v paměti je

  1. otevřete(2) soubor a získejte deskriptor souboru.
  2. fstat(2) soubor pro získání velikosti z datové struktury deskriptoru souboru.
  3. mmap(2) soubor používající deskriptor souboru vrácený z open(2).
  4. zavřete(2) deskriptor souboru.
  5. udělejte se souborem mapovaným v paměti cokoli.

Když je soubor namapován jako PRIVATE, provedené změny se neprojeví v podkladovém souboru. Jedná se o PRIVÁTNÍ kopii souboru uloženou v paměti. Když je soubor mapován SHARED, provedené změny jsou automaticky potvrzeny jádrem základního souboru. Soubory namapované jako sdílené lze použít pro to, co se nazývá Memory Mapped I/O a IPC. Pokud potřebujete trvalost souboru, použili byste pro IPC soubor mapovaný v paměti místo segmentu sdílené paměti

Pokud používáte strace(1) ke sledování inicializace procesu, všimnete si, že různé části souboru jsou mapovány pomocí mmap(2) jako soukromé mapování souborů. Totéž platí pro systémové knihovny.

Příklady výstupu ze strace(1), kde se mmap(2) používá k mapování v knihovnách k procesu.

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

Anonymní mapování nejsou podložena souborem. Abychom byli konkrétní, 4. (deskriptor souboru) a 5. (offset) argument mmap(2) nejsou ani použity, když je příznak MAP_ANONYMOUS použit jako 3. argument mmap(2). Alternativou k použití příznaku MAP_ANONYMOUS je použití /dev/zero jako souboru.

Slovo 'Anonymní' je pro mě špatná volba, protože to zní, jako by byl soubor mapován anonymně. Místo toho je to soubor, který je anonymní, tzn. není zadán soubor.

Využití pro soukromé anonymní mapování je v programování uživatelských pozemků málo. Můžete použít sdílené anonymní mapování, aby aplikace mohly sdílet oblast paměti, ale neznám důvod, proč byste místo toho nepoužívali sdílenou paměť SYSV nebo POSIX.

Protože je zaručeno, že paměť mapovaná pomocí anonymních mapování bude vyplněna nulou, mohlo by být užitečné pro některé aplikace, které očekávají/vyžadují oblasti paměti s nulovým vyplněním, použít mmap(2) tímto způsobem namísto malloc(2) + memset(2). ) kombinace.


Jak jsem pochopil, anonymní stránky se tak jmenují, protože nemají pojmenovaný zdroj souborového systému, zatímco mapované stránky jsou mapováním konkrétního souboru. Anonymní stránky můžete například získat pomocí jednoduché operace malloc v jakémkoli procesu v uživatelském prostoru...

O strukturách jádra:Samozřejmě je to Stránka struktur , ale v případě anonymních stránek budete mít struct anon_vma sedí v page->mapování a v případě mapovaných stránek - struct address_space , který je spojen s betonovým inodem.


Linux
  1. Jaké další miniatury jsou k dispozici a jak je nainstalovat?

  2. Co jsou symbolické odkazy (Soft Links) a jak je vytvořit pod Linuxem

  3. Co jsou řídké soubory v Linuxu

  1. Jaký je rozdíl mezi zápisem do souboru a namapovanou pamětí?

  2. Co je to `S_ISREG()` a co dělá?

  3. Co přesně je <() v bash (a =() v zsh)?

  1. Co je NFS a jak jej nainstalovat na Linux

  2. Linux – Co je velká a nízká paměť v Linuxu?

  3. K čemu jsou Inody dobré?