modify_ldt(2) System Calls Manual modify_ldt(2) NUME modify_ldt - obine sau stabilete o intrare LDT pentru fiecare proces in parte BIBLIOTECA Biblioteca C standard (libc, -lc) REZUMAT #include /* Definiia lui struct user_desc */ #include /* Definiia constantelor SYS_* */ #include int syscall(SYS_modify_ldt, int func, void ptr[.bytecount], unsigned long bytecount); Nota: glibc nu ofera o funcie de invaluire pentru modify_ldt(), fiind necesara utilizarea syscall(2). DESCRIERE modify_ldt() citete sau scrie tabelul descriptorilor locali (LDT) pentru un proces. LDT este o matrice de descriptori de segmente la care poate face referire codul utilizatorului. Linux permite proceselor sa configureze un LDT pentru fiecare proces in parte (de fapt, pentru fiecare mm). Pentru mai multe informaii despre LDT, consultai Intel Software Developer's Manual sau AMD Architecture Programming Manual. Cand func este 0, modify_ldt() citete LDT in memoria indicata de ptr. Numarul de octei citii este cel mai mic dintre bytecount i dimensiunea reala a LDT, dei nucleul poate aciona ca i cum LDT ar fi umplut cu octei de zero la sfarit. In caz de succes, modify_ldt() va returna numarul de octei citii. Cand func este 1 sau 0x11, modify_ldt() modifica intrarea LDT indicata de ptr->entry_number. ptr indica o structura user_desc, iar bytecount trebuie sa fie egala cu dimensiunea acestei structuri. Structura user_desc este definita in ca: 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; }; In Linux 2.4 i versiunile anterioare, aceasta structura se numea modify_ldt_ldt_s. Campul contents este tipul de segment (date, date expandate, cod neconform sau cod conform). Celelalte campuri corespund descrierilor lor din manualul CPU, dei modify_ldt() nu poate activa bitul ,,accessed" definit de hardware i descris in manualul CPU. Un user_desc este considerat ,,gol" daca read_exec_only i seg_not_present sunt stabilite la 1, iar toate celelalte campuri sunt 0. O intrare LDT poate fi eliminata prin stabilirea unui user_desc ,,gol" sau, daca func este 1, prin stabilirea atat a base, cat i a limit la 0. Un segment de cod conform (adica unul cu coninut==3) va fi respins daca func este 1 sau daca seg_not_present este 0. Cand func este 2, modify_ldt() va citi zerouri. Aceasta pare a fi o reminiscena din Linux 2.4. VALOAREA RETURNATA In caz de succes, modify_ldt() returneaza fie numarul real de octei citii (pentru citire), fie 0 (pentru scriere). In caz de eec, modify_ldt() returneaza -1 i configureaza errno pentru a indica eroarea. ERORI-IEIRE EFAULT ptr indica in afara spaiului de adrese. EINVAL ptr este 0, sau func este 1 i bytecount nu este egal cu dimensiunea structurii user_desc, sau func este 1 sau 0x11 i noua intrare LDT are valori nevalide. ENOSYS func nu este nici 0, 1, 2, nici 0x11. STANDARDE Linux. NOTE modify_ldt() nu ar trebui sa fie utilizat pentru stocarea locala a firelor, deoarece incetinete comutarea contextelor i nu accepta decat un numar limitat de fire. Bibliotecile de creare de fire de execuie (threading) ar trebui sa utilizeze in schimb set_thread_area(2) sau arch_prctl(2), cu excepia nucleelor extrem de vechi care nu accepta aceste apeluri de sistem. In mod normal, modify_ldt() este utilizat pentru a rula cod vechi pe 16 bii sau cod segmentat pe 32 de bii. Cu toate acestea, nu toate nucleele permit instalarea segmentelor pe 16 bii. Chiar i in cazul nucleelor pe 64 de bii, modify_ldt() nu poate fi utilizat pentru a crea un segment de cod in modul lung (adica pe 64 de bii). Campul nedocumentat ,,lm" din user_desc nu este util i, in ciuda numelui sau, nu are ca rezultat un segment in modul lung. ERORI In nucleele pe 64 de bii inainte de Linux 3.19, activarea bitului ,,lm" in user_desc impiedica ca descriptorul sa fie considerat gol. Reinei ca bitul ,,lm" nu exista in antetele pe 32 de bii, dar aceste nuclee cu erori vor observa totui bitul chiar i atunci cand este activat intr-un proces pe 32 de bii. CONSULTAI I arch_prctl(2), set_thread_area(2), vm86(2) 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.06 31 octombrie 2023 modify_ldt(2)