[so2] [Test curs 3] Lamurire get_user
Ursescu Ionut
ursescuionut97 at gmail.com
Tue Mar 17 00:13:55 EET 2020
Salutare,
In cadrul cursului 3 (primul care s-a tinut online) am primit la test
urmatoarea intrebare:
```
Pentru următoarea secvență de cod, câte intrări vor fi adăugate în tabela
de excepții:
char x;
short y;
int i, s = 0;
if (get_user(x, user_ptr_1))
return -EINVAL;
for(i = 0; i < x; i++) {
if (get_user(y, user_ptr_2))
return -EINVAL;
s += y;
}
```
M-am uitat putin peste implementarea `get_user` din kernel (
https://elixir.bootlin.com/linux/latest/source/arch/x86/include/asm/uaccess.h#L166
).
Aici se apeleaza in functie de sizeof(*ptr) (in asm volatile -> call
__get_user_%p4, ) una din functiile __get_user_ din getuser.S (
https://elixir.bootlin.com/linux/v5.5.9/source/arch/x86/lib/getuser.S#L39).
Ele sunt implementate ca functii (in asm). Se marcheaza cum am vazut la
curs instructiunea movzbl (%_ASM_AX),%edx (in cazul celei cu sizeof(*ptr)
== 1) prin label-uri, iar la finalul fisierului este chemat macroul
_ASM_EXTABLE_UA pentru fiecare tip de functie (pentru fiecare functie
__get_user_). In final, fiecare apel _ASM_EXTABLE_UA pune in sectiunea
`__ex_table` un entry, folosind label-urile puse mai sus (
https://elixir.bootlin.com/linux/v5.5.9/source/arch/x86/lib/getuser.S#L137).
In concluzie avand codul de la test si presupunand ca avem un sistem pe
x86_64 normal compilat putem spune ca raspunsul ar fi trebuit sa fie minim
4 entry-uri in tabela de exceptii (cele 4 puse cu _ASM_EXTABLE_UA). Este
ceva gresit in intelegerea mea?
Multumesc anticipat,
Ursescu Ionut
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cursuri.cs.pub.ro/pipermail/so2/attachments/20200317/eb8f1580/attachment-0001.html>
More information about the so2
mailing list