GNU/Linux >> Znalost Linux >  >> Linux

Jak CPU ví, která fyzická adresa je mapována na kterou virtuální adresu?

MMU přistupuje k tabulce, která popisuje, jak překládat virtuální adresy na fyzické adresy. (Nepotřebuje překládat fyzické adresy na virtuální adresy a to by obecně nebylo možné, protože ke stejné fyzické adrese lze přistupovat přes více virtuálních adres nebo ji lze odmapovat.) Rozvržení této tabulky závisí na architektuře CPU, ale obecný princip je vždy stejný:existuje registr CPU, který obsahuje fyzickou adresu tabulky, která obsahuje fyzické adresy dalších tabulek a tak dále (pro 2 až 4 úrovně celkem na existujících architekturách), dokud není úroveň tabulek který obsahuje fyzické adresy, kde se data nacházejí. Na každé úrovni je to, který prvek tabulky použít, určen některými bity ve virtuální adrese.

MMU nezná procesy operačního systému jako takové. Když se CPU přepne na provádění jiného procesu, tj. když dojde k přepnutí kontextu, je úkolem kódu přepínání kontextu operačního systému podle potřeby aktualizovat tabulky MMU. V praxi si myslím, že všechny unixové systémy uchovávají kopii tabulek v paměti pro každý proces a pouze aktualizují registr MMU, aby ukazoval na tabulku nejvyšší úrovně pro aktuální proces.

Ve skutečnosti existuje část MMU, která se stará o procesy operačního systému:TLB. Vyhledávání položek v tabulce MMU je poměrně nákladné, protože zahrnuje více přístupů do paměti. TLB je mezipaměť těchto vyhledávání. Při přepnutí kontextu musí operační systém zneplatnit TLB (tj. odstranit všechny položky mezipaměti), protože mapování bude pro nový proces odlišné. Mnoho architektur umožňuje operačního systému vložit do každé položky tabulky MMU indikátor, který říká „tento záznam patří procesu N“. Záznam TLB je pak přeskočen, pokud číslo procesu, které obsahuje, není aktuálním číslem procesu. Registr CPU obsahuje aktuální číslo procesu a kód přepínače kontextu jej aktualizuje. Tento mechanismus znamená, že TLB může obsahovat informace o více procesech najednou, což zlepšuje výkon při přepínání tam a zpět mezi těmito procesy. Protože k uložení N je často k dispozici méně bitů, než je potřeba k uložení všech ID procesů operačního systému, N není ID procesu, ale číslo vygenerované operačním systémem pro tento účel, které se v průběhu času mění, pokud se vůbec používá.


V Linuxu jádro udržuje tříúrovňovou tabulku stránek (bez ohledu na možnosti CPU). Nejvyšší úrovní je globální adresář stránky a každý proces má svůj vlastní adresář pgd v mm_struct . Každý proces tedy může mít svá vlastní mapování, takže adresa 12345 v různých procesech ukazuje na různé fyzické adresy.

Procesory si CPU ve skutečnosti neuvědomují, ale mají tendenci mít funkce, které je podporují. Na CPU ve stylu x86 existují různé funkce související s úlohami, ale ve skutečnosti mají tendenci být ignorovány. Vzhledem k tomu, že plánování procesů je řízeno jádrem, může samo sledovat změny v tabulce stránek a aktualizovat jakýkoli stav CPU, který je nutný k přepnutí na tabulku stránek nového procesu při přepínání úloh. Na počítačích x86 to zahrnuje aktualizaci řídicího registru CR3, který ukazuje na adresář stránky.

Kapitola Správa tabulky stránek v Pochopení správce virtuální paměti Linux Mela Gormana kniha poskytuje dobrý přehled.


Linux
  1. Jak omezit využití CPU procesu v Linuxu

  2. Jak identifikovat proces, který nemá PID?

  3. Jak funguje příkaz ps?

  1. Jak Sticky Bit funguje?

  2. Linux – Jak se Oom Killer rozhodne, který proces zabije jako první?

  3. Jak funguje Tee Command?

  1. Jak příkaz Xdg-open ví, kterou aplikaci použít k otevření souboru?

  2. Jak získat informace o virtuálním/fyzickém CPU v Oracle VM (XEN)

  3. Jak programově získat velikost stránky mezipaměti CPU v C++?