Кіріспе

Intel x86 архитектурасында жад сегменттемесін іске асыру Intel x86 компьютерлік нұсқаулар жиынтығы архитектурасындағы жад сегменттемесін іске асыруға қатысты. Сегменттеу 1978 жылы Intel 8086 компьютерінде 64 КБ (65,536 байттан) артық жадты мекенжайлауға бағдарламаларға мүмкіндік беру үшін енгізілді. Intel 80286 1982 жылы виртуалды жад және жадты қорғау қолдауын қосқан сегменттеудің екінші нұсқасын енгізді. Осы кезде бастапқы режим «нақты режим» деп, ал жаңа нұсқа «қорғалған режим» деп аталды. 2003 жылы ұсынылған x86 64 архитектурасы 64 биттік режимде сегменттеуді қолдауды көбінесе тоқтатты. Нақты және қорғалған режимдердің екеуінде де жүйе нақты жад мекенжайын алу үшін 16 биттік сегменттік регистрлерді пайдаланады. Нақты режимде CS, DS, SS және ES регистрлері қазіргі уақытта қолданылып жатқан бағдарламалық код сегментіне (CS), ағымдағы дерек сегментіне (DS), ағымдағы стек сегментіне (SS) және бағдарламашы анықтаған қосымша сегментке (ES) сілтеме жасайды. 1985 жылы ұсынылған Intel 80386, аппараттық деңгейде нақты қолданылуы анықталмаған екі қосымша сегменттік регистрлер, FS және GS қосты. Сегменттік регистрлерді пайдалану тәсілі екі режимде әртүрлі.

80286 қорғалған режим

80286 қорғалған режимі процессордың адрестік кеңістігін 224 байтқа (16 мегабайтқа) дейін кеңейтеді, бірақ бұл ауысу мәнін реттеу арқылы емес. Оның орнына 16 биттік сегменттік тіркеуіштер енді 24 биттік базалық мекенжайларды қамтитын сегменттік сипаттамалардың кестесіне сілтеме береді, оған смещение қосылады. Ескі бағдарламалық жасақтаманы қолдау үшін процессор «нақты режимде» іске қосылады, онда ол 8086 сегменттік адрестеу моделін пайдаланады. Дегенмен, шағын айырмашылық бар: алынған физикалық мекенжай енді 20 битпен шектеледі, сондықтан нақты режимдегі көрсеткіштер (бірақ 8086 көрсеткіштері емес) енді 10000016 және 10FFEF16 аралығындағы мекенжайларға сілтеме жасай алады. Бұл шамамен 64 килобайттық жад аймағы «Жоғары жад аймағы» (HMA) деп аталды, ал DOS-тың кейінгі нұсқалары оны қол жетімді «дәстүрлі» жадты (яғни алғашқы 1 МБ-тың ішінде) ұлғайту үшін пайдалана алды. HMA қосылған кезде, жалпы адрестік кеңістік шамамен 1,06 МБ құрайды. 80286 нақты режимдегі мекенжайларды 20 битпен шектемесе де, 80286 процессорлары бар жүйе 21-ші адрестік желіні, A20 желісін тоқтату арқылы сыртқы аппараттық құралдармен оны шектеуге болады. IBM PC AT осыны істеу үшін аппараттық құралдарды ұсынды (түпнұсқа IBM PC және PC/XT модельдерінің бағдарламалық жасақтамасымен толық үйлесімділік үшін), сондықтан барлық келесі «AT класындағы» PC клондары да солай істеді. 286 қорғалған режимі сирек қолданылды, өйткені ол 8086/88 машиналары бар көптеген пайдаланушыларды қалыптастыратын еді. Сонымен қатар, ол әлі де жадыны 64 килобайттық сегменттерге бөлуді талап етеді, бұл нақты режимде жасалған. Бұл шектеу 32 биттік процессорларда жұмыс істеуге болады, олар 64 килобайттан үлкен жад көрсеткіштерін пайдалануға мүмкіндік береді, бірақ сегмент шегінің өрісі 24 биттік болғандықтан, құрылатын сегменттің максималды көлемі 16 МБ құрайды (егер беттеу көбірек жадты бөлу үшін қолданылса да, жеке сегмент 16 МБ-тан аспауы керек). Бұл әдіс Windows 3.x қолданбаларында жад кеңістігін тегістеу үшін жиі қолданылды, бірақ операциялық жүйе өзі әлі 16 биттік болғандықтан, API шақыруларын 32 биттік нұсқаулармен жасау мүмкін болмады. Осылайша, API шақыруларын орындайтын барлық кодты 64 килобайттық сегменттерге орналастыру қажет болды. 286 қорғалған режимі шақырылғаннан кейін, аппараттық қайта орнату арқылы ғана одан шығуға болады. IBM PC/AT стандартына сәйкес келетін машиналар стандартталған пернетақта контроллері арқылы процессорға қайта орнатуды жасампаздықпен жасай алады, бірақ бұл айтарлықтай баяу болды. Windows 3.x осы екі проблеманы да болдырмау үшін процессордың үзіліс басқару механизмдерінде үш еселік қатеге қасақана себеп болды, бұл процессордың нақты режимге қайтуына себеп болды, бұл дерлік бірден болды.

80386 қорғалған режим

Intel 80386 және одан кейінгі нұсқаларында қорғалған режим 80286 қорғалған режимінің сегментациялау механизмін сақтайды, бірақ сегментациялау блогы мен физикалық шина арасындағы адресті аударудың екінші қабаты ретінде пагельдеу блогы қосылды. Маңыздысы, адрестік смещениелер 32 биттік (16 биттік емес), ал әрбір сегмент дескрипторындағы сегмент базасы да 32 биттік (24 биттік емес). Сегменттеу блогының жалпы жұмысы басқаша өзгермейді. Пайджерлік құрылғыны қосу немесе өшіру мүмкін; егер өшірілген болса, жұмыс 80286-дағыдай жүзеге асырылады. Егер пагельдеу блогы қосылса, сегменттегі мекенжайлар енді физикалық мекенжайлар емес, виртуалды мекенжайлар болады, бұл 80286-да болмаған. Яғни, сегменттің бастапқы мекенжайы, смещениесі және сегментациялық блок екеуін қосу арқылы шығарған соңғы 32 биттік мекенжай – пагельдеу блогы қосылғанда барлығы виртуалды (немесе логикалық) мекенжайлар болып табылады. Сегменттеу блогы осы 32 биттік виртуалды мекенжайларды жасап, тексергеннен кейін, қосылған пагельдеу блогы осы виртуалды мекенжайларды физикалық мекенжайларға аударады. 386 процессорда физикалық мекенжайлар 32 биттік, бірақ Физикалық адресті кеңейтуді қолдайтын жаңа процессорларда одан үлкен болуы мүмкін. 80386 сонымен қатар бастапқы төрт сегменттік регистрлерге (CS, DS, ES және SS) екі жаңа жалпы мақсаттағы дерек сегменттік регистрлерін, FS және GS қосты. 386 CPU-ды CR0 басқару регистріндегі битті тазалау арқылы нақты режимге қайтаруға болады, бірақ бұл қауіпсіздік пен тұрақтылықты қамтамасыз ету үшін артықшылықты операция болып табылады. Салыстыру үшін, 286 процессорды тек процессорды қайта іске қосу арқылы ғана нақты режимге қайтаруға болады, мысалы үш рет қателік немесе сыртқы аппаратты пайдалану арқылы.

Кейінгі дамуы

x86 64 архитектурасы ұзақ режимде (64 биттік режимде) сегментацияны қолданбайды. CS, SS, DS және ES сегменттік тізілімдерінің төртеуі 0 негізгі мекен-жайға және 2^64 шектеуге ие болуға мәжбүр. FS және GS сегменттерінде нөлден өзгеше негізгі мекен-жай болуы мүмкін. Бұл операциялық жүйелерге осы сегменттерді арнайы мақсаттар үшін пайдалануға мүмкіндік береді. Ескі режимдерде қолданылатын жаһандық дескриптор кестесі механизмінен айырмашылығы, осы сегменттердің негізгі мекенжайы модельге тән тіркелімде сақталады. x86 64 архитектурасы сонымен қатар арнайы SWAPGS нұсқауын ұсынады, ол ядролық режим мен пайдаланушы режимінің негізгі мекенжайларын ауыстыруға мүмкіндік береді. Мысалы, Microsoft Windows x86 64 жүйесінде GS сегменті әрбір жіпке арналған кішкентай дерек құрылымасы болып табылатын Thread Environment Block-қа сілтеме жасау үшін қолданылады, ол өтекілдіктерді басқару, жіпке тән айнымалылар және басқа жіптік күй туралы ақпаратты қамтиды. Сол сияқты, Linux ядросы GS сегментін әрбір процессорға арналған деректерді сақтау үшін пайдаланады. GS/FS сонымен қатар gcc-нің жіптік жергілікті сақтауында және канарға негізделген стек қорғауышында қолданылады.