Sdílet prostřednictvím


Virtuální adresní prostory

Procesory používají virtuální adresy při čtení nebo zápisu do paměťových míst. Během těchto operací procesor přeloží virtuální adresu do fyzické adresy.

Přístup k paměti pomocí virtuálních adres má několik výhod:

  • Program může použít souvislý rozsah virtuálních adres k zajištění přístupu k velké, nesouvislé vyrovnávací paměti ve fyzické paměti.

  • Program může pro přístup k vyrovnávací paměti větší než dostupná fyzická paměť použít rozsah virtuálních adres. Pokud je fyzická paměť nízká, správce paměti ukládá stránky fyzické paměti (obvykle 4 kilobajtů) do souboru disku. Systém podle potřeby přesouvá stránky dat nebo kódu mezi fyzickou pamětí a diskem.

  • Virtuální adresy používané různými procesy jsou izolované. Kód v jednom procesu nemůže změnit fyzickou paměť, kterou používá jiný proces nebo operační systém.

Rozsah virtuálních adres, které jsou k dispozici procesu, se označuje jako virtuální adresní prostor procesu. Každý proces uživatelského režimu má vlastní privátní virtuální adresní prostor.

  • 32bitový proces obvykle obsahuje virtuální adresní prostor v rozsahu 2 gigabajtu 0x00000000 až 0x7FFFFFFF.

  • 64bitový proces v 64bitovém systému Windows má virtuální adresní prostor v rozsahu 128 terabajtů 0x000'000000000 až 0x7FFF'FFFFFFFFFF.

Rozsah virtuálních adres se někdy označuje jako rozsah virtuální paměti. Další informace najdete v tématu omezení paměti a adresního prostoru.

Následující diagram znázorňuje některé klíčové funkce virtuálních adresních prostorů.

Diagram znázorňující virtuální adresní prostory pro dva 64bitové procesy, Notepad.exe a MyApp.exe.

Diagram znázorňuje virtuální adresní prostory pro dva 64bitové procesy: Notepad.exe a MyApp.exe. Každý proces má svůj vlastní virtuální adresní prostor, od 0x000 0000000 až 0x7FF FFFFFFFF. Každý stínovaný blok představuje jednu stránku (velikost 4 kilobajtů) virtuální nebo fyzické paměti. Proces Poznámkového bloku používá tři souvislé stránky virtuálních adres počínaje 0x7F7'93950000. Tyto tři souvislé stránky virtuálních adres se však mapují na nesousádné stránky ve fyzické paměti. Oba procesy také používají stránku virtuální paměti začínající na 0x7F7'93950000, ale tyto virtuální stránky se mapují na různé stránky fyzické paměti.

Uživatelský prostor a systémový prostor

Procesy jako Notepad.exe a MyApp.exe běží v uživatelském režimu. Základní komponenty operačního systému a mnoho ovladačů běží v režimu privilegovaného jádra. Další informace o režimech procesoru naleznete v tématu Režim uživatele a režim jádra.

Každý proces uživatelského režimu má svůj vlastní privátní virtuální adresní prostor, ale veškerý kód, který běží v režimu jádra, sdílí jeden virtuální adresní prostor s názvem systémový prostor. Virtuální adresní prostor pro proces uživatelského režimu se nazývá uživatelský prostor.

V 32bitovém systému Windows je celkový dostupný virtuální adresní prostor 2^32 bajtů (4 gigabajty). Obvykle se pro uživatelské místo používají nižší 2 gigabajty a pro systémové místo se používají horní 2 gigabajty.

Diagram znázorňující rozdělení celkového dostupného virtuálního adresního prostoru v 32bitovém systému Windows do uživatelského prostoru a systémového prostoru.

V 32bitovém systému Windows můžete zadat (při spuštění), že pro uživatelské místo je k dispozici více než 2 gigabajty. To ale znamená, že pro systémový prostor je k dispozici méně virtuálních adres. Velikost uživatelského prostoru můžete zvětšit až na 3 gigabajty a ponechat jen 1 gigabajt pro systémový prostor. Pokud chcete zvětšit velikost uživatelského prostoru, použijte BCDEdit /set increaseuserva.

V 64bitovém systému Windows je teoretická velikost virtuálního adresního prostoru 2^64 bajtů (16 exabajtů), ale ve skutečnosti se používá pouze malá část rozsahu 16-exabajtu.

Kód spuštěný v uživatelském režimu má přístup k uživatelskému prostoru, ale ne k systémovému prostoru. Toto omezení zabraňuje čtení nebo změně datových struktur operačního systému v uživatelském režimu. Kód spuštěný v režimu jádra má přístup k uživatelskému prostoru i systémovému prostoru. To znamená, že kód spuštěný v režimu jádra má přístup k systémovému prostoru a virtuálnímu adresního prostoru aktuálního procesu uživatelského režimu.

Ovladače spuštěné v kernelovém režimu musí být opatrné při přímém čtení z adres v uživatelském prostoru nebo zápisu na ně. Následující scénář ukazuje, proč.

  1. Program v uživatelském režimu zahájí požadavek na čtení některých dat ze zařízení. Program poskytuje počáteční adresu bufferu pro příjem dat.

  2. Rutina ovladače zařízení spuštěná v režimu jádra spustí operaci čtení a vrátí řízení volajícímu.

  3. Později zařízení přeruší aktuálně spuštěné vlákno, které indikuje, že je operace čtení dokončena. Rutiny ovladače režimu jádra zpracovávají přerušení v tomto libovolném vlákně, které patří do libovolného procesu.

  4. V tomto okamžiku ovladač nesmí zapisovat data na počáteční adresu, kterou v kroku 1 poskytl program v uživatelském režimu. Tato adresa je ve virtuálním adresní prostoru procesu, který inicioval požadavek, což pravděpodobně není stejné jako aktuální proces.

Stránkovaný fond a nestránkovaný fond

V uživatelském režimu mohou být všechny stránky fyzické paměti podle potřeby vyřazeny na disk. V systémovém prostoru mohou být některé fyzické stránky odstraněny a jiné ne. Systémový prostor má dvě oblasti pro dynamické přidělování paměti: stránkovaný fond a nestránkový fond.

Paměť alokovaná ve stránkovém fondu může být podle potřeby vystránkována do diskového souboru. Paměť, která je přidělena v nestránkovaném fondu, nelze nikdy přesunout na diskový soubor.

Diagram znázorňující rozdíl mezi přidělením paměti ve stránkovaném fondu.

Uzly zařízení a zásobníky zařízení

uživatelský režim a režim jádra