Дескрипторлардың ғаламдық кестесі - Global Descriptor Table

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

Дескрипторлардың ғаламдық кестесі

GDT басқа заттарды ұстай алады сегменттік дескрипторлар сонымен қатар. GDT-дегі әрбір 8 байтты жазба дескриптор болып табылады, бірақ бұл дескрипторлар жад сегменттеріне ғана емес, сілтемелер бола алады Тапсырма күйі сегменті (TSS), жергілікті дескрипторлар кестесі (LDT) немесе Қақпаға қоңырау шалыңыз жадыдағы құрылымдар. Соңғылары, Call Gates, x86 артықшылық деңгейлері арасында басқаруды беру үшін өте маңызды, бірақ бұл механизм қазіргі заманғы операциялық жүйелерде қолданылмайды.

Бар Жергілікті дескриптор кестесі (LDT). GDT-де бірнеше LDT-ді анықтауға болады, бірақ кез-келген уақытта тек біреуі ағымдағы болып табылады: әдетте ағымдағы Task-пен байланысты. LDT белгілі бір бағдарламаға жеке болатын жад сегменттерін қамтыса, GDT ғаламдық сегменттерден тұрады. X86 процессорларында нақты LDT автоматты түрде белгілі бір машиналық оқиғаларға ауысуға арналған қондырғылар бар, бірақ GDT-ді автоматты түрде ауыстыруға мүмкіндік жоқ.

Бағдарлама орындай алатын кез-келген жадқа қол жеткізу әрқашан сегменттен өтеді. Үстінде 80386 процессор және кейінірек, өйткені 32 бит сегменттерді ығысу мен шектеу, сегменттерді адресатталған жадыны толығымен қамтуы мүмкін, бұл пайдаланушыға сегментке қатысты адрестеуді мөлдір етеді.

Сегментке сілтеме жасау үшін бағдарлама GDT немесе LDT ішіндегі индексін қолдануы керек. Мұндай индекс а деп аталады сегмент селекторы (немесе селектор). Әдетте селекторды а жүктеу керек сегмент регистрі пайдалану керек. GDT позициясын орнатуға / алуға мүмкіндік беретін машинаның нұсқауларынан басқа, және Дескриптор кестесін үзу (IDT), жадыда жадқа сілтеме жасайтын кез-келген машиналық нұсқаулықтың сегменттік регистрі бар, кейде екі болады. Көбінесе бұл сегмент регистрін нұсқаулыққа дейін сегментке арналған префиксті қосу арқылы жоюға болады.

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

GDT мысалы

Төменде қол жетімді барлық 4 Гб жадты ашатын GDT-ді құрастыру көрсетілген:

негіз = 0x00000000, сегмент шегі = 0xffffffff
; 0x0 теңгерімі.жоқ дескриптор:	dq 0; 0x8 орнын ауыстыру.код:				; cs осы дескрипторға бағытталуы керек	dw 0xffff		; сегменттің шегі бірінші 0-15 бит	dw 0			; алдымен 0-15 бит	db 0			; негізі 16-23 бит	db 0x9a			; байт	db 11001111б	; жоғары 4 бит (жалаушалар) төмен 4 бит (шектеу 4 соңғы бит) (шегі ені 20 бит)	db 0			; негізі 24-31 бит; 0x10 теңгерімі.data:				; ds, ss, es, fs және gs осы дескрипторға бағытталуы керек	dw 0xffff		; сегменттің шегі бірінші 0-15 бит	dw 0			; алдымен 0-15 бит	db 0			; негізі 16-23 бит	db 0x92			; байт	db 11001111б	; жоғары 4 бит (жалаушалар) төмен 4 бит (шектеу 4 соңғы бит) (шегі ені 20 бит)	db 0			; негізі 24-31 бит

GDT 64 биттік

GDT әлі де 64 биттік режимде жұмыс істейді; GDT анықталуы керек, бірақ әдетте ешқашан өзгертілмейді немесе сегменттеу үшін пайдаланылмайды. Регистрдің мөлшері 48-ден 80 битке дейін кеңейтілді, ал 64-биттік селекторлар әрдайым «тегіс» болады (осылайша, 0x0000000000000000-ден 0xFFFFFFFFFFFFFFFF). Алайда, FS және GS негіздері 0-мен шектелмейді және олар процестің ортасының блогы және ағынның ақпараттық блогы сияқты элементтердің ығысуына нұсқау ретінде пайдаланыла береді.

Егер жүйелік бит (Access өрісінің 4-ші биті) тазаланса, онда дескриптордың өлшемі 8 емес, 16 байтты құрайды, себебі код / ​​деректер сегменттері еленбесе де, TSS жоқ, бірақ TSS көрсеткіші болуы мүмкін Ұзындығы 64 бит, сондықтан дескрипторға TSS сілтегішінің жоғары сөзін енгізу үшін көбірек орын қажет.

64 биттік Windows нұсқаларына тыйым салынады ілмек ЖДТ; бұны жасау машинаның пайда болуына әкеледі қателерді тексеру.[1]

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

A Жергілікті дескриптор кестесі (LDT) - пайдаланылатын жад кестесі x86 сәулеті жылы қорғалған режим жады бар сегменттік дескрипторлар, GDT сияқты: мекен-жай сызықтық жадыдан басталады, өлшемі, орындалуы, жазылуы, қол жетімділігі, жадында нақты болуы және т.б.

LDT - бұл жаһандық дескриптор кестесінің (GDT) бауырлары, және әрқайсысы бағдарламаларға қол жетімді 8192 жад сегменттерін анықтайды - GDT-ден айырмашылығы нөлдік жазба жарамды жазба және оны кез-келген басқа LDT жазбасы сияқты пайдалануға болатындығын ескеріңіз. GDT-ге қарағанда LDT-ді кейбір жүйелік жазбаларды сақтау үшін пайдалану мүмкін емес екенін ескеріңіз: TSSs немесе LDT. Қоңырау қақпалары мен Тапсырма қақпалары жақсы.

Тарих

X86 сияқты процессорларда пейджинг мүмкіндіктері жоқ Intel 80286, LDT бөлек жүзеге асыру үшін өте маңызды мекенжай кеңістігі бірнеше процестерге арналған. Әдетте әр пайдаланушы процесінде бір LDT болады, ол жеке жадты сипаттайды, ал ортақ жады және ядро жады GDT арқылы сипатталады. The операциялық жүйе жаңа процедураны жоспарлағанда, LLDT машинасының нұсқауын қолданғанда немесе а пайдалану кезінде ағымдағы LDT ауыстырады TSS. Керісінше, GDT әдетте ауыстырылмайды (дегенмен бұл орын алуы мүмкін виртуалды машина мониторлары сияқты VMware компьютерде жұмыс істейді).

Екі кесте арасындағы симметрияның болмауы қазіргі LDT-ді белгілі бір оқиғаларға автоматты түрде қосуға болатындығымен ерекшеленеді, әсіресе TSS - бұл GDT үшін мүмкін емес, ал көпжақты есептер қолданылады. LDT жад сегменттерінің белгілі бір артықшылықты түрлерін сақтай алмайды (мысалы, TSSes). Соңында, LDT GDT ішіндегі дескриптормен анықталады, ал GDT тікелей сызықтық адреспен анықталады.

GDT арқылы ортақ жадыны құрудың кейбір кемшіліктері бар. Мұндай жад барлық процестерге және тең құқықтармен көрінеді. Көріністі шектеу және ортақ жадты қорғауды саралау үшін, мысалы, тек кейбір процестерге тек оқуға қол жеткізуге мүмкіндік беру үшін, сол физикалық жад аймақтарына бағытталған және тек LDT процестерінде құрылған бөлек LDT жазбаларын пайдалануға болады. берілген жад аймағына кіруді сұрады.

Жадының бірдей аймақтарын көрсететін LDT (және GDT) жазбалары деп аталады бүркеншік аттар. Бүркеншік аттар, әдетте, код сегменттеріне жазуға рұқсат алу үшін жасалады: орындалатын селекторды жазу үшін пайдалану мүмкін емес. (Қорғалған режим бағдарламалары деп аталатын құрылуда кішкентай жад моделі Мұнда барлығы бірдей жад сегментінде орналасқан, кодты және деректерді / стек үшін бөлек селекторларды қолдану керек, бұл екі селекторды да техникалық «бүркеншік» етеді.) GDT жағдайында бүркеншік аттар оларға қатынасу үшін жасалады. TSSes сияқты жүйелік сегменттер.

Сегменттердің дескрипторларында «Present» жалаушасы бар, егер қажеттілік туындаса, оларды жадтан шығаруға мүмкіндік береді. Мысалы, код сегменттерін немесе өзгертілмеген деректер сегменттерін лақтыруға, ал өзгертілген деректер сегменттерін дискіге ауыстыруға болады. Алайда, барлық сегменттерге блок ретінде операция жасау қажет болғандықтан, ауыстыру уақытында орын алуы үшін олардың мөлшерін шектеу қажет. Алайда кішігірім, оңай ауыстырылатын сегменттерді пайдалану сегмент регистрлерін жиі қайта жүктеу керек дегенді білдіреді, бұл уақытты қажет ететін жұмыс.

Қазіргі заманғы қолдану

The Intel 80386 микропроцессор енгізілді пейджинг - жеке виртуалды мекен-жайлар бойынша жеке физикалық жад парақтарын (өздері өте кішкентай жад бірліктерін) бөлу, оның артықшылығы, диск пейджингі сегментті ауыстыруға қарағанда әлдеқайда жылдам және тиімді. Сондықтан, қазіргі заманғы 32-биттік x86 операциялық жүйелер LDT-ді өте аз пайдаланады, ең алдымен мұраны іске қосу үшін 16 бит код.

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

Егер 32-биттік код 16-разрядты кодқа ерікті жад объектілерін жіберуге мәжбүр болмаса, мысалы. болжанған OS / 2 1.x эмуляциясында Windows NT немесе Windows 3.1-де эмуляция қабаты, 32 биттік адрес кеңістігінің мөлшерін жасанды түрде шектеу қажет емес.

Әдебиеттер тізімі

  1. ^ «X64 негізіндегі жүйелерге арналған патч-саясат». Егер операциялық жүйе осы модификацияның біреуін немесе басқа рұқсат етілмеген патчты анықтаса, ол қателерді тексеріп, жүйені өшіреді.

Сыртқы сілтемелер