MODIFY_LDT(2)

ИМЯ
modify_ldt - получает или устанавливает ldt

ОБЗОР
#include <sys/types.h>

int modify_ldt(int func, void *ptr, unsigned long bytecount);

ОПИСАНИЕ
Вызов modify_ldt() читает или записывает локальную таблицу дескрипторов (ldt) процесса. Ldt — это таблица управления памятью процесса, используемая в процессорах i386. Подробнее о содержимом этой таблицы читайте в руководствах по процессору Intel 386.

Если значение func равно 0, то modify_ldt() читает ldt в память по адресу ptr. Количество прочитанных байт меньше bytecount и равно реальному размеру ldt.

Если значение func равно 1, то modify_ldt() изменяет элемент ldt. Значение ptr указывает на структуру user_desc, а bytecount должно быть равно размеру этой структуры. Структура user_desc определена в <asm/ldt.h> следующим образом:
struct user_desc {
    unsigned int  entry_number;
    unsigned long 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;
};

В Linux версии 2.4 и более ранних эта структура называлась modify_ldt_ldt_s.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении modify_ldt() возвращается реальное количество прочитанных байт (при чтении) или 0 (при записи). При ошибке modify_ldt() возвращает -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

EFAULT
    Значение ptr указывает за пределы адресного пространства.

EINVAL
    Значение ptr равно 0, или func равно 1, а bytecount не равно размеру структуры modify_ldt_ldt_s, или func равно 1, а новая запись ldt содержит неправильные значения.

ENOSYS
    Значение func не равно 0 или 1.

СООТВЕТСТВИЕ СТАНДАРТАМ
Данный вызов есть только в Linux и не должен использоваться в программах, которые должны быть переносимыми.

ЗАМЕЧАНИЯ
В glibc нет обёртки для данного системного вызова; запускайте его с помощью syscall(2).

СМОТРИТЕ ТАКЖЕ
vm86(2)