Memóriaszegmentálás
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]- Adatszegmens
- BSS szegmens
- Virtuális címtér
- Virtuális memória
- x86 memóriaszegmentálás
- Segmentation fault
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. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.
Jegyzetek
[szerkesztés]- ↑ a b Englander, Irv (2003), The architecture of computer hardware and systems software (3rd ed.), Wiley, ISBN 0-471-07325-3
- ↑ 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>
- ↑ Intel Corporation. Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3 (3A, 3B & 3C): System Programming Guide, 3–13. o. (2012)
- ↑ HupWiki: Szegmentálás. [2011. július 12-i dátummal az eredetiből archiválva]. (Hozzáférés: 2015. augusztus 30.)
- ↑ 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.)
- ↑ Intel Corporation. Introduction to the IAPX 432 Architecture [archivált változat], 78. o. (1981). Hozzáférés ideje: 2015. augusztus 30. [archiválás ideje: 2011. október 13.]
További információk
[szerkesztés]- IA-32 Intel Architecture Software Developer’s Manual Volume 3A: System Programming Guide. http://www.intel.com/products/processor/manuals/index.htm.
- Operating Systems: Internals and Design Principles by William Stallings. Publisher: Prentice Hall. ISBN 0-13-147954-7. ISBN 978-0-13-147954-8.