Ia-32 kapcsolókészlet, dev64

Amikor hívás kapu vezérlésére használnak átviteli nem megfelelő kiváltságosabb kódszegmenshez (DPL nem megfelelő, ha a rendeltetési hely kódja szegmens kisebb, mint a CPL), a processzor automatikusan a stack jogosultsági szint cél szegmensben. Ez kapcsolási verem végzünk, hogy megakadályozzák az összeomlását a kiváltságos kódot, hiszen az eljárás a felhasználói elégtelen verem helyet. Ezenkívül megvédi a kiváltságos eljárásokat a kevésbé privilegizált kód lehetséges ütközésétől (véletlen vagy szándékos) a megosztott veremen keresztül.







Minden feladat, hogy meghatározza akár 4 halom: az egyik az alkalmazási kód (működő jogosultsági szint 3), és egy-egy, a másik szint 2, 1 és 0. Ha csak két szintje jogosultságszint alkalmazunk, majd két halom 3 és 0 kell meghatározni . Minden köteg egy külön szegmensben van, és egy szegmensválasztó és egy veremmutató jelöli meg.

A szegmens kiválasztó és stack pointer a verem jogosultsági szint 3 vannak SS, és az ESP regiszterek, illetve amikor a kód a jogosultsági szint 3, és automatikusan a veremben tárolt a hívó váltáskor verem.

A 0, 1 és 2 kiváltsági szint mutatói az aktuálisan futó feladat TSS-jében tárolódnak (lásd a 7-2. Ábrát).

Ia-32 kapcsolókészlet, dev64

(Ábra az Intel kézikönyvből)

Mindegyik mutató egy szegmensválasztóból és egy kötegmutatóból áll (az ESP regiszterbe be van töltve). Az induló mutatók csak olvasható értékek. A processzor nem változtatja meg őket a feladat végrehajtásakor. Csak arra használják, hogy új kötegeket hozzon létre a kiemelt szegmensek hívásaihoz. Ezek a halmok elhelyezettek (töröltek), amikor visszatérnek a hívott eljárásból. A következő hívás során új köteg keletkezik a kezdeti veremmutató használatával. TSS verem nem határozza meg a jogosultsági szintet 3, a processzor pospolku megakadályozza irányítás átadása az alkalmazott eljárásokra hozzáférési szintek 0, 1, 2 a jogosultsági szint 3, bármilyen más módszer, mint a visszatérő (hozam).

Az operációs rendszer feladata az összes privilegizált szint felhalmozása és verem szegmensleírók létrehozása, valamint az induló mutatók betöltése a TSS-be. Mindegyik verem legyen olvasható / írható (ezt a szegmensleíróban a típus mezőben engedélyezni kell), és elegendő helyet kell biztosítania (a limit mező által meghatározott módon) a következő entitások tárolásához:







  • A hívó eljárás SS, ESP, CS és EIP nyilvántartása
  • A hívott eljáráshoz szükséges paraméterek és ideiglenes változók
  • A zászlóregiszter az EFLAGS és a hibakód, egy megszakítás vagy kivételkezelő explicit implicit hívásával.

A verem sok helyet igényel nagyszámú ilyen típusú keret tárolására, mivel az eljárások gyakran más eljárásokat is hívnak, az operációs rendszer számos megszakítás fészkelését támogatja. Mindegyik veremnek elegendő helyet kell biztosítania az adatoknak a legrosszabb esetekben történő tárolásához egy adott jogosultság szintjén. (Még ha az operációs rendszer nem használja a hardveres multitasking mechanizmust, még mindig létre kell hoznia legalább egy TS-t a kötegek átkapcsolására). Ha a hívás átjárón keresztül kezdeményezett eljárás egy privilegi szintváltozást eredményez, a processzor a következő lépéseket hajtja végre a kötegek váltásához és a hívott eljárás végrehajtásához új jogosultsági szinttel.

  1. A célkód-szegmens DPL (új CPL) használatával választja ki az új kötegre mutató mutatót (szegmentválasztó és kötegjelölő) a TSS-ből.
  2. Olvassa a szegmensválasztót és a veremmutatót a kötegre, amelyre át szeretné váltani a jelenlegi TSS-t. A köteg szegmens választójának, a veremmutatójának vagy a köteg szegmensleírójának olvasása során észlelt korlátok bármelyike ​​megsérti az érvénytelen TSS (#TS) kivételt.
  3. Ellenőrzi a köteg szegmens fogantyúját a típus illesztéshez és a jogosultsági szinthez, és érvénytelen TSS (#TS) kivételt generál, ha sérüléseket észlel.
  4. Ideiglenesen tárolja az aktuális SS és ESP regisztereket.
  5. Betölti az új értékeket a szegmensválasztó és a köteg mutató SS és EIP.
  6. Helyezi az SS és EIP regiszterek ideiglenesen tárolt értékeit (a hívási eljáráshoz) az új veremben (lásd az 5-13. Ábrát).
  7. Másolja a hívó átjáró paraméter mezőjében megadott paraméterek számát a hívó vereméről az új veremre. Ha a számlálás nulla, a paraméterek nem kerülnek másolásra.
  8. Beállítja az utasításmutatót (a CS és EIP regiszterek aktuális értékei) az új verembe.
  9. Betölti az új kódszegmens szegmens választóját és az új EIP utasításmutatót a hívás átjárótól a CS, EIP regiszterekhez, és megkezdi a hívott eljárás végrehajtását.

Cm. Leírás CALL utasítás 3. fejezetében dokumentum kézikönyve (Instruction Set Reference) az IA-32 Intel Architecture Szoftverfejlesztő kézikönyv, 2. kötet részletes leírást a hozzáférési szintek a fékek és más biztonsági ellenőrzéseket, amikor a processzor által végrehajtott további hívja a hívást kapun.

Ia-32 kapcsolókészlet, dev64

(Illusztráció az Intel kézikönyvből)

A hívó átjáró paraméterszámláló mezője határozza meg az adategységek számát (legfeljebb 31), amelyet a processzornak a hívási eljárás vereméről a hívott eljárás veremére kell másolni. Ha több mint 31 elem szükséges, az egyik paraméter egy mutató lehet egy adatszerkezethez vagy tárolt SS értékekhez, az ESP regiszterek a "régi verem" paramétereinek elérésére használhatók. A hívott eljárásra átvitt adatok egysége a hívás átjáró méretétől függ (az 5.8.3. Szakaszban leírt "Call Gateways" részben leírtak szerint).

Ossza meg ezt:




Kapcsolódó cikkek