[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