Virtualny adresovací priestor na linuxoch

30.04.2008 11:56 | blackhole_socket

Rád by som v článku podrobnejšie predviedol používanie segmentovanej a stránkovanej pamäti na operačnom systéme linux, vzhľadom na bezpečnosť.

Linuxové jadro zásadne nevyužíva možnosti segmentovanej pamäti. Pretože je ale na x86 segmentovanie povinnou časťou adresácie , musí sa s tým nejak jadro linuxu vysporiadať.

Definované sú celkom 4 segmenty. Kódový a dátový segment pre režím jadra , kódový a dátový segment pre užívateľský režím.

V zdrojových kódoch linuxového jadra najdeme pre nastavenie deskriptoru takéto alebo podobné hodnoty (závisí od verzie jadra).

ENTRY(gdt_table)
.quad 0x0000000000000000 /* NULL decriptor */
.quad 0x0000000000000000 /* not used */
.quad 0x00cf9a000000ffff  /* 0x10 kernel 4GB code at 0x00000000 */
.quad 0x00cf92000000ffff  /* 0x18 kernel 4GB data at 0x00000000 */
.quad 0x00cffa000000ffff  /* 0x23 user 4GB code at 0x00000000 */
.quad 0x00cff2000000ffff  /* 0x18 user 4GB data at 0x00000000 */

Vidíme, že všetky segmenty začínajú na adrese 0x00000000 a sú veľké 4GB.
Sú kódové či dátové , nikdy nie sú systémové. Dva sú určené pre režim jadra a majú DPL na najvyšej úrovni oprávnení (Ring0). Dva sú pre užívateľský režim a majú najnižšiu úroven oprávnení takz. Ring3.
Kódové segmenty majú v type nastavené príznaky pre čítanie a spustiteľnosť. Dátové segmenty majú nastavené príznaky pre čítanie a zápis.

Pretože sa kódový i dátový segment naplno prekrývajú, sú dáta adresované offsetom vzhľadom k ľubovoľnému segmentu uložené na rovnakej virtuálnej adrese. Predstavme si napríklad hodnotu 0x90 uloženú na adrese 0x10. Keď prevedieme prístup na adresu 0x10 s cieľom zapísať na ňu nejaké dáta, prístup sa prevedie cez dátový segment a bude povolený. Ak skúsime data na adrese 0x10 spustiť, prístup sa prevedie cez kódový segment a bude taktiež povolený. To znamená, že v celom virtuálnom adresovom priestore ide previesť čítanie, zápis (pokiaľ nie je stanované stránkovanie inak) aj spúštanie.
Jednotlivé segmenty a ich rozdielne príznaky sú prekryté. Zostáva jedine rozdiel úrovní oprávnení DPL.

K ochrane častí virtuálneho adresovacieho priestoru proti zápisu linuxové jadro využíva jedine stránkovanie.

Pri požiadavke procesu o pridelenie stránky sa hodnota U/S bitu nastavuje podľa toho, či o ňu žiada jadro alebo užívateľský proces (pre jadro je nastavená na 0). Spustiteľný binárny formát je vnútorne rozdelený na sekcie, v ktorých sú príznaky na povolenie zápisu. Pri zavedení programu do pamäti stránky preberajú príznaky z týchto sekcií. Stránky, ktoré sa za behu programu alokujú pre potreby zásobníka či haldy, majú zo známych dôvodov povolenie zápisu nastavené.

Z horeuvedených poznatkov môžeme učiniť dva dôležité závery. Celý virtuálny adresovací priestor procesu je prístupný pre čítanie a spúštanie. Stránky, ktoré obsahujú špecifické sekcie binárneho spustiteľného formátu, môžu byť chránené proti zápisu. Zbytok stránok má príznak zápisu povolený.

Dúfam, že ste si z článku urobili aký-taký záver o virtuálnom adresovacom priestore na linuxoch.

================================================
good links:

    • Re: Virtualny adresovací priestor na linuxoch 02.05.2008 | 13:39
      Avatar blackhole   Návštevník

      x86 virtualny adresovaci priestor je zaujimava vec asi iba pre vyvojarov samotneho kernelu. Mozno niekto kto sa uci x86 (napriklad tak ze vyvija nejaky vlastny micro kernel) by v tomto nieco nasiel, ale taki ludia zvycajne hladaju v specifikaciach a manualoch o problemoch samotnych. Napriklad ked chcem pochopit strankovanie, potrebujem vediet ako vyzera jedna bunka v page table; ked chcem pochopit segmentovanie, potrebujem vediet ako vyzera jedna bunka v GDT alebo LDT. Pri popise tychto buniek vsak uvidim ze sa urcuje DPL a CPL, respektive user/supervisor bit, a so stipkou logiky si uz domyslim ze aj linux to musi robit tak ako to robi.
      Ak potrebujem adresy ktore su v clanku (neviem k comu) - pozriem si ich predsa niekde v /proc.
      Ked hovoris o x86 tak by si mohol popisat aj 32 bitove adresy, nie 64 bitove ked ty mas 64 bitovy procesor.
      Hodnota tohoto clanku je mala - tym co problematike rozumeju toto netreba, ti ktori jej nerozumeju nemozu rozumiet ani tomuto.

      • Re: Virtualny adresovací priestor na linuxoch 02.05.2008 | 15:04
        Avatar vid   Používateľ

        Ked hovoris o x86 tak by si mohol popisat aj 32 bitove adresy, nie 64 bitove ked ty mas 64 bitovy procesor.

        preco mas pocit ze pisal o 64bitoch? mne sa ani nezda:
        - Adresy uvadza na 8 hex miest, 64bit adresy su 16 miest
        - Spomina ze segmentovanie sa NEPOUZIVA - na x86-64 sa segmentovanie ani velmi neda pouzit (aj ked segmentove registre stale treba nejak nastavit)

    • Re: Virtualny adresovací priestor na linuxoch 02.05.2008 | 15:12
      Avatar vid   Používateľ

      Popisat ako sa linux vysporiadava s nastavenim registrov je dobra tema, ale chcelo by to viac rozpisat. Napriklad:

      - Popisat ako to je na 64 bitoch, 32 bytove deskriptory, ze adresy FS a GS sa naplnaju cez MSR, atd.

      - Ako to ze v tej GDT co si dal nikde nieje TSS? Ten predsa tiez musi byt nejako nastaveny. Tiez by bolo pekne popisat ako.

      - Nieje na linuxe nejaky ekvivalent windowsackeho TEB? Podla mna dost uzitocna vec. Ako sa potom riesi strukturovany exception handling v C, nebodaj "rucne" cez setjmp() a longjmp() ?

      Takto mi to prijde trochu kusovite informacie, kebyze to rozoberies do hlbky tak podla mna velmi dobry clanok.

      • Re: Virtualny adresovací priestor na linuxoch 28.05.2008 | 16:27
        Avatar blackhole_ventYl   Používateľ

        Linux TSS nema, nakolko dnes v drvivej vacsine pripadov nepouziva x86 mechanizmus na prepinanie taskov, ale vyuziva svoj vlastny mechanizmus a na x86 HW vlastnost SYSENTER / SYSLEAVE, pretoze x86 taskswitcher ma dost velku reziu a niektore ciastkove ulohy (napr. prepinanie kontextu FPU) x86 taskswitcher neriesi, cize je nutne ich osetrovat este navyse (FPU hodi po rozsynchronizovani kontextu FPU Exception).

        ---
        Cuchat s nadchou, to je ako sniffovat bez promiscu.

        --- Cuchat s nadchou, to je ako sniffovat bez promiscu.
        • Re: Virtualny adresovací priestor na linuxoch 28.05.2008 | 17:06
          Avatar vid   Používateľ

          Ze sa tento task switching nepouziva som vedel, ale bol som v tom ze TS musi aj tak byt nejako nastaveny aby procesor dovolil prepat do protected modu. Ale ako tak pozeram, asi som sa mylil...