[so2] pointer din userspace

Vali Ghita valx92 at gmail.com
Fri Apr 17 13:55:16 EEST 2015


Salut,

Dar din ce am inteles de la curs, cand se face switch la un kernel
thread nu se mai schimba registrul cu adresa directorului de pagini,
deci maparile ar trebui sa ramana cele ale procesului precedent si asa
nu ar rezulta neaparat un page fault de fiecare data. Am inteles eu
gresit?

În data de 17 aprilie 2015, 13:46, Razvan Deaconescu via so2
<so2 at cursuri.cs.pub.ro> a scris:
> 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
> _______________________________________________
> http://ocw.cs.pub.ro/courses/so2/resurse/lista-discutii


More information about the so2 mailing list