Memóriaszegmentálás

A Wikipédiából, a szabad enciklopédiából
Jump to navigation Jump to search

A memóriaszegmentálás vagy memóriaszegmentáció a számítástechnikában egy memóriakezelési módszer, mely a számítógép memóriájának logikailag több címtérre, „szegmensekre” vagy „szekciókra” bontásával működik. Egy szegmentált számítógépes rendszerben egy memóriacímre való hivatkozás két részből áll, egy szegmenscímből és egy eltolási (ofszet-) címből, ami a szegmensen belül határozza meg a cím elhelyezkedését. Ilyen szegmenseket vagy szekciókat alkalmaznak a lefordított programok object fájljainak összelinkelésekor is, illetve amikor az összelinkelt programot betöltik a memóriába.

A memóriaszegmensek általában a program természetes felépítésének megfelelően (egyes rutinok vagy adattáblák szerint) alakulnak, így a szegmentálás a lapozási műveletnél láthatóbb a programozó számára.[1] Különböző szegmensek tartozhatnak különböző programmodulokhoz, vagy a memóriahasználat osztályai szerint pl. kód- és adatszegmensek. Egyes szegmenseket a programok egymás között is megoszthatnak.[1]

Hardverimplementáció[szerkesztés]

Egy szegmentált memóriát használó rendszerben a memóriacímek egy szegmensazonosító címből és egy szegmensen belüli eltolási (ofszet-) címből állnak. Egy hardveres memóriavezérlő (MMU) fordítja át a szegmenscím és eltolási cím együttesét egy fizikai memóriacímmé, megvizsgálva hogy az átfordítás érvényes címet eredményez-e és hogy az adott szegmenscímre és ofszetre való hivatkozás engedélyezett-e.

A szegmensekhez tartozik egy méretinformáció és az engedélyek egy halmaza (pl. olvasás, írás, futtatás). Egy folyamat csak akkor férhet hozzá az adott szegmenshez, ha az adott típusú engedélynek megfelel a hozzáférése, és a szegmenseltolás nem lép túl a szegmens hosszúságán. Ellenkező esetben hardveres kivétel, például szegmentációs hiba (segmentation fault) fog keletkezni.

Szegmentálással megvalósítható a virtuális memóriakezelés is. Ebben az esetben minden memóriaszegmenshez tartozik egy flag, aminek értéke jelzi, hogy az adott szegmens a fő memóriában található-e vagy sem. Ha egy folyamat olyan szegmenst próbál elérni, ami nem található meg a fő memóriában, kivétel keletkezik és az operációs rendszer fogja beolvasni a lapot a másodlagos tárolóból (merevlemez, SSD).

A szegmentálás a memóriavédelem megvalósításának egyik eszköze.[2] A memórialapozás (paging) egy másik módszer, és a kettő kombinálható is. A memóriaszegmensek mérete általában nem fix, egyes rendszerekben akár egyetlen bájt is lehet.[3]

A szegmentáció különböző platformokon különböző módokon valósítható meg, lapozással vagy anélkül. Az Intel x86-os implementációt egyik modell sem írja le pontosan, ezért külön említést érdemel. A 80386-os óta minden Intel processzor virtuális memóriakezelője támogatja a szegmentálásos lapozást. Sőt mindhárom módszert meg lehet valósítani: lapozást, szegmentálást, szegmentálásos lapozást. Egy szegmens mérete akár 4 GB is lehet.[4]

Szegmentálás lapozás nélkül[szerkesztés]

Minden szegmenshez hozzá van rendelve az arra vonatkozó információ, hogy a szegmens hol található a memóriában – mi a „szegmens báziscíme”. Amikor egy processz megpróbál hozzáférni egy memóriacímhez, ehhez a szegmens-báziscímhez kell hozzáadni az ofszetet, hogy megkapjuk a fizikai memóriacímet.

A lapozás nélküli szegmentálás esetén a virtuális memóriát úgy lehet megvalósítani, hogy a memóriakezelőnek teljes szegmenseket kell kicserélnie (swapping) az elsődleges és a másodlagos tár között. Amikor a rendszer egy szegmenst beolvas a fő memóriába, annyi szabad és folytonos memóriával kell rendelkeznie, amennyibe az egész szegmens elfér. Előfordulhat, hogy memóriatöredezettség lép fel, és nem áll rendelkezésre elegendő folytonos memória, pedig a szabad memória mérete elegendő lenne.

Szegmentálás lapozással[szerkesztés]

A szegmenshez hozzárendelt információ nem magát a fizikai memóriacímet, hanem egy laptábla (page table) címét tartalmazza. Amikor egy processz megpróbál hozzáférni egy memóriacímhez, az ofszetet a laptábla által megadott memóriacímhez kell hozzáadni. Egy szegmens mérete így megnövelhető, egyszerűen egy további memórialappal bővítve a szegmens laptábláját.

A lapozással történő szegmentálás esetén a virtuális memória lapozásakor általában egy-egy memórialapot kell csak az elsődleges és a másodlagos tár között mozgatni, hasonlóan egy nem szegmentált lapozásos rendszerhez. A szegmenshez tartozó lapok bárhol lehetnek a fő memóriában, és nem szükséges, hogy folytonosan helyezkedjenek el. Ez általában kisebb méretű swappeléssel és csökkent memóriatöredezettséggel jár.

Története[szerkesztés]

Az 1961-ben tervezett, a Burroughs Corporation által gyártott B5000 számítógép az elsők között valósította meg a szegmentációt, és „talán az első kereskedelmi számítógép volt, ami virtuális memóriával rendelkezett”[5] – méghozzá szegmentálttal. A későbbi, 1969-es B6500 modell szintén szegmentációt használt, az architektúra egy változata ma is használatban van a Unisys ClearPath Libra szervereiben.

A GE-645-ös modellt, ami a GE-635 szegmentálással és lapozással ellátott változata volt, 1964-ben alkották meg a Multics operációs rendszer kiszolgálására.

Az 1975-ös Intel iAPX 432,[6] megkísérelt valódi szegmentált architektúrát megvalósítani mikroprocesszorba integrált módon.

A Prime, Stratus, Apollo, IBM System/38 és az IBM AS/400 rendszerek is memóriaszegmentálást használtak/használnak.

x86-os architektúra[szerkesztés]

A kezdeti x86-os processzorokban megvalósított memóriaszegmentálás (kezdve az Intel 8086-tal) nem nyújtott semmilyen memóriavédelmet. Ezeken a CPU-kon futó bármely processz bármely memóriaszegmenst korlátozások nélkül elérhetett. A szegmenst csak a kezdőcíme határozta meg, a rendszer nem végzett hosszúságellenőrzést sem.

Az Intel 80286 és későbbi CPU-k már nyújtanak memóriavédelmet is: a 80286 megjelenésével az Intel utólagosan elnevezte a korábbi x86-os modellek működési módját valós módnak (real mode) és bevezetett egy új védett módot (protected mode). A visszamenőleges kompatibilitás kedvéért minden x86-os CPU memóriavédelem nélküli valós üzemmódban indul el, fix 64 KiB-os memóriaszegmensekkel és 20 bites (1024 KiB) címzéssel. A 80286-os vagy újabb processzorokat szoftveresen át kell kapcsolni egy másik üzemmódba, hogy kihasználhassák a teljes címterület és a fejlett memóriakezelési képességeiket.

A szegmentáció x86-os megvalósításában a szegmenstábla nem a szegmens laptáblájára mutat, hanem a szegmenscímet a „lineáris memóriában” tartalmazza. A címet ezután egy külön laptábla segítségével fordítja át fizikai címmé. Tehát egy-egy szegmensen belül lineáris címzés érvényesül. Más architektúrák megvalósításaival ellentétben a szegmensek mérete nem növekedhet dinamikusan. Az x86-64 architektúra 64 bites üzemmódban (long mode) nem használ szegmentációt. A szegmensregiszterek (CS, SS, DS és ES) értéke kötelezően 0, a címzés határa 264. Az FS és GS szegmensregiszterek értéke felvehet nem nulla értéket, ami lehetővé teszi, hogy az operációs rendszer egyéb célokra felhasználja ezeket a regisztereket.

Kapcsolódó szócikkek[szerkesztés]

Fordítás[szerkesztés]

  • Ez a szócikk részben vagy egészben a Memory segmentation című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel.

Jegyzetek[szerkesztés]

  1. ^ a b Englander, Irv (2003), The architecture of computer hardware and systems software (3rd ed.), Wiley, ISBN 0-471-07325-3
  2. Arpaci-Dusseau, Remzi H. & Arpaci-Dusseau, Andrea C. (2014), Operating Systems: Three Easy Pieces [Chapter: Segmentation], Arpaci-Dusseau Books, <http://pages.cs.wisc.edu/~remzi/OSTEP/vm-segmentation.pdf>
  3. Intel Corporation. Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B & 3C): System Programming Guide, 3–13. o. (2012) 
  4. HupWiki: Szegmentálás
  5. Mayer, Alastair J.W.: The Architecture of the Burroughs B5000 - 20 Years Later and Still Ahead of the Times?. (Hozzáférés: 2012. március 15.)
  6. Intel Corporation. Introduction to the IAPX 432 Architecture, 78. o. (1981). Hozzáférés ideje: 2015. augusztus 30. 

További információk[szerkesztés]