Պաշտպանված ռեժիմ Ինչու՞ առաջացավ անհրաժեշտությունը։ Իրական ռեժիմում մի քանի խնդրի հետ աշխատելիս հարց է առաջանում մեկը մյուսին չխանգարելու, մեկի հիշողության տիրույթը մյուսինը չփչացնելու։ Այսինքն՝ բազմախնդրայնության ռեժիմում խնդիրների պաշտպանության հարցն է առաջանում։ Պաշտպանության ռեժիմի հիմնական նպատակը մի խնդրի պաշտպանությունն է մյուսի ներգործությունից։ Intel x86 պրոցեսորների հիշողությունը ղեկավարող ռեգիստորները(GDTR, LDTR, TR, IDTR), պաշտպանված ռեժիմում ավելացված դրոշները։ Ղեկավարող ռեգիստրները (Control Registers) 5-ն են՝ CR0,CR1,CR2,CR3,CR4, որոնք 32 բիթանի են։ Դիտարկենք CR0-ն։ Կրտսեր 2 բայթին անվանում են մեքենայի վիճակի բառ։ CR0-ի 0 համարի բիթը ցույց է տալիս՝ համակարգը գտնվում է պաշտպանված ռեժիմում, թե ոչ․ եթե pe=0, համարկարգը իրական ռեժիմում է, եթե pe=1, համակարգը պաշտպանված ռեժիմում է։ Ղեկավարող ռեգիստրների հետ կարելի է աշխատել mov հրամանով, բայց սա արտոնյալ հրաման է, այսինքն՝ աշխատելուց հրամանների համակարգում պիտի տրված լինի .386p, ․486p: Դրոշների ռեգիստր (386+ ավելացած դրոշներ) IOPL – մուտքի, ելքի արտոնության մակարդակ, 2 բայթ է NT – ներդրված խնդիր RF – վերաբերում է debug ռեգիստրների հետ աշխատանքին VM – եթե համակարգը վիրտուալ ռեժիմում է, այս դրոշը ընդունում է 1 արժեք, ընդհատումների հետ մշակման դեպքում օգտագործվում են VIP, VIF դրոշները AC – control word-ի համապատասխան բիթը միացած լինելու պարագայում կատարում է լրացուցիչ ստուգում, որ word-ի հետ աշխատելիս հասցեն լինի զույգ։ ID – պրոցեսորի բիթն է ստուգում Արտոնության մակարդակներ։ Պաշտպանության մեխանիզմները երկուսն են՝ 1. պաշտպանություն արտոնության մակարդակների միջոցով, 2. հիշողության կազմակերպում։ Սահմանված է 4 արտոնության մակարդակ՝ 0,1,2,3, դրա համար էլ IOPL–ը 2 բայթ է։ 0-ն ամենաարտոնյալ մակարդակն է, սրանով աշխատում է օպերացիան համակարգի միջուկը։ 1,2-ը նախատեսված են էլի օպերացիոն համակարգի սերվիսների համար, օրինակ՝ դրայվերների համար։ 3-ը կիրառությունների համար է, որը ամենաթույլն է։ Windows, Linux օպերացիոն համակարգերը օգտագործում են 2 արտոնության մակարդակ (միջուկի ռեժիմ/kernel mode, օգտագործողի ռեժիմ/user mode)։ Կան 3 հասկացություններ արտոնության մակարդակների հետ կապված․ CPL – ընթացիկ արտոնության մակարդակ/Current Privilege Level (CS և SS սեգմենտային ռեգիստրների 0 և 1 բիթերը), DPL – դեսկրիպտորի արտոնության մակարդակ/Descriptor Privilege Level, RPL – հարցման արտոնության մակարդակ/Requested Privilege Level: Հիշողության կազմակերպումը պաշտպանված ռեժիմում։ Պաշտպանված ռեժիմում գծային հասցեի որոշումը։ Իրական ռեժիմում ցանկացած հասցե, մուտք-ելքի սարք, ընդհատման վեկտոր օգտագործողին հասանելի էր։ Այսինքն հիշոցության կազմակերպումը թույլ կողմ էր։ Պաշտպանված ռեժիմում կա հիշողության կազմակերպման 2 մեխանիզմ․ 1. սեգմենտային մեխանիզմ, 2. էջային մեխանիզմ - վիրտուալ հիշողության կազմակերպում (Էջային կազմակերպումը միացված է, եթե ղեկավարող ռեգիստրի (CR0) PG բիթը 1 է)։ Դե որպեսզի կազմակերպումը լինի պաշտպանված, պետք է սեգմենտի մասին լրացուցիչ ինչ-որ ինֆորմացիա հիշվի, որը հիշվում է սեգմենտի դեսկրիպտոր կոչվող տվյալների կառուցվածքում։ Սեգմենտը ունի բազային հասցե, չափ, տիպ (կոդ սեգմենտ, տվյալների սեգմենտ և ստեկ սեգմենտ): Պաշտպանված ռեժիմում ներմուծվել է հասցեային տարածություն հասկացությունը։ Կա 3 հատ հասցեային տարածություն․ տրամաբանական հասցե – ծրագրի մեջ տրվող հասցեն է (սելեկտոր16 ։ շեղում32), //սելեկտորի դեր կատարում եմ սեգմենտային ռեգիստրները գծային հասցե (վիրտուալ հասցե), //32 բիթ ֆիզիկական հասցե։ Սեգմենտի սելեկտորներ։ Սեգմենտի սելեկտորներն են CS, DS, SS, ES, FS, GS (2 բայթ): Սելեկտորը դիտարկվում է 3 դաշտից կազմցած՝ RPL (Հարցման արտոնության մակարդակ) – 0, 1 համարի բիթեր, TI (Աղյուսակի ինդիկատոր) – 2 համարի բիթ, Index (Ինդեքս) – 3-15 համարի բիթեր։ Սեգմենտի ընտրությունը կատարվում է սեգմենտի սելեկտորի միջոցով։ Կախված TI-ից դիմումը կկատարվի կա՛մ GDT աղյուսակին (TI=0), կա՛մ LDT աղյուսակին (TI=1)։ Աղյուսակները իրենցից ներկայացնում են 8 բայթանի դեսկրիպտորների բազմություն։ Իսկ թե աղյուսակների միջից կոնկրետ որ դեսկրիպտորը վերցվի, որոշվում է index-ի միջոցով։ Այսինքն՝ սեգմենտի սկզբի հասցեն որոշվում է դեսկրիպտորի միջոցով, իսկ դեսկրիպտորին դիմում կատարկում է սելեկտորով։ Ստացվում է, որ ցանկացած դիմում հիշողությանը լրացուցիչ դիմում է աղյուսակի, որ որոշվի բազային հասցեն, որը ազդում է արտադրողականության, արագության վրա։ Դրա համար սեգմենտի սելեկտորները ունեն նաև թաքնված մաս (քեշ, hidden part), որտեղ պահվում է դեսկրիպտորից վերցրած ինֆորմացիան՝ բազային հասցե, լիմիթ, դիմելու ինֆորմացիան։ Հետևաբար երկրորդ անգամ նույն ds-ով աշխատելուց էլ հարկ չի լինի դեսկրիպտորին դիմել։ //CS-ին արժեք տալու իրավունք չունենք, քանի որ իրականացնում է համակարգի ռեկավարումը։ Այն ոչ բացահայտ փոխվում է far call-ի, far jump-ի, interrupt-ի ժամանակ: Պաշտպանված ռեժիմում գծային հասցեի որոշումը։ Տրամաբանական հասցեն սելեկտոր և offset-ն են։ TI-ը որոշում է, թե որ աղյուսակին ենք դիմում կատարում։ Ինդեքսի միջոցով GDT կամ LDT աղյուսակից ընտրվում է դեսկրիպտորը։ Ինդեքսը բազմապատկվում է 8-ով, քանի որ աղյուսակում դեսկրիպտորները 8 բայթանի են։ Դեսկրիպտորի 32 բիթ բազային հասցեին գումարվում է տրամաբանական հասցեի 32 բիթանոց offset-ը, և ստացվում է գծային հասցեն։ Դեսկրիպտորներ։ Դեսկրիպտորը 8 բայթանի տվյալների կառուցվածք է։ Այն կարող է լինել սիստեմային կամ սեգմենտային։ Եթե 12 համարի S բիթը 1 է, ուրեմն դեսկրիպտորը սեգմենտային է, եթե S բիթը 0 է, ուրեմն սիստեմային դեսկրիպտոր է։ Սեգմենտի դեսկրիպտոր (8 բայթ)։ Բազային հասցե – 8 բայթի կեսն է, 2,3,4,7 համարի բայթերը։ Լիմիթ – 0,1 բայթեր, 6 բայթի կրտսեր կիսաբայթ (ատրիբուտ 2-ի 0-3 բիթերում), հետևաբար գումարային 20 բիթ է, այսինքն մաքսիմում չափը 1ՄԲ է, որը պաշտպանված ռեժիմում չի բավականեցնի։ Դրա համար մտցված է մասշտաբի գաղափար (G բիթը)։ Լիմիթը մի դեպքում ցույց է տալիս վերևի սահմանը, այլ դեպքում՝ ներքևի սահման (ստեկ սեգմենտ)։ Լիմիթը հիշվում է, քանի որ եթե ծրագրի մեջ շեղումը լինի ավելի մեծ քան լիմիթն է, ապա տեղի կունենա պաշտպանության խախտում, բացառություն։ G բիթ (Granularity) – չափման միավորը բայթ է, թե 4 ԿԲ, ատրիբուտ 2-ի 23 բիթ։ Եթե G=0, բայթով է չափվում, եթե G=1, ԿԲ-ով է չափվում։ Եթե լիմիթը մաքսիմալ արժեք ունի՝ 1ՄԲ, 1ՄԲ*4ԿԲ=1ԳԲ։ Ատրիբուտ 1 – 5 համարի բայթ (Access Rights/AR:P, DPL, S, Type): Ատրիբուտ 2 – 6 համարի բայթ (G, D/B, A, Limit(16-19)): D (Default) – Կոդ սեգմենտի համար որոշում է սեգմենտը 32 բիթանի է (D=1), թե 16 (D=0): B (Big) – Տվյալների սեգմենտի համար ցույց է տալիս առավելագույն շեղումը՝ 0FFFFFFFFh (B=1), և 0FFFFh (B=0): AVL (Available) – 20 համարի բայթ, կարող է օգտագործվել ծրագրի կողմից ցանկացած նպատակով: Ատրիբուտ 1 (5-րդ բայթ) P (Present) (բիթ 7) – Սեգմենտի ներկայության բիթ: DPL (Descriptor Privilege Level) (5-6բիթեր ) - Դեսկրիպտորի արտոնության մակարդակ: S (System) (բիթ 4) – սեգմենտի դեսկրիպտոր (S=1) է, թե սիստեմային (S=0): Type (0-3 բիթ) - դեսկպիպտորի տիպը։ D/C (3 բիթ) (Data/Code) - տվյալների սեգմենտ (D/C=0), կամ Կոդ (D/C=1)։ E/C (2 բիթ) (expansion-direction/conforming) – ընդլայնման ուղղություն/ համաձայնեցված սեգմենտ։ W/R (1 բիթ) (write-enable/Read-Only) - գրելը թույլատրվում է/միայն կարդալ։ A (0 բիթ) (accessed) - սեգմենտին դիմում եղել է: Համաձայնեցված լինելու իմաստը կայանում է նրանում, որ կոդ սեգմենտի համար ավելի ցածր մակարդակի կոդից իրեն դիմում կատարելու թույլտվություն լինի։ Comform տիպի հայտարարվում են օպերացիոն համակարգի սերվիսներ։ Կոդ սեգմենտի դեսկրիպտորի տեսքը․ Տվյալների/ստեկի սեգմենտի դեսկրիպտորի տեսքը․ Գլոբալ դեսկրիպտորների աղյուսակ (GDT)։ GDT-ն հիշողության տիրույթ է դեսկրիպտորների տեղադրությամբ։ Երբ իրական ռեժիմից պաշտպանված ռեժիմ անցում է կատարվում, առաջին քայլերից մեկը այն է, որ ստեղծվում է GDT-ն։ Իրական ռեժիմում մեզ հասանելի է միայն 1ՄԲ հիշողությունը, և, հետևաբար, GDT աղյուսակը սովորաբար տեղակայվում է առաջին ՄԲ-ում։ GDT-ի դեսկրիպտորների քանակը կարող է լինել 0-ից մինչև 8192։ Պաշտպանված ռեժիմում ավելացած համակարգային ռեգիստրների մեջ էր մտնում GDTR ռեգիստրը, որը 6 բայթանի է։ Դրա միջոցով որոշվում է GDT աղյուսայի բազային հասցեն։ Բայց ինչու՞ է 4 բայթ։ Քանի որ բացի բազային հասցեն պարունակելուց, GDTR ռեգիստրը պարունակում է նաև լիմիթը, այսինքն՝ առավելագույնը քանի ռեգիստրի հետ կարելի է աշխատել։ Լիմիթը հիշելու իմաստը այն է, որ եթե ծրագրի մեջ դիմում կատարվի, և ինդեքսը լինի ավելի մեծ քան դեսկրիպտորի լիմիթն է, տեղի կունենա պաշտպանության խախտում և բացառություն։ GDT աղյուսակի կառուցվածքի առանձնահատկություններից մեկը այն է, որ առաջին 8 բայթը լրացված է 0-ներով, դրան անվանում են NULL descriptor։ Այսինքն եթե սելեկտորի ինդեքում գրված է 0, դիմում կկատարվի NULL descriptor-ին։ GDT-ի հետ աշխատելու հրամաններ․ LGDT m48 – GDTR-ի բեռնում, SGDT m48 – GDTR-ի արժեքի ստացում։ GDT աղյուսակը կարող է պարունակել ցանկացած դեսկրիպտոր, բացառությամբ ծուղակի և ընդհատման փականների։ Սիստեմային դեսկրիտպորներ։ Եթե դեսկրիպտորի S բիթը 0 է, ապա դեսկրիպտորը տիպը սիստեմային է։ Սիստեմային դեսկրիպտորները լինում են 2 տիպի․ 1. աղյուսակ նկարագրող (LDT, TSS), //սեգմենտի դեսկրիպտորի կառուցվածքով 2. փականներ (gates) – այլ արտոնության մակարդակներից կոդ սեգմենտին ղեկավարող հասանելիություն ապահովելու համար։ //ավելի արտոնյալ կոդի դիմելու հնարավորություն Փականները լինում են․ կանչի, ծուղակի, ընդհատման, խնդրի։ 16 հնարավոր տեսակները՝ 0 – պահված է 1 – ազատ TSS սեգմենտի նկարագրիչ (16 բիթանոց), 2 – LDT նկարագրիչ, 3 – զբաղված TSS սեգմենտի նկարագրիչ (16 բիթ.), 4 – կանչի փականի նկարագրիչ` call gate descriptor(16 բիթ.), 5 – խնդրի փականի նկարագրիչ` task gate descriptor, 6 – ընդհատման փականի նկարագրիչ`interrupt gate descriptor(16 բիթ.), 7 – ծուղակի/բռնիչի փականի նկարագրիչ` trap gate descriptor( 16 բիթ.), 8 – պահված է 9 – ազատ TSS սեգմենտի նկարագրիչ ( 32 բիթ.), 10 – պահված է 11 – զբաղված TSS սեգմենտի նկարագրիչ ( 32 բիթ.), 12 – կանչի փականի նկարագրիչ` call gate descriptor( 32 բիթ.), 13 – պահված է 14 – ընդհատման փականի նկարագրիչ`interrupt gate descriptor ( 32 բիթ.), 15 – ծուղակի/բռնիչի փականի նկարագրիչ` trap gate descriptor (32 բիթ.), լինում է GDT-ում լինում է GDT-ում լինում է GDT-ում լինում է GDT / LDT -ում լինում է GDT / LDT / IDT - ում լինում է IDT -ում լինում է IDT-ում լինում է GDT-ում լինում է GDT-ում լինում է GDT / LDT -ում լինում է IDT -ում լինում է IDT -ում Լոկալ դեսկրիպտորների աղյուսակ (LDT) LDT աղյուսակի իմաստը նույնպես դեսկրիպտորներ պահելն է։ Սա լրացուցիչ պաշտպանություն ապահովելու նպատակով է արված։ Յուրաքանչյուր խնդիր կարող է ունենալ LDT դեսկրիպտորներով որոշվող սեփական հասցեային տարածությունը։ GDT և LDT աղյուսակների տարբերությունները․ 1. GDT-ի դեպքում կար NULL descriptor․ առաջին 8 բայթը լցված էր 0-նորով, իսկ LDT աղյուսակի դեպքում NULL descriptor-ի անհրաժեշտությունը չկա։ 2. GDT աղյուսակը մեկն է և պարդատիր է, իսկ LDT աղյուսակների քանակը 0 և ավելի է։ 3. LDT աղյուսակի բազային հասցեն որոշելու համար օգտագործվում է LDTR ռեգիստրը, որը 2 բայթանի է։ LDTR ռեգիստրը սելեկտորի դեր է կատարում։ LDTR-ի միջոցով ընտրվում է LDT դեսկրիպտոր, որը արդեն կպարունակի բազային հասցե։ Քանի որ LDT դեսկրիպտորը գտնվում է միայն GDT աղյուսակում, ապա TI դաշտում պետք է լինի 0։ LDTR հետ աշխատելու հրամաններ․ LLDT m16 – GDTR-ի բեռնում, SLDT m16 – LDTR-ի արժեքի ստացում։ 4. GDT աղյուսակը կարող է պարունակել ցանկացած դեսկրիպտոր ինչ GDT-ն, բացառությամբ LDTի և խնդրի փականի։ 5. Քանի որ LDT-ն սելեկտորի դեր էր կատարում, ապա, ինչպես և մյուս սեգմենտային ռեգիստրները, LDT-ն ունի ստվերային մաս, արդյունավետությունը ապահովելու համար։ Լոկալ դեսկրիպտորի կառուցվածքը։ LDT դեսկրիպտորը աղյուսակ նկարագրող դեսկրիպտոր է, այսինքն նրա կառուցվածքը նման է սեգմենտային դեսկրիպտորի կառուցվածքին։ Բազա – 2,3,4,7 համարի բայթեր, Լիմիթ – 0,1 համարի բայթեր և ատրիբուտ 1-ի կրտսեր կիսաբայթ, S բիթ – 0 է, Type – 2 է, G բիթ – բայթով կամ ԿԲ-ով չափման միավոր, AVL – օգտագործվում է համակարգի կողմից։ Կանչի փական (Call Gate): Բոլոր փականների համար դեսկրիպտորի հիմնական ինֆորմացիան սելեկտոր։շեղում դաշտերի ներկայացումն է։Կանչի փականները սահմանում են մուտքի կետեր (entry points) ավելի արտոնյան կոդին ղեկավարությունը փոխանցելու համար։ Դրանք կատարում են ինտերֆեյսային միջնորմի դեր տարբեր արտոնության մակարդակի կոդ սեգմենտների միջև։ Սելեկտոր – 2, 3 համարի բայթեր, Պահպանված է 5-րդ բիթը (P, DPL, S, Type), Սեգմենտի մեջ շեղում – 0, 1, 6, 7 համարի բայթեր, WC (Word Count) – պարամետրերի քանակ, 4-րդ բայթի 0-4 բիթեր։ Որպեսզի արտոնյալ կոդը հասանելի լինի կանչի փականի միջոցով, անհրաժեշտ են մի շարք ստուգումներ արտոնության մակարդակների հետ կապված։ Կոդի արտոնության մակարդակը որոշվում է CPL-ի արժեքով, որը գտնվում է CS ռեգիստրում։ Այսինքն՝ եթե կոդը ունի արտոնության մակարդակ, ուրեմն CPL = 2: 2 արտոնության մակարդակի ծրագիրը ուզում է դիմում կատարել միջուկի ռեժիմի ինչ-որ ծրագրի։ Բայց այդ դիմումը գնալու է փականի միջոցով։ Անցման ժամանակ դեսկրիպտորի արտոնության մակարդակների ստուգում է կատարվում․ 1. Call Gate-ի DPL պետք է ≥ (ավելի քիչ արտոնյալ) լինի, քան պրոցեսի CPL-ը մինչև կանչը, 2. Արտոնյալ կոդի DPL դաշտը պետք է ≤ լինի, քան պրոցեսի CPL-ը մինչև կանչը (target segment DPL <= CPL), 3. Արտոնյալ կոդի DPL ≤ max(RPL, CPL) ≤ Call Gate DPL: Ե՞րբ կկատարվի դիմում կանչի փականին։ Առանձին հրամաններ չկան։ Դիմում կկատարվի far call, far jmp հրամանների միջոցով։ Far call-ի, far jmp-ի արգումենտը սեգմենտ։շեղում էր։ Սելեկտորի միջոցով ընտրվում էր դեսկրիպտոր։ Եթե call-ի միջոցով սելեկտորը դիմում է կատարում gate դեսկրիպտորի, ուրեմն տեղի կունենա դիմում կանչի փականի։ Gate descriptor-ի պարունակությունը սելեկտոր։շեղում –ն է։ Կընտրվի կոդի դեսկրիպտորը, որը պարունակում է ինֆորմացիա կոդի բազային հասցեի և սահմանաչափի մասին։ Հետո ղեկավարությունը փոխանցվում է 0 արտոնության մակարդակի։ 4-րդ բայթի պարամետրերի իմաստը․ Պաշտպանված ռեժիմում յուրաքանչյուր արտոնության մակարդակ ունի իր ստեկը։ Կանչի փականի միջոցով արտոնության մակարդակի փոփոխություն լինելիս ստեկը փոխվում է, բայց պարամետրերը կմնան հին ստեկի մեջ։ Դրա համար ավելի արտոնյալ մակարդակ անցնելիս տեղի է ունենում պարամետրերի պատճենահանում։ Փոխանցումը կատարելիս միշտ կատարվում են ստուգումներ․ Հիշողության էջային կազմակերպում։ Եթե էջային կազմակերպումը նծած է, ուրեմն պետք է գծային/վիրտուալ հասցեից թարգմանություն կատարվի 32 բիթանի ֆիզիկական հասցե։ Ո՞րն էր նպատակը վիրտուալ հիշողության կազմակերպման մտցնելու։ Ինչպես կարելի է իրականացնել ծրագիրը, որը պահանջում է ավելի շատ հիշողություն, քան ֆիզիկապես հասանելի է։ Մտածել են կազմակերպման եղանակ, որ օգտագործողից թաքցնում է ֆիզիկական հիշողության չափը, ստեղծում են հիշողության բիրտուալ տարածք, որն ավելի մեծ է, քան ֆիզիկականը (օգտագործողը չգիտի դրա մասին), հիշողությանը դիմումը կատարվում է էջերի միջոցով, այսինքն ընդհանուր հիշողությունը բաժանվում է էջերի, որը, ի տարբերություն սեգմենտի, ֆիքսած չափ ունի։ Էջը հիշողության հատված է։ Վիրտուալ հիշողության կազմակերպման մեջ խնդիրը այն է, որ ոչ բոլոր էջերն են, որ գտնվում են ֆիզիկապես հիշողության մեջ։ Միտքը կայանում է նրանում, որ բացի ֆիզիկական հիշողությունից, կազմակերպման համար օգտագործվում է սկավառակը, որտեղ գտնվում է էջերից մի մասի պարունակությունը։ Երբ պիտի դիմում կատարվի էջի, որը ֆիզիկապես հիշողության մեջ չի գտնվում, բացառության մեխանիզմի միջոցով ստիպում է, որ այդ էջը գա հիշողություն մեկ այլ էջի փոխարեն։ Վիրտուալ հիշողության կազմակերպման ժամանակ օպերացիոն համակարգը մի քանի ստրատեգիաների մշակմամբ է զբաղվում։ Ինթել պրոցեսորները սատարում են 3 չափի էջ․ 4 ԿԲ-անոց, որը հասանելի է պրոցեսորներից սկսած, 2 ՄԲ-անոց, 4 ՄԲ-անոց։ Intel386 Եթե CR0-ի 31-րդ PG(paging) բիթը 1 է, ապա էջային կազմակերպումը միացած է։ Կամ այլ բիթեր ևս էջային կազմնակերպման վերաբերյալ․ PSE (page size extensions) flag – bit 4 of CR4 (introduces in the Pentium processor), PAE (physical address extension) flag – bit 5 of CR4 (introduced in the Pentium Pro processors): Գծային հասցեի թարգմանությունը ֆիզիկական հասցեի։ 4 ԿԲ-անոց էջային կազմակերպման դեպքում գծային հասցեն ներկայացվում է 3 դաշտով․ 1. Directory (10 բիթ) (կատալոգ) – օգտագործվում է կատալոգի ընտրության համար, 2. Table (10 բիթ) – օգտագործվում է աղյուսակի ընտրման համար, 3. Offset (12 բիթ) – ընտրված էջի մեջ նշում է կոնկրետ շեղումը ֆիզիկական հասցեն ընտրելու համար։ //12 բիթ, քանի որ 12ԿԲ = 212 Կատարում է երկմակարդականի փնտրում։ Սկզբում դիմում է կատարվում էջի կատակոգին, հետո էջի կատակոգից էջի աղյուսակին, հետո էջի աղյուսակից ընտրվում է 20 բիթանոց ֆիզիկական հասցեն։ Առաջին դեպքում երբ դիմում է կատարվում էջերի կատալոգին, կոչվում է Page Directory Entry, երբ դիմում է կատարվում էջերի աղյուսակին, կոչվում է Page Table Entry: Տարրերը 32 բիթանոց տվյալների կառուցվածքներ են։ 32 բիթից 20-ը էջի բազային հասցեն որոշելու համար է օգտագործվում, իսկ մնացած 12 բիթերը լրացուցիչ ատրիբուտներ են տալիս էջի մասին։ Նախ որպեսզի էջի միջից որևէ 32 բիթանոց տվյալների կառուցվածքը ընտրվի, պետք է ունենալ տվյալ էջի բազային հասցեն(սկիզբը), էջերի կատալոգի բազային հասցեն որոշվում է CR3 ռեգիստրով, դրա համար CR3 ղեկավարող ռեգիստրի անունը նաև PDBR (Page Directory Base Register) է։ Իսկ թե աղյուսակից որերորդ 4 բայթը ընտրվի, որոշվում է գծային հասցեի առաջին 10 բիթերի(Directory) պարունակությամբ։ Իհարկե այդ պարունակությունը բազմապատկվում է 4-ով, քանի որ ամեն մեկը 4 բայթ է զբաղեցնում։ Directory Entry-ով ընտրվել մյուս աղյուսակի բազային հասցեն, սիկ մյուս 10 բիթով (Table) արդեն ընտրվում է կոնկրետ աղյուսակը։ Եվ offset-ով էլ ֆիզիկական էջի կոնկրետ բայթը։ Եթե 4ԿԲ-անոց կազմակերպումը չի օգտագործվում, արդեն գծային հասցեի կառուցվածքը ուրիշ է։ Էջի կատալոգի մուտքի կառուցվածքը (PDE)։ 32 բիթանոց տվյալների կառուցվածք է, որի 20 բիթը հաջորդ աղյուսակի բազային հասցեի համար է օգտագործվում (20 բիթ, որովհետև էջի կազմակերպումը 4 ԿԲ-անոց է), իսկ մնացած 12 բիթերը լրացուցիչ ատրիբուտներ են տալիս էջի մասին։ 0 բիթը (P) - ներկայության բիթն է, ինչպես սեգմենտում։ Երբ դիմում է կատարվում էջ, որտեղ P=0, այսինքն՝ հիշողության մեջ չէ, առաջանում է բացառություն, որը ստիպում է համակարգին՝ էջը բերվի հիշողություն։ 1 բիթը (R/W) - էջերը ևս կարդալու, գրելու հնարավորություն ունեն։ Այս բիթը կարող է վերաբերել էջի կամ էջերի խմբի՝ կախված նայում ենք PDE-ն, թե PTE-ն։ Եթե այս բիթը 0 է, ուրեմն էջը միայն կարդալու համար է, եթե 1 է, ուրեմն գրելու հնարավորություն էլ կա։ 2բիթը (U/S) (User/Supervisor) – եթե 0 ռեժիմ է, ուրեմն Supervisor ռեժիմում է, սա ավելի արտոնյալ ռեժիմ է, հնարավորություն է տալիս լրացուցիչ գործողություններ կատարել User ռիժիմի հետ համեմատած։ 3 և 4 բիթերը (PWT, PCD) – նախատեսված են էջային քեշի կազմակերպման համար, որ ամեն անգամ լրացուցիչ դիմում չկատարի հիշողությանը ֆիզիկական հասցեն որոշելու համար։ 5 բիթ (A) – ցույց է տալիս՝ դիմում եղել է, թե չէ։ 7 բիթ (PS) – էջերի կատալոգի մուտքի համար եթե 0 է, ապա 4 ԿԲ է։ Բայց ունեինք 2 և 4 ՄԲ-անոց էջային կազմակերպումներ, պարզ է, որ այս մի բիթով դրանք որոշել չենք կարող, դրա համար ղեկավարող ռեգիստրների լրացուցիչ բիթերով են որոշում։ 8 բիթ (G) – Գլոբալ էջ նշանակում է, որ այդ էջը միշտ գտնվում է հիշողության մեջ, իրեն դիսկ չի տարվում։ 9-11 բիթերը (Avail) - նախատեսված են սիստեմային ծրագրերի համար, իրենց հայեցողությամբ օգտագործելու համար: Էջի աղյուսակի մուտքի կառուցվածքը (PTE)։ Էջի կատալոգի և էջի աղյուսակի կառուցվածքը նման են, իրարից տարբերվում են մի քանի բիթերով։ 0 բիթը (P) - ներկայության բիթն է, ինչպես սեգմենտում։ Երբ դիմում է կատարվում էջ, որտեղ P=0, այսինքն՝ հիշողության մեջ չէ, առաջանում է բացառություն, որը ստիպում է համակարգին՝ էջը բերվի հիշողություն։ 1 բիթը (R/W) - էջերը ևս կարդալու, գրելու հնարավորություն ունեն։ Այս բիթը կարող է վերաբերել էջի կամ էջերի խմբի՝ կախված նայում ենք PDE-ն, թե PTE-ն։ Եթե այս բիթը 0 է, ուրեմն էջը միայն կարդալու համար է, եթե 1 է, ուրեմն գրելու հնարավորություն էլ կա։ 2բիթը (U/S) (User/Supervisor) – եթե 0 ռեժիմ է, ուրեմն Supervisor ռեժիմում է, սա ավելի արտոնյալ ռեժիմ է, հնարավորություն է տալիս լրացուցիչ գործողություններ կատարել User ռիժիմի հետ համեմատած։ 3 և 4 բիթերը (PWT, PCD) – նախատեսված են էջային քեշի կազմակերպման համար, որ ամեն անգամ լրացուցիչ դիմում չկատարի հիշողությանը ֆիզիկական հասցեն որոշելու համար։ 5 բիթ (A) – ցույց է տալիս՝ դիմում եղել է, թե չէ։ 6 բիթ (D) – եթե D=1, ապա տվյալ էջում գրելու գործողություն է կատարվել։ 7 բիթ (PAT) – քեշ մեխանիզմի համար է օգտագործվում։ 8 բիթ (G) – Գլոբալ էջ նշանակում է, որ այդ էջը միշտ գտնվում է հիշողության մեջ, իրեն դիսկ չի տարվում։ TLB բուֆեր (Translation Lookaside Buffer): Էջային թարգմանության ժամանակ լրացուցիչ օգտագործվում է TLB բուֆերը։ Այստեղ կատարվում է հասցեների քեշավորում։ Որպեսզի ֆիզիկական հասցեին դիմում կատարվի, օգտագործվում են էջային աղյուսակներ, իսկ TLB-ի քեշի միջոցով ֆիզիկական հասցեն արագ որոշվում է։ Եթե փոխվում է PTE, ապա անհրաժեշտ է ոչ վավեր դարձնել քեշ արժեքերը։ Ֆիզիկական հասցեի ընդլայնում ( Physical Address Extension (PAE) )։ Pentium Pro պրոցեսորներից սկսած նախատեսված է ֆիզիկական հասցեի ընդլայնում, որը հնարավորություն է տալիս 36 բիթ ֆիզիկական հասցեավորման, այսինքն ավելի մեծ հասցեային տարածության հետ կարելի է գործ ունենալ։ Որպեսզի այս մեխանիզմը միացած լինի, PAE դրոշը պիտի 1 լինի։ Ընդհատումների համակարգը պաշտպանված ռեժիմում։ Տարբերությունները իրական ռեժիմում և պաշտպանված ռեժիմում ընդհատումների համակարգի մշակման․ Իրական ռեժիմում։ Ընդհատումերի մշակումը կատարվում է ընդհատման վեկտորի միջոցով։ Ընդհատման տեսակները 2-ն են՝ ապարատուրային և ծրագրային։ Ընդհատման վեկտորը տեղադրվում է 0000։0000 հասցեից սկսած։ Որպեսզի տեղի ունենա ընդհատում, տեղի կունանա int n հրամանը, n [0, 255], և ռեկավարությունը տրվում էր n-ով որոշվող ենթածրագրին։ Դա որոշվում է ընդհատման վեկտորով։ Ապարատուրային ընդհատման օրինակ է մկնիկի շարժումը, ստեղնաշարի սեղմելը, մոդեմից ազդանշան գալը։ Պաշտպանված ռեժիմում։ Ընդհատումների մշակումը կատարվում է IDT (Interrupt Descriptors Table) աղյուսակի միջոցով։ Ավելանում է ընդհատումների նոր տեսակ՝ բացառությունը։ Բացառությունը այն ընդհատումն է, որի պատճառը հենց պրոցեսորն է։ Բացառության օրինակ է 0-ի վրա բաժանումը։ //Բացառությունների մեխանիզմի միջոցով վերահսկվում է պաշտպանությունը։ Ընդհատումների դեսկրիպտորների աղյուսակը կարող է տեղադրվել ցանկացած հասցեում։ Ընդհատման/բացառության մշակող պրոցեդուրայի կանչ։ Ենթադրենք՝ տեղի ունեցավ int n ընդհատում։ n համարի միջոցով տեղի է ունենում դիմում IDT աղյուսակին։ Համարով որոշվում է, թե որ դեսկրիպտորին դիմում կատարվի։ Կարող են լինել 3 տեսակի սիստեմային դեսկրիպտոր։ Ընդհատման կամ ծուղակի փականի միջոցով որոշվում է սելեկտորը, իսկ սելեկտորի միջոցով ընտրություն է կատարվում սեգմենտ դեսկրիպտորի, որը գտնվում է GDT կամ LDT աղյուսակում (որոշվում է 2 համարի բիթով)։ Սեգմենտի դեսկրիպտորից ընտրվում է բազային հասցեն, գումարվում է փականի մեջ եղած offset-ին, ստացվում է ընդհատումը մշակող պրոցեդուրայի հասցեն։ IDTR և IDT (ընդհատումների դեսկրիպտորների աղյուսակ)։ Նախ պիտի հայտնի լինի IDT աղյուսակի բազային հասցեն։ IDT աղյուսակի բազային հասցեն որոշվում է IDTR ռեգիստրի միջոցով։ IDTR ռեգիստրը 6 բայթանի է, որի 2 բայթը լիմիթն է, 4 բայթը բազային հասցեն։ Բազային հասցեի միջոցով որոշվում է աղյուսակի սկիզբը։ Եթե աղյուսակի դիմում տեղի ունեցավ այնպիսի n համարով, որ լիմիթից դուրս է, տեղի կունենա բացառություն։ IDTR ռեգիստրին դիմելու համար հրամաններ․ LIDT m48, SIDT m48: Եթե load անելուց արժեք է տրվում IDTR ռեգիստրին, օգտագործողը պետք է ունանա 0 արտոնության մակարդակ։ Եթե տեղի է ունեցել int 0 ընտհատում, տեղի կունենա դիմում 0 շեղումով, եթե տեղի է ունեցել int 1 ընտհատում, տեղի կունենա դիմում 1*8 շեղումով, եթե տեղի է ունեցել int n ընտհատում, տեղի կունենա դիմում n*8 շեղումով: Ընդհատման դեսկրիպտորներ։ Պաշտպանված ռեժիմում IDT աղյուսակը միակն է։ Այն կարող է պարունակել 3 տիպի սիստեմային դեսկրիպտորներ․ Խնդրի փական (task gate) – type = 5, Ընդհատման փական (interrupt gate) – type = 6/14, Ծուղակի փական (trap gate) – type = 7/15: Ընդհատման և ծուղակի փականների տարբերությունը․ Եթե int n-ի միջոցով դիմում է կատարվել ընդհատման փականի, մինչև ընդհատումը մշակող ենթածրագրին ղեկավարությունը տալը IF դրոշի արժեքը դառնում է 0, ինչը թույլ չի տալիս պատասխանել ընդհատումներին (այլ ծրագիր իրեն չընդհատի)։ Ծուղակը չի փոխում IF դրոշի արժեքը և օգտագործվում է ծրագրերի debug նպատակով։ IDT աղյուսակի դեսկրիպտորների կառուցվածքները։ 1. Խնդրի փականի ժամանակ բացի 5 համարի Access բայթից օգտագործվում է 2 բայթ TSS սեգմենտի սելեկտորը։ Տիպի դաշտում դրված է 5։ 2,3 բայթերը սելեկտորն է։ 2. Տիպի դաշտում դրված է 6, և ըստ D-ի որոշվում է 16 բիթանի է (D=0), թե 32 բիթանի (D=1)։ 2,3 բայթերը սելեկտորն է, և 0,1,6,7 բայթերը սեգմենտի մեջ շեղումը։ 3. Տիպի դաշտում դրված է 7, և ըստ D-ի որոշվում է 16 բիթանի է (D=0), թե 32 բիթանի (D=1)։ 2,3 բայթերը սելեկտորն է, և 0,1,6,7 բայթերը սեգմենտի մեջ շեղումը։ 4 համարի բայթը (պարամետրերի քանակը) չի օգտագործվում (օգտագործվում էր մենակ կանչի փականի համար)։ Ընդհատման խնդիր։ Հնարավոր է, որ ընդհատումը մշակող ենթածրագիրը ոչ թե պրոցեդուրայի միջոցով իրականացվի, այլ խնդրի միջոցով (task)։ Task-ը իրենից ներկայացնում է պրոցեդուրա, առանձին ծրագիր կամ խրագրերի համախումբ։ Այս դեպքում int n-ի միջոցով ղեկավարությունը կտրվի Task Gate-ին։ Task Gate-ի միակ ինֆորմացիան 2 բայթանի սելեկտորն էր, որի միջոցով դիմում կկատարվի GDT աղյուսակին։ GDT աղյուսակի միջոցով կընտրվի TSS դեսկրիպտորը, որի միջոցով դիմում կկատարվի TSS աղյուսակին, կորոշվի TSS աղյուսակի սկզբի հասցեն։ Բառացություններ (exceptions): Բառացություններ անվանում են այն ընդհատումներին, որոնք գեներացվում են պրոցեսորի կողմից ի պատասխան պաշտպանության պայմանների խախտման։ Բառացությունները կազմում են պաշտպանված ռեժիմի հիմքը։ Դրանց միջոցով է կատարվում վերահսկողությունը։ 00 -ից 1Fh համարի ընդհատումները նախատեսված են բացառությունների համար։ Դրանց մի մասը տրվում է software-ի օգտագործմանը, իսկ մյուս մասը կոնկրետ իմաստ ունի։ Բացառությունների շնորհիվ պրոցեսորը ավտոմատ արձագանքում է համակարգի պաշտպանութույնը խախտելու փորձերին։ Բացառությունների տեսակները։ Բացառությունները լինում են 3 տեսակի․ Վրիպակ (fault) – ենթադրվում է, որ սխալը կարելի է ուղղել։ Դասական օրինակ՝ #NP (Not Present): Ծուղակ (trap) – առաջանում է «ծուղակի մեջ» հայտնված հրամանի կատարումից հետո: Դասական օրինակ՝ #BR (Break Point): Վթար (abort) – այս բացառությունը ազդարարում է լուրջ խախտումների մասին, ծրագիրը էլ չի շարունակվում։ Որոշակի բացառությունների համար պրոցեսորը ստեկ է ուղարկում 2 բայթանի սխալի կոդ, որը թույլ է տալիս կոնկրետացնել սխալը։ Պաշտպանված ռեժիմի բացառությունները։ Հիշողության հարթ մոդել (Basic Flat Model)։ Հարթ մոդելը օգտագործողին ներկայանում է որպես 4ԳԲ-անոց անընդհատ տարածք։ Բայց սա չի նշանակում, որ դեսկրիպտորները վերանում են։ Բոլոր սեգմենտային ռեգիստրները, որոնք սելեկտորի դեր են կատարում, հղում են կատարում 0 բազային հասցեով սեգմենտին։ Պաշտպանված հարթ մոդել (Protected Flat Model)։ Պաշտպանված հարթ մոդելը ևս օգտագործողին ներկայանում է որպես 4ԳԲ-անոց անընդհատ տարածք։ Տարբերությունը հարթ մոդելի հետ այն է, որ եթե տեղի է ունենում դիմում հիշողությանը, որը ֆիզիկապես չկա, տեղի է ունենում բացառություն, այսինքն՝ պաշտպանված է։ Բազմասեգմենտային մոդել (Multi-Segment Model): Կան մի քանի data սեգմենտներ, մի քանի code սեգմենտներ, կա ստեկը։ Սա ծրագրի համար մի քանի սեգմենտների հետ աշխատող մոդել է։ Խնդիրների ղեկավարում (փոխարկում) (Task Switching)։ Task-ը ծրագիր է կամ ծրագրերի մի խումբ, որը ունի իր միջավայրը։ Ինթել ճարտարապետությունը ապարատուրային եղանակով սատարում է խնդիրների փոխարկումը սկսած 80386։ Task Switching-ը ներկայիս օպերացիոն համակարգերի կողմից չի օգտագործվում։ Օգտագործվել է Linux-ի ցածր տարբերակներում։ Ապարատուրային եղանակով խնդիրների փոխարկումը չի գործում IA-32e (x64). Այն առաջացնում է բացառություն, եթե փորձ է արվում call/jmp դիպել խնդրի փականի/TSS դեկրիպտորի։ Խնդրի կառուցվածքը։ Ամեն խնդրի հետ կապվում է մի սեգմենտ, որը կոչվում է խնդրի վիճակի սեգմենտ, որը հղում է կատարում code, data, ընթացիկ մակարդակի stack սեգմենտներին։ Կա մի քանի արտոնության մակարդակներին համապատասխան ստեկ և այդ ինֆորմացիան ևս հիշվում է խնդրի վիճակի սեգմենտում։ Խնդրի համար գործում է Task Register-ը, որը 2 բայթանի է, ասյինքն կատարում է սելեկտորի դեր։ Այսինքն՝ դիմում է կատարում GDT աղյուսակին, ընտրում է TSS դեսկրիպտորը, և այդտեղից որոշում է բազային հասցեն։ Արդյունավետությունը ապահովելու համար կատարվում է քեշինգ։ Մի խնդրից մյուսին անցում կատարելիս էջերը փոխվում են, և CR3-ը օգտագործվում է էջերի կատալոգի բազային հասցեն որոշելու համար։ Այն խնդիրը, որը ներկա պահին աշխատում է, կոչվում է զբաղված խնդրի TSS։ Խնդիրների ղեկավարման հետ կապված տվյալների կառուցվածքներ: • Խնդրի վիճակի սեգմենտ /Task-state segment (TSS), • Խնդրի վիճակի սեգմենտի դեսկրիպտոր /TSS descriptor, • Խնդրի փականի դեսկրիպտոր /Task-gate descriptor, // Բացի TSS Descriptor-ից կա ևս մեկ անուղղակի տարբերակ TSS-ին դիմելու։ Դա խնդրի փականի դեսկրիպտորն է։ • Խնդրի ռեգիստր /Task register, • EFLAGS ռեգիստրի NT դրոշ: // Խնդիրների փոխարկման ժամանակ դիտարկման առառկա է նաև EFLAGS ռեգիստրի NT (ներդրված խնդիր) դրոշը։ Երբ մի խնդիրը կանչում է մեկ այլ խնդիր, NT=1: Առաջին խնդրի համար NT=0: TSS-ի կառուցվածքը։ TSS աղյուսկակը 104 և ավել երկարությամբ հիշողություն է։ Բայց համակարգը այս սեգմենտի հետ միասին կարող է լրացուցիչ ինֆորմացիա հիշել, օրինակ fpu-ի ռեգիստրների հետ կապված։ TSS աղյուսկակում հիշվում են բոլոր ընդհանուր օգտագործման ռեգիստրները՝ EAX, ..., EDI (4 բայթ), դրոշների ռեգիստրը՝ EFLAGS, հաշվիչի ռեգիստրը՝ EIP, էջերի կատալոգի բազային ռեգիստրը՝ CR3(PDBR), արտոնության մակարդակների հետ կապված SS-ESP զույգերը, սեգմենտային ռեգիստրները՝ ES, …, GS, LDT սելեկտորի արժեքը (ցույց է տալիս տվյալ խնդրի հետ կապված LDT-ն), նախորդ խնդրի լինկը (Previous Task Link) (2 բայթ է, կատարում է սելեկտորի դեր), մուտք-ելքի բազային հասցե (I/O Map Base Address) (տալիս է աղյուսակի մուտք-ելքի քարտեզի շեղումը, որը որոշում է մուտք-ելքի սարքի արտոնությունը)։ TSS դեսկրիպտոր։ TSS դեսկրիպտորը սիստեմային է (S=0): P բիթ – ներկայությունը հիշողությունում, DPL – արտոնության մակարդակ, Type – Access1 բայթի 0-3 բիթերը որոշում են դեսկրիպտորի տիպը, եթե ավագ բիթը 1 է, ապա 32 բիթանոց TSS դեսկրիպտոր է, եթե 0 է, ապա 16 բիթանի, B բիթ – Access1 բայթի 1 համարի բիթը զբաղվածության բիթն է, Բազային հասցե – 2,3,4,7 համարի բայթեր (32 բիթ), Լիմիթը – 0,1, Access2-ի կրտսեր կիսաբայթ, որը 104-ից պակաս լինել չի կարող, G բիթ – լիմիթի չափման մասշտաբային միավոր, 22 բիթ – ունի 0 արժեք, դեր չի խաղում, 21 բիթ – ունի 0 արժեք։ AVL – օգտագործվում է համակարգի կողմից։ Խնդրի ռեգիստր։ Խնդրի ռեգիստրը կատարելով սելեկտորի դեր GTD աղյուսակից ընտրում է TSS Descriptor-ը։ TSS Descriptor-ը պարունակում է բազային հասցեն, որից որոշվում է TSS աղյուսակի սկիզբը։ Լիմիթի միջոցով էլ վերահսկվում է TSS աղյուսակի վերին սահմանը։ Եթե փոխվում է TR ռեգիստրի արժեքը, փոխվում է նաև իր անտեսանելի մասը։ Ինչպե՞ս դիմում կատարել TSS սեգմենտին։ Եղանակներ․ 1. TSS դեսկրիպտորի միջոցով, որը կարող է գտնվել միայն GDT աղյուսակում։ 2. Task Gate–ը հիշում է մի սելեկտոր և դրա միջողով դիմում է կատարում TSS դեսկրիպտորի, որի միջոցով էլ որոշվում է TSS-ի բազային հասցեն։ Մտցվել է Task Gate-ը, քանի որ, ի տարբերություն TSS Descriptor-ի, այն կարող է գտնվել ինչպես GDT, այնպես էլ LDT, IDT աղյուսակներում։ Ներդրված խնդիրներ։ Եթե վերին մակարդակի առաջին խնդրից դիմում կատարվի երկրորդ խնդրի, NTն կդառնա 1 և երկրորդի լինկը ցույց կտա նախորդ խնդրի TSSի վրա։ Եթե երկրորդը կանչեց երրոդի, ապա երրոդի լինկը ցույց կտա երկրոդի վրա, և այլն։ Task Register-ը ցույց է տալիս ընթացիկ TSS-ը, իսկ նշված շղթայով կարելի է հասնել առաձին խնդրին։ Խնդիրների փոխարկում – կանչ։ Առանձին հրաման մի խնդրից մյուսին անցում կատարող ինթելը չի նախատեսել։ Մի խնդրից մյուսին անցում կարող է կատարվել FAR JMP, FAR CALL հրամանների միջոցով, երբ սելեկտորը դիմում է կատարում TSS դեսկրիպտորի, FAR JMP, FAR CALL հրամանների միջոցով, երբ սելեկտորը իրենից ներկայացնում է խնդրի փականի սելեկտոր, ընդհատում/բացառություն է մշակվում, երբ դիմում է կատարվում IDT աղյուսակում խնդրի փականի, IRET հրամանի կատարման ժամանակ, երբ EFLAGS.NT=1: Խնդիրների փոխարկում – քայլերի հաջորդականություն։ 1. Որ TSS-ին որ դիմում կատարվեց, դրանով կորոշվի նոր TSS-ը։ 2. Նոր TSS-ին դիմում կատարելու իրավունք պետք է լինի։ Դրա համար կատարվում է արտոնությունների ստուգում․ դեպք 1: max(CPL,RPL) ≤ DPLTSS, դեպք 2: max(CPL,RPL) ≤ DPLшлюза (DPLTSS դեր չի խաղում), 3 և 4 դեպքերում արտոնությունների ստուգում չի իրականացվում։ 3. Ստուգում, որ TSS-ի սահմանաչափը խախտված չէ։ 4. Ստուգվում է խնդրի հասանելիությունը։ 5. Ստուգում, որ նոր TSS և նոր խնդիր սեգմենտները ներկա են հիշողության մեջ։ 6. Եթե փոխարկումը իրականացվում է JMP կամ IRET հրամաններով, ապա ընթացիկ խնդրի համար մաքրվում է զբաղվածության բիթը, իսկ CALL-ի կամ ընդհատման մշակման դեպքում՝ հին խնդրի զբաղվածության բիթը։ Ի՞նչ է տեղի ունենում խնդիրների փոխարկման ժամանակ։ • • Պրոցեսորը հիշում է կոնտեքստը հին TSS-ում (TSS-ի կառուցվածքի բոլոր ռեգիստրները, CR3-ը, LDT-ն), Փոխվում է TSS կապի դաշտը, • • • • Նոր խնդրի TSS դեսկրիպտորում նոր խնդիրը նշվում է որպես զբաղված, TR ռեգիստրը բեռնվում է նոր արժեքով, Նոր TSS-ում բեռնվում է ընթացիկ կոնտեքստը, CR0.TS=1 և սկսվում է նոր խնդրի կատարումը։ Պաշտպանություն։ Պաշտպանությունը ապահովող ստուգումները բաժանում են կատեգորիաների․ 1. Սահմանային արժեքի ստուգում, //երբ տեղի է ունենում դիմում հիշողությանը, offset-ը պիտի ≤ լինի լիմիթից, 2. Տիպի ստուգում, //գրել կոդ սեգմենտում – չի կարելի -- բացառություն 3. Արտոնության մակարդակի ստուգում, 4. Հասցեային տարածության սահմանափակում, //պաշտպանված ռեժիմում ցանկացած հասցեի չի կարելի դիմում կատարել, ապահովվում է սելեկտորի հնարավորությամբ 5. Մ/ե սահմանափակում, //պետք է արտոնության մակարդակը ≤ լինի IOPL դաշտի արժեքից, հակառակ դեպքում մուտք-ելքի քարտեզում համապատասխան բիթը պետք է հնարավորություն տա սարքին դիմելու։ 6. Հրամանների համաքածուի սահմանափակում։ //արտոնյալ և ոչ արտոնյալ հրամաններ, եթե հրամանը արտոնյալ է, ապա այն կարող է կատարվել միայն 0 արտոնության մակարդակով Էջերի և սեգմենտների պաշտպանության թույլատրում/արգելում։ CR0 ռեգիստրում PE դրոշը պետք է 1 լինի, որ պրոցեսորը աշխատի պաշտպանված ռեժիմում։ Եթե բոլոր ծրագրերը աշխատում են նույն 0 արտոնության մակարդակով, ապա արտոնության հետ կապված ստուգումները անտեսվում են։ Էջային կազմակերպումը միացած է, եթե CR0-ի PG բիթը հավասար է 1։ Էջերի կազմակերպման համար լրացուցիչ պաշտպանական բիթեր են նախատեսված R/W և U/S բիթերը։ Եթե սրանք նույն արժեքը ունենան, կստացվի, որ այս բիթերի հետ կապված պաշտպանական ստուգումները չեն իրականացվի։ էջերի մակարդակով պաշտպանությունը կարելի է անջատել WP-ի Բիթը դարձնել 0, Էջերի կատալոգի և էջերի աղյուսակի տարրերում R/W–ն և (U/S)-ն դարձնել 1։ Դաշտեր և դրոշներ, որոնք օգտագործվում են էջերի և սեգմենտների մակարդակով պաշտպանության ժամանակ։ Դեսկրիպտորի տիպի դրոշ (S) – դեսկրիպտորը սեգմենտային է, թե սիստեմային, Դեսկրիպտորի տիպի դաշտ (Access1-ի 0-3 բիթերը) – ցույց են տալիս սիստեմային և սեգմենտային դեսկրիպտոր լինելու դեպքում նրա տեսակը, Դեսկրիպտորի լիմիթի դաշտ (0,1 բայթեր, Access2-ի կրտսեր կիսաբայթ) – որոշում են սեգմենտի չափը, G դրոշ – որոշում է սեգմենտի չափման միավորը (բայթ, թե 4ԿԲ), E դրոշ – data սեգմենտ լինելու դեպքում 2 համարի բիթը ուներ E իմաստ (Expand down, Expand up), որի հետ կապված լիմիթի ստուգումը տարբեր ձևով է իրականանում։ Եթե 0 է, հասցեները աճում են դեպի ներքև (սովորական սեգմենտ), եթե 1 է՝ ներքև (ստեկի օրինակ), DPL – արտոնության մակարդակ, RPL – հարցման արտոնության մակարդակ, որը ցույց է տալիս դեսկրիպտորին դիմելու պահանջվող արտոնության մակարդակը, CPL – ընթացիկ արտոնության մակարդակ (CS-ի 0,1 բիթեր), User/Supervisor (U/S) – ցույց է տալիս, թե որ ռեժիմում է գտնվում (0 – համակարգային, 1 օգտագործողի), համակարգային ռեժիմը ավելի արտոնյալ է, քան օգտագործողի ․․․ (կատալոգի կամ էջերի աղյուսակի տարրի բիթ 2)։ Read/Write (R/W) – լրացուցիչ պաշտպանություն է էջերի մակարդակով (0 – միայն կարդալ, 1 – կարդալ և գրել) … (կատալոգի կամ էջերի աղյուսակի տարրի բիթ 1): Սահմանաչափի ստուգում։ Հիշողությանը ցանկացած դիմում կատարելիս լինում է ստուգում, որպեսզի տվյալ սեգմենտին դիմելիս լիմիթից դուրս չլինի ծրագիրը։ Դրա համար օգրագործվում է դեսկրիպտորի լիմիթի դաշտը՝ դիտարկված նաև G բիթը։ Սահմանաչափի ստուգումը կատարվում է տարբեր ձևերով՝ կախված սեգմենտի տիպից։ Օրինակ՝ ստեկ սեգմենտի դեպքում ներքևի սահման է ստուգվում, սովորական սեգմենտի դեպքում՝ վերին սահման։ Պրոցեսորը նաև ստուգում է GDT, IDT, LDT աղյուսակների և ընթացիկ TSS սեգմենտի սահմանաչափերը չթույլատրելով դուրս գալ սահմանից։ Տիպի ստուգում։ Արտոնության մակարդակներ։ Արտոնության մակարդակ ուներ դեսկրիպտորը (DPL), սելեկտորը (CS-ի համար CPL անվանումն ունի, մյուս ռեգիստրների համար՝ RPL): Սեգմենտ կամ փականի տիպից կախված՝ DPL մեկնաբանվում է հետևյալ կերպ. • Տվյալների սեգմենտ - DPL-ը որոշում է ամենամեծ արտոնության մակարդակը, որը կարող է ունենալ ծրագիրը կամ խնդիրը այդ սեգեմենտին դիմելու համար։ Օրինակ՝ եթե տվյալների սեգմենտի DPL-ը 1 է, ապա միայն 0 և 1 արտոնություն ունեցող ծրագրերը կարող են դիմել այդ սեգմենտին (CPL 0 կամ 1) (կոդ սեգմենտը կարող է իրենից ավելի քիչ արտոնյալ ծրագրի դիմել), • Չհամաձայնեցված (այսինքն՝ սովորական) կոդ սեգմենտ առանց կանչի փականի - DPL-ը որոշում է արտոնության մակարդակը, որը պետք է ունենա ծրագիրը կամ խնդիրը այդ սեգմենտին դիմելու համար։ Օրինակ՝ եթե DPL 0 է, ապա այդ սեգմենտին կարող է դիմել միայն CPL = 0 սեգմենտ, • Կանչի փական - DPL-ը որոշում է ամենամեծ արտոնության մակարդակը, որը կարող ունենալ ընթացիկ ծրագիրը կամ խնդիրը այդ կանչի փականին դիմելու (դիմելու կանոնը նունն է, ինչ տվյալների սեգմենտի համար)․ • Համաձայնեցված և ոչ համաձայնեցված կոդ սեգմետ՝ հասանելի կանչի փականով - DPL-ը որոշում է ամենափոքր արտոնության մակարդակը, որը պետք է ունենա ընթացիկ ծրագիրը կամ խնդիրը այդ սեգմենտին դիմելու համար։ Օրինակ՝ եթե համաձայնեցված սեգմենտի DPL-ը 2 է, ապա այդ սեմգմենտին կարող են դիմել միայն CPL-ը 2 և 3 արտոնության մակարդակներից, • TSS - DPL-ը որոշում է ամենամեծ արտոնության մակարդակը, որով ծրագիրը կամ խնդիրը կարող են դիմել TSS (դիմելու կանոնը նունն է, ինչ տվյալների սեգմենտի համար)։ Արտոնյալ հրամաններ։ Եթե ծրագրի մեջ կան գրված արտոնյալ հրամաններ, վերևում կգրենք ․386p։ Արտոնյալ հրամանները ընդունված է դիտարկել 3 խմբի․ • 0 արտոնության մակարդակի հրամաններ (LGDT, LLDT, LTR, LIDT), • մ/ե նկատմամբ զգայուն հրամաններ (IN/OUT), • հրամաններ, որոնց իրականացումը կախված է CPL (POPF IOPL, IF)։ //POPF-ով ստեկից դրոշների ռեգիստրը վերականգնվում էր, IOPL-ի հետ օգտագործման դեպքում ստացվում է, որ ինքներս մեզ արտոնություն ենք տալիս և in, out-ը կարող ենք օգտագործել Վերհիշենք․ • Load Global/Interrupt Descriptor Table (lgdt, lidt) lgdt mem48 lidt mem48 • MEM48 -> GDTR MEM48 -> IDTR • Store Global/Interrupt Descriptor Table Register (sgdt, sidt) sgdt mem48 sidt mem48 //GDT-ի բազային հասցեն GDTR-ում է //IDT-ի բազային հասցեն IDTR-ում է //sgdt/sldt are not used in application programs, they are used in operating systems. • LLDT • • LLDT- Load Local Descriptor Table Register r/m16 // SELECTOR -> LDTR LLDT is not used in application programs. It is used in operating systems. LTR —Load Task Register ltr r/m16 // r/m16 -> Task Register • Store Machine Status Word (smsw) //CR0-ի 0,1 համարի բայթերտ մեքենայի վիճակի բառն է smsw r/m16 MSW -> r/m16 • Load Machine Status Word (lmsw) lmsw r/m16 r/m16 -> MSW Verify a Segment for Reading or Writing (verr, verw) //ստուգել սեգմենտը կարդալու և գրելու համար verr r/m16 verw r/m16 //Ստուգում է՝ սելեկտորի միջոցով ընտրված դեսկրիպտորում Access բայթում կարդալու/գրելու իրավունքը կա թե չէ։ Եթե իրավունքը կա, ապա ZF=1, հակառակ դեպքում ZF=0։ • MOV (ղեկավարող դեգիստների հետ աշխատելիս) – ղեկավարող ռեգիստրների կարդացում, • • • • • • • • • • • CLTS - Сброс флага переключения задачи в регистре CR0 (Clear Task-Switched flag) MOV (в регистр отладки) - Чтение и запись в регистр отладки INVD - Сброс кэша (объявление его недостоверным), без обратной записи WBINVD - Сброс кэша (объявление его недостоверным), с обратной записью INVLPG - Сброс (invalidate) элемента TLB HLT - Остановка процессора RDMSR - Чтение из регистра спецификации модели MRS (Read Model-Specific Register). WRMSR - Запись в регистр спецификации модели MSR (Write Model-Specific Register). RDPMC - Чтение счётчика мониторинга производительности (Read PerformanceMonitoringCounter). RDTSC - Чтение счётчика тактов процессора (Read Time-Stamp Counter). Հասանելության իրավուքների ստուգում (Load Access Rights Byte): LAR r16, r/m16 LAR r32, r/m32 Երկրորդ օպերանդը կատարում է սելեկտորի դեր։ Սելեկտորի միջոցով դիմում է կատարվում աղյուսակին, ընտրվում է դեսկրիպտորը, և այդ դեսկրիպտորի Access բայթը բեռնվում է առաջին օպերանդ։ Եթե 16 բիթանով օպերանդ է բեռնվում, գործում է FF00 դիմակը, այսինքն տալու է ավագ բայթը։ Եթե 32 բիթանով օպերանդ է բեռնվում, գործում է 00FxFF00 դիմակը, այսինքն տալու է նաև Access2-ի կիսաբայթը։ • r/m16 (masked by FF00) -> r16, • r/m32 (masked by 00FxFF00) -> r32։ Կարող է տեղի ունենալ բացառություն/սխալ․ Սելեկտորի միջոցով դիմում է կատարվում աղյուսակում, բայց եթե լիմիթից դուրս է եկել (կամ եթե արտոնության մակարդակների ստուգման սխալ կա, կամ սիմում է կատարվել սիստեմային դեսկրիպտորի, որը համապատասխան տիպի չէ), ապա ZF=0։ Եթե ZF=1, ապա destination-ը արժեք ստացել է: Սահմանի ստուգում/ Load Segment Limit։ • • LSL r16, r16/m16 LSL r32, r32/m16 Երկրորդ օպերանդը կատարում է սելեկտորի դեր։ Լիմիթը բեռնվում է առաջին օպերանդ, բայց լիմիթը 20 բիթ էր, այսինքն 16 բիթանոց տարբերակում հնարավոր է լիմիթի կորուստ։ Եթե G=1, 12 բիթով շեղում կատարած է ցույց տալիս։ 32 բիթանոց տարբերակում կորուստ չենք ունենա։ Ինչպես LAR հրամանի դեպքում այստե Երկրորդ օպերանդը կատարում է սելեկտորի դեր ղ էլ ZF-ի միջոցով ստուգվում է՝ վավեր սեգմենտի ենք դիմում կատարել, թե ոչ։