Кіріспе

Компьютердің негізгі жадының бөлек жылжытылатын сегменттерге немесе бөлімдерге бөлінуі – сегменттелген компьютер жады.

Жад сегментациясы – компьютердің негізгі жадын сегменттерге немесе бөлімдерге бөлу арқылы опералық жүйенің жадты басқару әдісі. Сегментацияны қолданатын компьютерлік жүйеде жад орнына сілтемеде сегментті және сол сегмент ішіндегі офсетті (жад орнын) анықтайтын мән болады. Сегменттер немесе бөлімдер құрастырылған бағдарламалардың объектілік файлдарында да қолданылады, олар бағдарламалық кескінді құру үшін біріктірілгенде және кескін жадқа жүктелгенде де пайдаланылады. Сегменттер әдетте бағдарламаның табиғи бөліністеріне сәйкес келеді, мысалы, жеке процедуралар немесе деректер кестелері.

Жабдықты іске асыру

Сегменттеуді қолданатын жүйеде компьютер жадының мекенжайлары сегмент идентификаторынан және сегмент ішіндегі ығысымнан тұрады. Бөліп жазу – тағы бір тәсіл, және оларды біріктіруге болады. Жад сегментінің мөлшері әдетте өзгермейді және бір байтқа дейін кішкентай болуы мүмкін. Сегменттеу әртүрлі аппараттық құралдарда әр түрлі жолдармен іске асырылды, бөліп жазумен немесе онсыз. Intel x86 жады сегментациясы ешқайсысы да бұл модельдерге сай келмейді және төменде жеке қарастырылады, сондай-ақ бөлек мақалада толығырақ талқыланады.

Бөлшектеусіз сегменттеу

Әрбір сегментке оның жадыда қай жерде орналасқанын көрсететін ақпарат байланыстырылған. Бағдарлама жад орнына сілтеме жасағанда, физикалық жад адресін алу үшін сегмент базасына смещение қосылады. Сегменттеу арқылы жадыны басқаруды қолданатын жүйеде виртуалды жадты іске асыру үшін барлық сегменттерді негізгі жадтан екінші жадқа және кері қайта-қайта ауыстыру қажет. Сегмент енгізілген кезде операциялық жүйе бүкіл сегментті сақтау үшін жеткілікті үзіліссіз бос жадыны бөлуі керек. Көп жағдайда, жалпы жеткілікті жад болғанымен, үзіліссіз жад жетіспесе, жадтың фрагментациялануы пайда болады.

Беттестірумен сегменттеу

Жад орнының орнына сегмент туралы ақпаратта сегмент үшін беттік кесте мекенжайы болады. Бағдарлама жад орнына сілтеме жасағанда, офсет беттік кесте арқылы жад адресіне аударылады. Сегментті қосымша жад бетін бөліп, оны сегменттің беттік кестесіне қосу арқылы ұзартуға болады. Сегменттеу және беттеуді қолданатын жүйедегі виртуалды жадты іске асыру әдетте жеке беттерді негізгі жадтан екінші жадқа және кері жылжытады, бұл беттелмеген сегменттелмеген жүйеге ұқсас. Сегменттің беттері негізгі жадтың кез келген жерінде орналасуы мүмкін және олардың біріктірілген болуы міндетті емес. Бұл, әдетте, негізгі және екінші реттік жад арасындағы кіріс-шығыс операцияларының мөлшерін азайтады және жадтың фрагментациясын төмендетеді.

Тарих

Burroughs Corporation B5000 компьютері сегменттеуді енгізген алғашқы компьютерлердің бірі болды және сегменттеуге негізделген "виртуалды жадты қамтамасыз ететін алғашқы коммерциялық компьютер болуы мүмкін". B5000 бағдарламалық сілтеме кестесі (PRT) деп аталатын сегмент ақпарат кестесімен жабдықталған, ол тиісті сегменттің негізгі жадта орналасқанын, базалық адресін және сегменттің мөлшерін көрсету үшін қолданылады. Кейінірек шыққан B6500 компьютері де сегменттеуді қолданды; оның архитектурасының бір түрі бүгінге дейін Unisys ClearPath Libra серверлерінде қолданылуда. GE 645 компьютері, GE 635-тің сегменттеу және беттеу қолдауы қосылған модификациясы, 1964 жылы Multics жүйесін қолдау үшін жасалған. 1975 жылы жұмысын бастаған Intel iAPX 432 микропроцессоры жадты қорғаумен нағыз сегменттелген архитектураны іске асыруға тырысты. Intel i960 процессорларының 960MX нұсқасы жүктеу және сақтау командаларын қолдайды, мұнда дерек көзі немесе мақсаты объект үшін "кіру дескрипторы" және объект ішіндегі ығысу болады, кіру дескрипторы 32 биттік тіркеуіште орналасқан, ал ығысу келесі тіркеуіштегі базалық ығысудан және қосымша ығысудан, сондай-ақ командада көрсетілген индекс тіркеуіштен есептеледі. Кіру дескрипторы рұқсат біттерін және 26 биттік объект индексін қамтиды; объект индексі – объектінің түрін, ұзындығын және объектінің деректері үшін физикалық адресін, объект үшін беттік кестені немесе екі деңгейлі беттік кесте үшін жоғарғы деңгейдегі беттік кестені беретін объект дескрипторларының кестесіне сілтеме. Prime, Stratus, Apollo, IBM System/38 және IBM AS/400 (соның ішінде IBM i) компьютерлері жад сегментациясын пайдаланады.

B5000

B5000, B5500 және B5700 дескрипторлары Бағдарламалық сілтеме кестесінде (PRT) немесе стекте орналасады және деректер жадта бар-жоқ екенін көрсететін қатысу битін қамтиды. Деректер және бағдарлама дескрипторлары ерекшеленеді.

x86 архитектурасы

Ертедегі x86 процессорлары, Intel 8086 процессорларынан бастап, қарапайым жад сегментациясын қамтамасыз етеді және жадты қорғамайды. (Кез келген сегменттің әр байты кез келген бағдарламаға әрқашан қолжетімді.) 16 биттік сегменттік тіркеуіштер 65 536 сегментке мүмкіндік береді; әрбір сегмент сегмент нөмірінің 16 еселенгеніне тең тұрақты смещениядан басталады; сегменттің бастапқы адресінің гранулярлығы 16 байт. Әрбір сегмент 64 КиБ (65,536 байт) адрестік кеңістікке оқу-жазу құқығын береді (бұл шекті 16 биттік PC және SP тіркеуіштері белгілейді; процессор шекаралық тексеру жүргізбейді). 0xFFFFF-тен асатын смещение+адрес 0x00000-ге дейін қайта оралады. Әрбір 64 КиБ сегмент келесі 4095 сегментпен қабаттасады; әрбір физикалық адрес 4096 сегмент-смещение жұбымен көрсетілуі мүмкін. Бұл схема тек 1 МиБ (1024 КиБ) физикалық жадты (және жадқа бейнеленген кіріс-шығысты) адрестеуге болады. (Қосымша кеңейтілген жадтық аппараттық құралдары бағдарламалық басқару бойынша банктерге ауыстырылатын жадты қосуға мүмкіндік береді.) Intel осы x86 процессор моделінің жалғыз операциялық режимін "нақты режим" деп атады. Intel 80286 және одан кейінгі процессорлар "286 қорғалған режимін" қосады, ол 16 биттік адрестеуді сақтайды және сегментацияны (беттеусіз) және сегмент бойынша жадты қорғауды қосады. Артқа қарай үйлесімділік үшін барлық x86 процессорлары "нақты режимде" іске қосылады, бірдей 64 КиБ сегменттерімен, жадты қорғаусыз, тек 1 МиБ физикалық адрестік кеңістікпен және кейбір ерекшеліктермен (жоғары жад аймағы, нақты емес режим). Толық 24 биттік (16 МиБ) физикалық адрестік кеңістігін және жетілдірілген MMU мүмкіндіктерін пайдалану үшін 80286 немесе одан кейінгі процессорды бағдарламалық қамтамасыз ету арқылы "қорғалған режимге" ауыстыру қажет, әдетте операциялық жүйе немесе DOS кеңейткіші. Егер бағдарлама сегменттік тіркеуіштерді пайдаланбаса немесе тек операциялық жүйеден алған мәндерді ғана енгізсе, онда бірдей код нақты режимде немесе қорғалған режимде орындалуы мүмкін, бірақ нақты режимдегі бағдарламалық жасақтаманың көпшілігі сегменттік тіркеуіштер үшін жаңа мәндерді есептейді, бұл үйлесімділікті бұзады. Intel i386 және одан кейінгі процессорлар 32 биттік адрестеуді қолданатын, сегментацияны сақтайтын және жадты беттеуді қосатын "386 қорғалған режимін" қосады. Бұл процессорларда сегменттік кесте сегмент үшін беттік кестеге сілтеме жасаудың орнына сызықтық жадта сегменттік адресті қамтиды. Беттеу қосылған кезде сызықтық жадтағы адрестер жеке беттік кестелерді пайдалана отырып физикалық адрестерге шамаланған. Көптеген операциялық жүйелер сегментация мүмкіндігін пайдаланбады, барлық сегменттік тіркеуіштердегі негізгі адресті әрқашан 0-ге тең ұстап, беттеуді ғана пайдалана отырып беттік жадты қорғауды және ауыстыруды қамтамасыз етті. Кейбіреулер CS тіркеуішін NX биті жоқ процессорларда орындалатын кеңістікті қорғау үшін пайдаланады немесе жіптік жергілікті сақтауға қол жеткізу үшін FS немесе GS тіркеуіштерін пайдаланады. x86 64 архитектурасы "ұзақ режимде" (64 биттік режимде) сегментацияны қолдамайды. CS, SS, DS және ES сегменттік тіркеуіштері 0-ге мәжбүрленеді, ал лимит 264-ке. FS және GS сегменттерінде нөлден өзгеше негізгі адрес болуы мүмкін. Бұл операциялық жүйелерге осы сегменттерді арнайы мақсаттар үшін пайдалануға мүмкіндік береді, мысалы, жіптік жергілікті сақтау үшін.