.\" -*- 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 "31 октября 2023 г." "Linux man\-pages 6.06" .SH ИМЯ modify_ldt \- возвращает или изменяет запись LDT у процесса .SH LIBRARY Standard C library (\fIlibc\fP, \fI\-lc\fP) .SH СИНТАКСИС .nf \fB#include \fP /* Definition of \fBstruct user_desc\fP */ \fB#include \fP /* Definition of \fBSYS_*\fP constants */ \fB#include \fP .P \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 .P \fINote\fP: glibc provides no wrapper for \fBmodify_ldt\fP(), necessitating the use of \fBsyscall\fP(2). .SH ОПИСАНИЕ Вызов \fBmodify_ldt\fP() считывает или записывает таблицу локальных дескрипторов (LDT) процесса. LDT представляет собой массив дескрипторов сегментов, которые могут использоваться в пользовательском коде. В Linux процессам разрешено настраивать попроцессные (в действительности, пространство памяти) LDT. Дополнительную информацию о LDT, смотрите в Intel Software Developer's Manual или AMD Architecture Programming Manual. .P Если \fIfunc\fP равно 0, то \fBmodify_ldt\fP() читает LDT в память, на которую указывает \fIptr\fP. Количество читаемых байт — меньшее из \fIbytecount\fP и реального размера LDT несмотря на то, что ядро может действовать как будто LDT заполняется дополнительными нулевыми байтами в конце. При успешном выполнении \fBmodify_ldt\fP() возвращает количество прочитанных байт. .P Если значение \fIfunc\fP равно 1 или 0x11, то \fBmodify_ldt\fP() изменяет запись LDT, на которую указывает \fIptr\->entry_number\fP. Значение \fIptr\fP указывает на структуру \fIuser_desc\fP, а \fIbytecount\fP должно быть равно размеру этой структуры. .P Структура \fIuser_desc\fP определена в \fI\fP следующим образом: .P .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 .P В Linux версии 2.4 и более ранних эта структура называлась \fImodify_ldt_ldt_s\fP. .P В поле \fIcontents\fP определяется тип сегмента (данные, данные, расширяемые вниз (expand\-down data), не соответствующий код (non\-conforming code) или соответствующий код). Назначение других полей совпадает с их описанием в руководстве к процессору, несмотря на то, что \fBmodify_ldt\fP() не может изменить аппаратно\-определяемый бит «доступа», описанный в руководстве к ЦП. .P A \fIuser_desc\fP считается «пустым», если \fIread_exec_only\fP и \fIseg_not_present\fP равны 1, а все остальные поля равны 0. Элемент LDT можно очистить, назначив ему «пустой» \fIuser_desc\fP или, если \fIfunc\fP равно 1, установив \fIbase\fP и \fIlimit\fP в 0. .P Сегмент соответствующего кода (conforming code segment, т. е., с \fIcontents==3\fP) будет отклонён, если \fIfunc\fP равно 1 или если \fIseg_not_present\fP равно 0. .P Если \fIfunc\fP равно 2, то \fBmodify_ldt\fP() прочитает нули. Это, кажется, пережиток из Linux 2.4. .SH "ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ" При успешном выполнении \fBmodify_ldt\fP() возвращается реальное количество прочитанных байт (при чтении) или 0 (при записи). При ошибке \fBmodify_ldt\fP() возвращает \-1, а \fIerrno\fP устанавливается в соответствующее значение. .SH ОШИБКИ .TP \fBEFAULT\fP Значение \fIptr\fP указывает за пределы адресного пространства. .TP \fBEINVAL\fP Значение \fIptr\fP равно 0, или \fIfunc\fP равно 1, а \fIbytecount\fP не равно размеру структуры \fIuser_desc\fP, или \fIfunc\fP равно 1 или 0x11, а новый элемент LDT содержит неправильные значения. .TP \fBENOSYS\fP Значение \fIfunc\fP не равно 0, 1, 2 или 0x11. .SH СТАНДАРТЫ Linux. .SH ЗАМЕЧАНИЯ Вызов \fBmodify_ldt\fP() не должен использоваться для локального хранилища нити, так как это замедляет переключение контекста и поддерживается только для ограниченного количества нитей. Вместо этого в библиотеках нитей должны использоваться \fBset_thread_area\fP(2) или \fBarch_prctl\fP(2), только если не нужна поддержка старых ядер, где нет этих вызовов. .P Обычно, \fBmodify_ldt\fP() используют для запуска старого 16\-битного или сегментированного 32\-битного кода. Однако, не все ядра допускают установку 16\-битных сегментов. .P Даже в 64\-битных ядрах вызов \fBmodify_ldt\fP() нельзя использовать для создания сегмента кода в длинном режиме (т. е., 64\-битного). Недокументированное поле «lm» в \fIuser_desc\fP не помогает и, несмотря на имя, не образует сегмент в длинном режиме. .SH ДЕФЕКТЫ .\" commit e30ab185c490e9a9381385529e0fd32f0a399495 В 64\-битных ядрах до Linux 3.19, установка бита «lm» в \fIuser_desc\fP приводила к тому, что дескриптор переставал считаться пустым. Учтите, что бит «lm» не существует в 32\-битных заголовках, но есть дефектные ядра, которые по\-прежнему сообщают о бите даже в 32\-битном процессе. .SH "СМ. ТАКЖЕ" \fBarch_prctl\fP(2), \fBset_thread_area\fP(2), \fBvm86\fP(2) .PP .SH ПЕРЕВОД Русский перевод этой страницы руководства был сделан aereiae , Alexey , Azamat Hackimov , Dmitriy S. Seregin , Dmitry Bolkhovskikh , ITriskTI , Max Is , Yuri Kozlov , Иван Павлов и Малянов Евгений Викторович . .PP Этот перевод является бесплатной документацией; прочитайте .UR https://www.gnu.org/licenses/gpl-3.0.html Стандартную общественную лицензию GNU версии 3 .UE или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. .PP Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на .MT man-pages-ru-talks@lists.sourceforge.net .ME .