set_thread_area(2) System Calls Manual set_thread_area(2) NUME get_thread_area, set_thread_area - manipuleaza informaiile de stocare locala a firelor de execuie BIBLIOTECA Biblioteca C standard (libc, -lc) SINOPSIS #include /* Definirea constantelor SYS_* */ #include #if defined __i386__ || defined __x86_64__ # include /* Definirea structurii struct user_desc */ int syscall(SYS_get_thread_area, struct user_desc *u_info); int syscall(SYS_set_thread_area, struct user_desc *u_info); #elif defined __m68k__ int syscall(SYS_get_thread_area); int syscall(SYS_set_thread_area, unsigned long tp); #elif defined __mips__ || defined __csky__ int syscall(SYS_set_thread_area, unsigned long addr); #endif Nota: Nu exista nicio funcie invaluitoare (wrapper) glibc pentru aceste apeluri de sistem astfel ca este necesara utilizarea a syscall(2). DESCRIERE Aceste apeluri ofera suport specific arhitecturii pentru o implementare a memoriei locale a firelor de execuie. In prezent, set_thread_area() este disponibil pe m68k, MIPS, C-SKY i x86 (ambele variante pe 32 i 64 de bii); get_thread_area() este disponibil pe m68k i x86. Pe m68k, MIPS i C-SKY, set_thread_area() permite stocarea unui indicator arbitrar (furnizat in argumentul tp pe m68k i in argumentul addr pe MIPS i C-SKY) in structura de date a nucleului asociata cu firul de execuie apelant; acest indicator poate fi recuperat ulterior folosind get_thread_area() (a se vedea, de asemenea, seciunea NOTE pentru informaii privind obinerea indicatorului de fir de execuie pe MIPS). Pe x86, Linux dedica trei intrari in GDT (,,Global Descriptor Table", Tabelul de descriptori globali) pentru stocarea locala a firelor de execuie. Pentru mai multe informaii despre GDT, consultai ,,Intel Software Developer's Manual" sau ,,AMD Architecture Programming Manual". Ambele apeluri de sistem primesc un argument care este un indicator la o structura de tipul urmator: struct user_desc { unsigned int entry_number; unsigned int base_addr; unsigned int limit; unsigned int seg_32bit:1; unsigned int contents:2; unsigned int read_exec_only:1; unsigned int limit_in_pages:1; unsigned int seg_not_present:1; unsigned int useable:1; #ifdef __x86_64__ unsigned int lm:1; #endif }; get_thread_area() citete intrarea GDT indicata de u_info->entry_number i completeaza restul campurilor din u_info. set_thread_area() stabilete o intrare TLS in GDT. Intrarea din matricea TLS definita de set_thread_area() corespunde valorii lui u_info->entry_number (u_info->numarul-intrarii) transmisa de utilizator. In cazul in care aceasta valoare este in limite, set_thread_area() scrie descriptorul TLS indicat de u_info in matricea TLS a firului. Atunci cand set_thread_area() primete un entry_number de -1, cauta o intrare TLS libera. In cazul in care set_thread_area() gasete o intrare TLS libera, valoarea u_info->entry_number este definita la returnare pentru a arata ce intrare a fost modificata. Un user_desc este considerat ,,gol" daca read_exec_only i seg_not_present sunt stabilite la 1 i toate celelalte campuri sunt 0. Daca un descriptor ,,gol" este transmis la set_thread_area(), intrarea TLS corespunzatoare va fi tearsa. A se vedea seciunea ERORI pentru detalii suplimentare. Incepand cu Linux 3.19, set_thread_area() nu poate fi utilizat pentru a scrie segmente neprezente, segmente pe 16 bii sau segmente de cod, dei tergerea unui segment este in continuare acceptata. VALOAREA RETURNATA Pe x86, aceste apeluri de sistem returneaza 0 in caz de succes i -1 in caz de eec, cu errno configurata pentru a indica eroarea. Pe C-SKY, MIPS i m68k, set_thread_area() returneaza intotdeauna 0. Pe m68k, get_thread_area() returneaza valoarea indicatorului de zona a firului (stabilita anterior prin set_thread_area()). ERORI-IEIRE EFAULT u_info este un indicator nevalid. EINVAL u_info->entry_number este in afara limitelor. ENOSYS get_thread_area() sau set_thread_area() a fost invocat ca un apel de sistem pe 64 de bii. ESRCH (set_thread_area()) Nu a putut fi localizata o intrare TLS libera. STANDARDE Linux. ISTORIC set_thread_area() Linux 2.5.29. get_thread_area() Linux 2.5.32. NOTE Aceste apeluri de sistem sunt, in general, destinate a fi utilizate numai de bibliotecile de fire de execuie ,,threading". arch_prctl(2) poate interfera cu set_thread_area() pe x86. Consultai arch_prctl(2) pentru mai multe detalii. In mod normal, acest lucru nu reprezinta o problema, deoarece arch_prctl(2) este utilizat in mod normal numai de programele pe 64 de bii. Pe MIPS, valoarea curenta a indicatorului zonei firului de execuie poate fi obinuta cu ajutorul instruciunii: rdhwr dest, $29 Aceasta instruciune este captureaza i este gestionata de catre nucleu. ERORI Pe nucleele pe 64 de bii inainte de Linux 3.19, unul dintre biii de umplutura din user_desc, daca era definit, ar fi impiedicat ca descriptorul sa fie considerat gol (a se vedea modify_ldt(2)). Ca urmare, singura modalitate fiabila de a terge o intrare TLS este de a utiliza memset(3) pentru a aduce la zero intreaga structura user_desc, inclusiv biii de umplutura, i apoi de a defini biii read_exec_only i seg_not_present. Pe Linux 3.19, un user_desc format in intregime din zerouri, cu excepia lui entry_number, va fi, de asemenea, interpretat ca o cerere de tergere a unei intrari TLS, dar acest lucru s-a comportat diferit pe nucleele mai vechi. Inainte de Linux 3.19, registrele segmentelor DS i ES nu trebuie sa faca referire la intrarile TLS. CONSULTAI I arch_prctl(2), modify_ldt(2), ptrace(2) (PTRACE_GET_THREAD_AREA i PTRACE_SET_THREAD_AREA) TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.9.1 2 mai 2024 set_thread_area(2)