Virtualny adresovací priestor na linuxoch

30.04.2008 13: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
      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...