.\" -*- coding: UTF-8 -*- .\" Copyright (c) 1995 Michael Chastain (mec@duracef.shout.net), 22 July 1995. .\" Copyright (c) 2015 Andrew Lutomirski .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH modify_ldt 2 "30 martie 2023" "Pagini de manual de Linux 6.05.01" .SH NUME modify_ldt \- obține sau stabilește o intrare LDT pentru fiecare proces în parte .SH BIBLIOTECA Biblioteca C standard (\fIlibc\fP, \fI\-lc\fP) .SH REZUMAT .nf \fB#include \fP /* Definiția lui \fBstruct user_desc\fP */ \fB#include \fP /* Definiția constantelor \fBSYS_*\fP */ \fB#include \fP .PP \fBint syscall(SYS_modify_ldt, int \fP\fIfunc\fP\fB, void \fP\fIptr\fP\fB[.\fP\fIbytecount\fP\fB],\fP \fB unsigned long \fP\fIbytecount\fP\fB);\fP .fi .PP \fINotă\fP: glibc nu oferă o funcție de învăluire pentru \fBmodify_ldt\fP(), fiind necesară utilizarea \fBsyscall\fP(2). .SH DESCRIERE \fBmodify_ldt\fP() citește 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 să configureze un LDT pentru fiecare proces în parte (de fapt, pentru fiecare mm). Pentru mai multe informații despre LDT, consultați Intel Software Developer's Manual sau AMD Architecture Programming Manual. .PP Când \fIfunc\fP este 0, \fBmodify_ldt\fP() citește LDT în memoria indicată de \fIptr\fP. Numărul de octeți citiți este cel mai mic dintre \fIbytecount\fP și dimensiunea reală a LDT, deși nucleul poate acționa ca și cum LDT ar fi umplut cu octeți de zero la sfârșit. În caz de succes, \fBmodify_ldt\fP() va returna numărul de octeți citiți. .PP Când \fIfunc\fP este 1 sau 0x11, \fBmodify_ldt\fP() modifică intrarea LDT indicată de \fIptr\->entry_number\fP. \fIptr\fP indică o structură \fIuser_desc\fP, iar \fIbytecount\fP trebuie să fie egală cu dimensiunea acestei structuri. .PP Structura \fIuser_desc\fP este definită în \fI\fP ca: .PP .in +4n .EX 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; }; .EE .in .PP În Linux 2.4 și versiunile anterioare, această structură se numea \fImodify_ldt_ldt_s\fP. .PP Câmpul \fIcontents\fP este tipul de segment (date, date expandate, cod neconform sau cod conform). Celelalte câmpuri corespund descrierilor lor din manualul CPU, deși \fBmodify_ldt\fP() nu poate activa bitul „accessed” definit de hardware și descris în manualul CPU. .PP Un \fIuser_desc\fP este considerat „gol” dacă \fIread_exec_only\fP și \fIseg_not_present\fP sunt stabilite la 1, iar toate celelalte câmpuri sunt 0. O intrare LDT poate fi eliminată prin stabilirea unui \fIuser_desc\fP „gol” sau, dacă \fIfunc\fP este 1, prin stabilirea atât a \fIbase\fP, cât și a \fIlimit\fP la 0. .PP Un segment de cod conform (adică unul cu \fIconținut==3\fP) va fi respins dacă \fIfunc\fP este 1 sau dacă \fIseg_not_present\fP este 0. .PP Când \fIfunc\fP este 2, \fBmodify_ldt\fP() va citi zerouri. Aceasta pare a fi o reminiscență din Linux 2.4. .SH "VALOAREA RETURNATĂ" În caz de succes, \fBmodify_ldt\fP() returnează fie numărul real de octeți citiți (pentru citire), fie 0 (pentru scriere). În caz de eșec, \fBmodify_ldt\fP() returnează \-1 și configurează \fIerrno\fP pentru a indica eroarea. .SH ERORI\-IEȘIRE .TP \fBEFAULT\fP \fIptr\fP indică în afara spațiului de adrese. .TP \fBEINVAL\fP \fIptr\fP este 0, sau \fIfunc\fP este 1 și \fIbytecount\fP nu este egal cu dimensiunea structurii \fIuser_desc\fP, sau \fIfunc\fP este 1 sau 0x11 și noua intrare LDT are valori nevalide. .TP \fBENOSYS\fP \fIfunc\fP nu este nici 0, 1, 2, nici 0x11. .SH STANDARDE Linux. .SH NOTE \fBmodify_ldt\fP() nu ar trebui să fie utilizat pentru stocarea locală a firelor, deoarece încetinește comutarea contextelor și nu acceptă decât un număr limitat de fire. Bibliotecile de creare de fire de execuție (threading) ar trebui să utilizeze în schimb \fBset_thread_area\fP(2) sau \fBarch_prctl\fP(2), cu excepția nucleelor extrem de vechi care nu acceptă aceste apeluri de sistem. .PP În mod normal, \fBmodify_ldt\fP() este utilizat pentru a rula cod vechi pe 16 biți sau cod segmentat pe 32 de biți. Cu toate acestea, nu toate nucleele permit instalarea segmentelor pe 16 biți. .PP Chiar și în cazul nucleelor pe 64 de biți, \fBmodify_ldt\fP() nu poate fi utilizat pentru a crea un segment de cod în modul lung (adică pe 64 de biți). Câmpul nedocumentat „lm” din \fIuser_desc\fP nu este util și, în ciuda numelui său, nu are ca rezultat un segment în modul lung. .SH ERORI .\" commit e30ab185c490e9a9381385529e0fd32f0a399495 În nucleele pe 64 de biți înainte de Linux 3.19, activarea bitului „lm” în \fIuser_desc\fP împiedică ca descriptorul să fie considerat gol. Rețineți că bitul „lm” nu există în antetele pe 32 de biți, dar aceste nuclee cu erori vor observa totuși bitul chiar și atunci când este activat într\-un proces pe 32 de biți. .SH "CONSULTAȚI ȘI" \fBarch_prctl\fP(2), \fBset_thread_area\fP(2), \fBvm86\fP(2) .PP .SH TRADUCERE Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu . .PP Această traducere este documentație gratuită; citiți .UR https://www.gnu.org/licenses/gpl-3.0.html Licența publică generală GNU Versiunea 3 .UE sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE. .PP Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la .MT translation-team-ro@lists.sourceforge.net .ME .