| memfd_secret(2) | System Calls Manual | memfd_secret(2) |
memfd_secret - creează un fișier anonim bazat pe RAM pentru a accesa regiuni de memorie secrete
Biblioteca C standard (libc, -lc)
#include <sys/syscall.h> /* Definirea constantelor SYS_* */ #include <unistd.h>
int syscall(SYS_memfd_secret, unsigned int flags);
Notă: glibc nu oferă nicio funcție învăluitoare pentru memfd_secret(), fiind necesară utilizarea syscall(2).
memfd_secret() creează un fișier anonim bazat pe RAM și returnează un descriptor de fișier care face referire la acesta. Fișierul oferă o modalitate de a crea și de a accesa regiuni de memorie cu o protecție mai puternică decât fișierele obișnuite bazate pe RAM și hărțile de memorie anonime. Odată ce toate referințele deschise la fișier sunt închise, acesta este eliberat automat. Dimensiunea inițială a fișierului este stabilită la 0. În urma apelului, dimensiunea fișierului ar trebui să fie stabilită utilizând ftruncate(2).
Zonele de memorie care susțin fișierul creat cu memfd_secret(2) sunt vizibile numai pentru procesele care au acces la descriptorul de fișier. Regiunea de memorie este eliminată din tabelele de pagini ale nucleului și numai tabelele de pagini ale proceselor care dețin descriptorul de fișier cartografiază memoria fizică corespunzătoare; (astfel, paginile din regiune nu pot fi accesate de către nucleul însuși, astfel încât, de exemplu, indicatorii către regiune nu pot fi trecuți în apelurile de sistem).
Următoarele valori pot fi combinate în mod binar OR în flags pentru a controla comportamentul lui memfd_secret():
Ca valoare de retur, memfd_secret() returnează un nou descriptor de fișier care se referă la un fișier anonim. Acest descriptor de fișier este deschis atât pentru citire, cât și pentru scriere (O_RDWR), iar O_LARGEFILE este definit pentru descriptorul de fișier.
În ceea ce privește fork(2) și execve(2), se aplică semantica obișnuită pentru descriptorul de fișier creat de memfd_secret(). O copie a descriptorului de fișier este moștenită de procesul-copil creat de fork(2) și se referă la același fișier. Descriptorul de fișier este păstrat de execve(2), cu excepția cazului în care nu a fost activat fanionul „close-on-exec”.
Regiunea de memorie este blocată în memorie în același mod ca și în cazul mlock(2), astfel încât nu va fi niciodată scrisă în spațiul de interschimb, iar hibernarea este inhibată atâta timp cât există descrieri memfd_secret(). Cu toate acestea, implementarea lui memfd_secret() nu va încerca să populeze întregul interval în timpul apelului mmap(2) care atașează regiunea în spațiul de adrese al procesului; în schimb, paginile sunt alocate efectiv doar pe măsură ce sunt introduse prin eroare. Cantitatea de memorie permisă pentru hărțile de memorie ale descriptorului de fișier se supune acelorași reguli ca și mlock(2) și nu poate depăși RLIMIT_MEMLOCK.
În caz de succes, memfd_secret() returnează un nou descriptor de fișier. În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.
Linux.
Linux 5.14.
Apelul de sistem memfd_secret() este conceput pentru a permite unui proces din spațiul utilizatorului să creeze un interval de memorie inaccesibil pentru oricine altcineva, inclusiv pentru nucleu. Nu există o garanție de 100% că nucleul nu va putea accesa intervale de memorie susținute de memfd_secret() în orice circumstanțe, dar, cu toate acestea, este mult mai greu de a extrage date din aceste regiuni.
memfd_secret() asigură următoarele protecții:
Modul în care memfd_secret() alocă și blochează memoria poate avea un impact asupra performanțelor generale ale sistemului; prin urmare, apelul de sistem este dezactivat în mod implicit și este disponibil numai dacă administratorul de sistem l-a activat folosind parametrul de nucleu „secretmem.enable=y”.
Pentru a preveni eventualele scurgeri de date din regiunile de memorie susținute de memfd_secret() dintr-o imagine de hibernare, hibernarea este împiedicată atunci când există utilizatori memfd_secret() activi.
fcntl(2), ftruncate(2), mlock(2), memfd_create(2), mmap(2), setrlimit(2)
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
| 2 mai 2024 | Pagini de manual de Linux 6.9.1 |