[so2] pointer din userspace

Razvan Deaconescu razvan.deaconescu at cs.pub.ro
Fri Apr 17 13:46:23 EEST 2015


Vali Ghita via so2 <so2 at cursuri.cs.pub.ro> writes:
> În data de 17 aprilie 2015, 10:41, Catalin Vasile via so2
> <so2 at cursuri.cs.pub.ro> a scris:
>> Un pointer din userspace mai poate fi folosit in alta parte decat in
>> tratarea apelurilor de sistem? Daca folosesc pointerul ala ma va duce la
>> datele care trebuie?
>> Un exemplu mai concret:
>> Am un pointer din userspace salvat undeva (l-am salvat la write/read in
>> device driver-ul meu), iar cineva imi porneste un worker thread sau kthread
>> dintr-o intrerupere. Daca eu accesez zona aia de memorie va sti sa se duca
>> la zona corecta de memorie (ma rog, ce consider eu zona corecta de memorie,
>> din perspectiva mea)?
>
> Salut,
>
> Pana in momentul in care se executa work-ul tau sau kthread-ul este
> posibil sa se fi efectuat o schimbare de context si in acest caz s-a
> schimbat spatiul de adresa. Adresa virtuala pe care ai salvat-o e
> posibil sa nu mai fie mapata in spatiul de adresa al noului proces,
> sau, chiar daca este mapata, este asocitata cu alta adresa fizica.

În mod normal un kernel thread are nevalid spațiul de adresă de user
space. Pur și simplu se schimbă contextul cu cel al kernel thread-ului,
iar kernel thread-ul nu are spațiu de adresă de user space (adică în
structura sa task_struct, câmpul mm_struct este NULL). Orice accesare a
unei adrese de user space va rezulta, așadar într-un page fault și oops
(doar dacă nu folosiți copy_to/from_user).

Nu același lucru se întâmplă însă într-un handler de întrerupere sau un
tasklet/softirq. Acolo este posibil ca task-ul întrerupt de întrerupere
sau tasklet/softirq să fie un proces obișnuit cu spatiu de adresă de
user space valid. Și atunci e posibil să meargă accesarea acelei
adrese. Doar să nu fie pentru spatiul de adresă la care te așteptai tu
:-)

În concluzie, dacă accesezi o adresă de user space dintr-un kernel
thread sau work vei obține mereu page fault, pe când dintr-un handler de
întrerupere sau tasklet/softirq este posibil (nu mereu) să nu obții page
fault (dar nu vei controla care anume spațiu de adresă de user space
l-ai accesat).

Răzvan


More information about the so2 mailing list