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.
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.

Hardverimplementáció
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. 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.

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.

Szegmentálás lapozás nélkül
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
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
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” – 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, 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

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 
 Adatszegmens
 BSS szegmens
 Virtuális címtér
 Virtuális memória
 x86 memóriaszegmentálás
 Segmentation fault

Fordítás

Jegyzetek

További információk
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. . .

Számítógép-memória
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 . 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 . Hardverimplementáció 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 . 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 . 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 . Aos ó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árGB is lehet . Szegmentálás lapozás nélkül 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 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 Azben 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” – méghozzá szegmentálttal . A későbbi, 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, ben alkották meg a Multics operációs rendszer kiszolgálására . Azös Intel iAPX 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 A kezdeti x86-os processzorokban megvalósított memóriaszegmentálás ( kezdve az Inteltal ) 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és későbbi CPU-k már nyújtanak memóriavédelmet is : amegjelené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 , fixKiB-os memóriaszegmensekkel ésbitesKi B ) címzéssel . Aos 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úrabites üzemmódban ( long mode ) nem használ szegmentációt . A szegmensregiszterek ( CS , SS , DS és ES ) értéke kötelezően a címzés határa 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 Adatszegmens BSS szegmens Virtuális címtér Virtuális memória x86 memóriaszegmentálás Segmentation fault Fordítás Jegyzetek További információk IA-32 Intel Architecture Software Developer’s Manual Volume : System Programming Guide . http://www.intel.com/products/processor/manuals/index.htm . Operating Systems : Internals and Design Principles by William Stallings . Publisher : Prentice Hall.\. \ . Számítógép-memória