it-swarm-eu.dev

Co je v systému Linux vysoká a nízká paměť?

Zajímá mě rozdíl mezi Highmem a Lowmem:

  1. Proč existuje takové rozlišení?
  2. Co tím získáme?
  3. Jaké funkce má každý?
94
Sen

V 32bitové architektuře je rozsah adresového prostoru pro adresování RAM:

0x00000000 - 0xffffffff

nebo 4'294'967'295 (4 GB).

Linuxové jádro se rozdělí na 3/1 (může být také 2/2 nebo 1/3 1) do uživatelského prostoru (vysoká paměť) a jádra (nízká paměť).

Rozsah uživatelského prostoru:

0x00000000 - 0xbfffffff

Každý nově vytvořený uživatelský proces dostane uvnitř této oblasti adresu (rozsah). Uživatelské procesy jsou obecně nedůvěryhodné, a proto je jim zakázán přístup do prostoru jádra. Dále se pokládají zpravidla za neodkladné, jádro se pokouší odložit přidělení paměti těmto procesům.

Rozsah jaderného prostoru:

0xc0000000 - 0xffffffff

Procesy jádra zde získají svoji adresu (rozsah). Jádro má přímý přístup k této 1 GB adres (dobře, ne k plné 1 GB, existuje 128 MB vyhrazeno pro přístup k vysoké paměti).

Procesy vytvořené v prostoru jádra jsou důvěryhodné, urgentní a předpokládané bezchybné, požadavek na paměť je okamžitě zpracován.

Každý proces jádra má také přístup k rozsahu uživatelských prostorů, pokud si to přeje. Aby toho bylo dosaženo, mapuje jádro adresu z uživatelského prostoru (vysoká paměť) do svého jaderného prostoru (nízká paměť), výše uvedených 128 MB je pro to zvláště vyhrazeno.


1 Zda je rozdělení 3/1, 2/2 nebo 1/3, je ovládáno pomocí CONFIG_VMSPLIT_... volba; pravděpodobně se můžete podívat pod /boot/config*, abyste viděli, která volba byla vybrána pro vaše jádro.

70
wag

První odkaz, na který se obrátit, je Linux Device Drivers (k dispozici online i v knižní podobě), zejména kapitola 15 , která obsahuje sekci na toto téma.

V ideálním světě by každá součást systému mohla mapovat veškerou paměť, kterou kdy potřebuje k přístupu. A to je případ procesů v Linuxu a většině operačních systémů: 32bitový proces může přistupovat k virtuální paměti méně než 2 ^ 32 bajtů (ve skutečnosti asi 3 GB na typické 32bitové architektuře Linux). Pro jádro, které musí být schopné mapovat celou paměť procesu, jehož systémové volání je spuštěno, plus celou fyzickou paměť, plus jakékoli jiné hardwarové zařízení mapované v paměti, je obtížné.

Pokud tedy 32bitové jádro potřebuje mapovat více než 4 GB paměti, musí být kompilováno s podporou vysoké paměti. Vysoká paměť je paměť, která není trvale mapována v adresním prostoru jádra. (Nízká paměť je opak: vždy je mapována, takže k ní máte přístup v jádru jednoduše dereferencí ukazatele.)

Když přistupujete k vysoké paměti z kódu jádra, musíte nejprve zavolat kmap, abyste získali ukazatel ze struktury dat stránky (struct page). Volání kmap funguje, ať je stránka ve vysoké nebo nízké paměti. K dispozici je také kmap_atomic, které přidalo omezení, ale je účinnější na počítačích s více procesory, protože používá jemnější zrnitost. Ukazatel získaný prostřednictvím kmap je zdroj: využívá nahoru adresní prostor. Jakmile s tím skončíte, musíte zavolat kunmap (nebo kunmap_atomic) uvolnit tento zdroj; potom ukazatel již není platný a k obsahu stránky nelze přistupovat, dokud nezavoláte znovu kmap.

To je důležité pro linuxové jádro; Nejsem si jistý, jak to zvládne nějaké jádro Unixu.

Vysoká paměť je segment paměti, který mohou programy uživatelského prostoru řešit. Nemůže se dotknout Low Memory.

Nízká paměť je segment paměti, který může jádro Linuxu adresovat přímo. Pokud jádro musí přistupovat k vysoké paměti, musí ji nejprve namapovat do svého vlastního adresního prostoru.

Nedávno byla zavedena oprava, která vám umožní kontrolovat, kde je segment. Kompromisem je, že adresovatelnou paměť můžete odebrat z uživatelského prostoru, takže jádro může mít více paměti, kterou před použitím nemusí mapovat.

Dodatečné zdroje:

17
Shawn J. Goff

HIGHMEM je řada paměťového prostoru jádra, ale NENÍ to přístup k paměti, ale je to místo, kam umístíte to, co chcete získat.

Typická mapa 32bitové virtuální paměti Linux je podobná:

  • 0x00000000-0xbfffffff: uživatelský proces (3 GB)

  • 0xc0000000-0xffffffff: prostor jádra (1 GB)

(Vektor specifický pro CPU a vůbec se zde ignoruje).

Linux rozděluje 1GB jaderný prostor na 2 kusy, LOWMEM a HIGHMEM. Rozdělení se liší od instalace k instalaci.

Pokud si instalace vybere, řekněme, 512 MB-512 MB pro LOW a HIGH mems, 512 MB LOWMEM (0xc0000000-0xdfffffff) je staticky mapováno v době spuštění jádra; obvykle se použije prvních tolik bajtů fyzické paměti, aby virtuální a fyzické adresy v tomto rozsahu měly konstantní offset, řekněme, 0xc0000000.

Na druhé straně, poslední 512 MB (HIGHMEM) nemá statické mapování (i když zde můžete nechat stránky napůl natrvalo zmapovat, ale musíte to výslovně učinit v kódu ovladače). Místo toho jsou zde stránky dočasně mapovány a nemapovány, takže virtuální a fyzické adresy v tomto rozsahu nemají konzistentní mapování. Typické použití HIGHMEM zahrnuje jednorázové vyrovnávací paměti dat.

4
hiro

Pokud si pamatuji, "High Memory" se používá pro aplikační prostor a "Low Memory" pro jádro.

Výhodou je, že aplikace (uživatelský prostor) nemohou přistupovat k paměti jádra.

3
Gert

Mnoho lidí uvedlo, že nízká paměť je pro operační systém. To je obvykle pravda, ale nemusí to tak být. Vysoká paměť a nízká paměť jsou jen dvě části paměťového prostoru, ale v systému Linux je nízká paměť pouze pro jádro a vysoká paměť pro uživatelské procesy.

Podle „Dinosauří knihy (koncepty operačního systému)“ můžeme operační systém umístit buď do nízké paměti nebo do vysoké paměti. Hlavním faktorem ovlivňujícím toto rozhodnutí je umístění vektoru přerušení. Protože vektor přerušení je často v nedostatku paměti, programátoři obvykle umístí operační systém také do nedostatku paměti.

0
Zheng Gao