Кіріспе

Глобалды дескриптор кестесі (GDT) – Intel x86 процессорлар отбасы 80286 моделінен бастап қолданатын деректер құрылымы. Ол бағдарлама орындалу кезінде пайдаланылатын әртүрлі жад аймақтарының сипаттамаларын, оның ішінде базалық адресін, көлемін және орындау мүмкіндігі, жазу мүмкіндігі сияқты қолжетімділік құқықтарын анықтау үшін қолданылады. Intel терминологиясында мұндай жад аймақтары сегменттер деп аталады.

Сипаттама

GDT – 8 байттық жазбалардан тұратын кесте. Әрбір жазба сегмент сипаттамасына, Тапсырма күй сегментіне (TSS), Жергілікті сипаттама кестесіне (LDT) немесе шақыру қақпасына сілтеме жасай алады. Шақыру қақпалары x86 артықшылық деңгейлері арасында басқаруды беру үшін жобаланған, бірақ бұл механизм қазіргі заманғы көптеген операциялық жүйелерде қолданылмайды. Сондай-ақ, Жергілікті сипаттама кестесі (LDT) де бар. GDT-да бірнеше LDT анықталуы мүмкін, бірақ кез келген уақытта тек біреуі ғана қолданыста болады: әдетте, ағымдағы Тапсырмамен байланысты. LDT-де нақты бір процеске жеке жад сегменттері болады, ал GDT-де жаһандық сегменттер болады. x86 процессорларында нақты машина оқиғалары кезінде ағымдағы LDT-ны автоматты түрде ауыстыру мүмкіндігі бар, бірақ GDT-ны автоматты түрде ауыстыру мүмкіндігі жоқ. Процесс жасаған әрбір жадқа қол жеткізу әрқашан сегмент арқылы жүзеге асырылады. 80386 процессоры және одан кейінгі процессорларда 32 биттік сегмент смещениялары мен шектері болғандықтан, сегменттерді барлық қолжетімді жадты қамтуға болатын етіп жасауға болады, бұл сегментке қатысты адрестеуді пайдаланушы үшін түсінікті етеді. Сегментке сілтеме жасау үшін бағдарлама оның GDT немесе LDT ішіндегі индексін пайдалануы керек. Мұндай индекс сегмент таңдағышы (немесе таңдағыш) деп аталады. Таңдағышты пайдалану үшін оны сегменттік тіркелгіге жүктеу қажет. Жадта GDT және үзіліс сипаттама кестесінің (IDT) орнын орнатуға/алуға мүмкіндік беретін машиналық нұсқаулардан басқа, жадқа сілтеме жасайтын әрбір машиналық нұсқаудың жасырын сегменттік тіркелгісі болады, кейде екеуі де. Көбінесе бұл сегменттік тіркелгіні нұсқаудың алдына сегменттік префиксін қосу арқылы алмастыруға болады. Сегменттік тіркелгіге таңдағышты жүктеу GDT немесе LDT жазбасын жүктеу кезінде оқиды және сегменттің қасиеттерін жасырын тіркелгіде сақтайды. GDT немесе LDT-ға енгізілген кейінгі өзгерістер сегменттік тіркелгіні қайта жүктегенге дейін күшіне енбейді.

64-биттік GDT

GDT 64 биттік режимде де қолданылады; GDT анықталуы тиіс, бірақ көбінесе ол өзгертілмейді немесе сегментация үшін пайдаланылмайды. Тіркелгінің көлемі 48 биттен 80 битке дейін ұлғайтылды, ал 64 биттік сипаттамалар әрқашан "жазық" болады (яғни, 0x0000000000000000-ден 0xFFFFFFFFFFFFFFFF-ке дейін). Дегенмен, FS және GS базасы 0-ге шектелмейді және олар процестік орта блогы және жиек ақпарат блогы сияқты элементтердің ығысуына нұсқау ретінде қолданыла береді. Егер жүйелік бит (Access өрісінің 4-ші біті) тазаланса, сипаттаманың көлемі 8-дің орнына 16 байтқа тең болады. Бұл код/дерек сегменттері ескерілмесе де, TSS ескеріледі, бірақ TSS нұсқаусы 64 биттік болуы мүмкін, сондықтан сипаттамаға TSS нұсқаусының жоғарырақ сөзінің енгізілуі үшін көбірек орын қажет. Windows-тың 64 биттік нұсқалары GDT-ны ілгекті етуге тыйым салады; мұндай әрекетке тырысу құрылғының қателерді тексеруіне себеп болады.

Жергілікті дескриптор кестесі

Жергілікті дескриптор кестесі (LDT) – x86 архитектурасында қорғалған режимде қолданылатын және GDT сияқты жад сегменттерінің сипаттамаларын қамтитын жад кестесі: сызықтық жадтағы басталу мекенжайы, көлемі, орындалу мүмкіндігі, жазу мүмкіндігі, қол жеткізу құқығы, жадта нақты болуы және т.б. LDT – Global Descriptor Table (GDT) туыс кестелері, және әрқайсысы бағдарламаларға қолжетімді 8192 жад сегментін анықтайды. GDT-ден өзгешелігі, нөлдік жазба жарамды жазба болып табылады және кез келген басқа LDT жазбасы сияқты қолданылуы мүмкін. Сондай-ақ, GDT-ден өзгешелігі, LDT белгілі бір жүйелік жазбаларды сақтауға қолданылмайды: TSS немесе LDT. Бірақ, шақыру қақпалары мен тапсырма қақпаларын сақтауға болады.

Тарих

Intel 80286 сияқты беттеу мүмкіндігі жоқ x86 процессорларында LDT бірнеше процестер үшін жеке адрестік кеңістіктерді жүзеге асыру үшін маңызды. Әдетте, әрбір пайдаланушы процесінде жеке жадты сипаттайтын бір LDT болады, ал ортақ жад және ядро жады GDT арқылы сипатталады. Операциялық жүйе LLDT машиналық нұсқауларын немесе TSS пайдаланып, жаңа процесті іске қосу кезінде ағымдағы LDT-ні ауыстырады. Керісінше, GDT көбінесе ауыстырылмайды (бірақ VMware сияқты виртуалды машина мониторлары компьютерде жұмыс істесе, мұндай жағдай болуы мүмкін). Екі кесте арасындағы асимметрия сол фактіде көрінеді, ағымдағы LDT кейбір жағдайларда автоматты түрде ауыстырылуы мүмкін, әсіресе TSS негізіндегі көп тапсырмалылық қолданылса, бұл GDT үшін мүмкін емес. LDT сонымен қатар кейбір артық құқықты жад сегменттерін (мысалы, TSS) сақтай алмайды. Соңында, LDT GDT ішіндегі сипаттама арқылы анықталады, ал GDT тікелей сызықтық мекенжай арқылы анықталады. GDT арқылы ортақ жад құрудың кейбір кемшіліктері бар. Атап айтқанда, мұндай жад барлық процестерге бірдей құқықтармен көрінеді. Көрінуді шектеу және ортақ жадты қорғауды ерекшелендіру үшін, мысалы, кейбір процестерге тек оқуға рұқсат беру үшін, жеке LDT жазбаларын пайдалануға болады, олар бірдей физикалық жад аймақтарына бағытталған және тек белгілі бір ортақ жад аймағына қол жеткізуді сұраған процестердің LDT-сінде құрылады. LDT (және GDT) жазбалары, бірдей жад аймақтарына сілтеме жасайтын «алиас» деп аталады. «Алиас» код сегменттеріне жазуға қол жеткізу үшін де құрылады: орындалатын селектор жазу үшін пайдаланылмайды. (Барлығы бір жад сегментінде орналасқан, «кішкентай жад моделі» деп аталатын қорғалған режимдегі бағдарламалар код пен деректер/стек үшін бөлек селекторларды пайдалануы керек, бұл екі селекторды да техникалық тұрғыдан «алиас» етеді.) GDT жағдайында, TSS сияқты жүйелік сегменттерге қол жеткізу үшін де «алиас» құрылады. Сегменттердің сипаттамаларында «Қазіргі» туы бар, бұл оларды қажет болған жағдайда жадтан жоюға мүмкіндік береді. Мысалы, код сегменттері немесе өзгертілмеген дерек сегменттерін жоюға болады, ал өзгертілген дерек сегменттерін дискіге ауыстыруға болады. Алайда, сегменттердің барлығы бірлік ретінде жұмыс істеуі керек болғандықтан, олардың мөлшерін шектеу қажет, сонда ауыстыру уақтылы орындалады. Алайда, кішкентай, оңай ауыстырылатын сегменттерді пайдалану сегменттік тіркегіштерді жиі қайта жүктеуді білдіреді, бұл өз кезегінде уақытты қажет ететін операция.

Қазіргі қолданысы

Intel 80386 микропроцессоры жеке физикалық жад беттерін (өзі кішкентай жад бірліктері) бірдей виртуалды мекенжайларға бөлуді енгізді, бұл дискідегі беттерді ауыстыруды сегменттік ауыстырудан әлдеқайда жылдам және тиімді етеді. Сондықтан, қазіргі 32 биттік x86 операциялық жүйелер LDT-ны көбінесе пайдаланбайды, негізінен 16 биттік кодты іске қосу үшін. Егер 16 биттік кодты 32 биттік ортада жадты бөлісе отырып іске қосу қажет болса (мысалы, OS/2 1.x бағдарламаларын OS/2 2.0 және одан кейінгі нұсқаларында іске қосу кезінде), LDT әрбір жазық (беттелген) мекенжай үшін LDT-да сәйкес таңдаушыны қамтамасыз етуі керек (әдетте бұл LDT-ны 64 КБ жазбалармен толтыруға әкеледі). Бұл техника кейде LDT мозаикасы деп аталады. LDT-ның шектеулі көлемі виртуалды жазық мекенжай кеңістігінің 512 мегабайтқа (8191 есе 64 КБ) дейін шектелуін білдіреді – осылай OS/2 жүйесінде болады, бірақ бұл шектеу 4.5 нұсқасында түзетілді. Сондай-ақ, 32 биттік ортада бөлінген объектілер 64 КБ шекарасын кесіп өтпеуін қамтамасыз ету қажет; бұл адрестік кеңістіктің бір бөлігін тиімсіз пайдалануға әкеледі. Егер 32 биттік кодқа 16 биттік кодқа кез келген жад объектілерін берудің қажеті болмаса, мысалы, Windows NT-дегі немесе Windows 3.1 эмуляция қабатындағы OS/2 1.x эмуляциясында, 32 биттік мекенжай кеңістігінің көлемін жасанды түрде шектеудің қажеті жоқ.