Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

       subpage_prot - определяет подстраничную защиту адресного диапазона

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <sys/syscall.h>      /* определения констант SYS_* */
       #include <unistd.h>

       int syscall(SYS_subpage_prot, unsigned long addr, unsigned long len,
                   uint32_t *map);

       Note: glibc provides no wrapper for subpage_prot(), necessitating the use of syscall(2).

ОПИСАНИЕ

       Системный  вызов  (есть  только  для  PowerPC)  subpage_prot()  предоставляет  возможность
       контроля доступа к отдельным 4 КБ подстраницам  в  системах,  где  размер  страницы  равен
       64 КБ.

       Карта  защиты  налагается  на  страницы  памяти для области, начинающейся с addr и имеющей
       размер len байт. Значения обоих аргументов должны быть выровнены на 64-КБ границу.

       Карта защиты задаётся в буфере, на который указывает map. В карте на каждую  4-килобайтную
       подстраницу выделяется 2 бита; таким образом, в каждом 32-битном слове задаётся защита для
       16 4-килобайтных подстраниц внутри 64-килобайтной страницы (поэтому  количество  32-битных
       слов,  на  которые  указывает  map,  должно  быть равно количеству 64-килобайтных страниц,
       указанному в len). Каждое 2-битное поле в карте защиты может быть: 0 — полный доступ, 1  —
       защита от записи, 2 или 3 — запрет на любой доступ.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При  успешном  выполнении  subpage_prot()  возвращается 0. В противном случае возвращается
       один из кодов ошибок, описанных далее.

ОШИБКИ

       EFAULT Буфер, на который ссылается map, недоступен.

       EINVAL Некорректное значение аргумента addr или  len.  Оба  значения  должны  быть  кратны
              размеру  системной  страницы,  и  они  не должны указывать на область вне адресного
              пространства процесса, или на область, которая состоит из огромных страниц.

       ENOMEM Не хватает памяти.

ВЕРСИИ

       Данный системный вызов предоставляется для архитектуры PowerPC начиная с Linux 2.6.25. Для
       его сборки в ядре должен быть указан параметр CONFIG_PPC_64K_PAGES. В библиотеке поддержка
       данного вызова отсутствует.

СТАНДАРТЫ

       Данный вызов есть только в Linux.

ЗАМЕЧАНИЯ

       Обычная страничная защита также работает  (на  уровне  64-килобайтных  страниц);  механизм
       подстраничной  защиты  является дополнительным ограничением, поэтому указание 0 в 2-битном
       поле не разрешит запись в страницу, которая защищена от записи другим способом.

   Обоснование
       Данный системный  вызов  предоставляется  для  облегчения  написания  эмуляторов,  которые
       работают   с  64-КБ  страницами  в  системах  PowerPC.  При  эмуляции  систем,  в  которых
       используется меньший размер страницы (таких как x86), эмулятор не может использовать  блок
       управления  памятью  (MMU) и обычные системные вызовы управления защитой страниц (эмулятор
       может эмулировать MMU с помощью ПО проверяя и, возможно, перераспределяя адрес при  каждом
       обращении  к  памяти,  но  это  медленно). Идея в том, что эмулятор задаёт массив защитных
       масок для указанного диапазона виртуальных адресов. Эти маски накладываются в  месте,  где
       аппаратные  табличные  записи  страниц  (PTE)  вставляются в аппаратную таблицу страниц на
       основе Linux PTE, при этом Linux PTE  не  затрагиваются.  В  этом  случае  для  защищённых
       областей  адресного  пространства  начинают неявно использоваться 4-килобайтные аппаратные
       страницы, а не 64-килобайтные аппаратные страницы  (на  машинах  с  аппаратной  поддержкой
       64-килобайтных страниц).

СМ. ТАКЖЕ

       mprotect(2), syscall(2)

       Documentation/admin-guide/mm/hugetlbpage.rst в дереве исходного кода ядра Linux

ПЕРЕВОД

       Русский    перевод    этой    страницы    руководства   был   сделан   Alexander   Golubev
       <fatzer2@gmail.com>,  Azamat  Hackimov  <azamat.hackimov@gmail.com>,   Hotellook,   Nikita
       <zxcvbnm3230@mail.ru>,       Spiros       Georgaras       <sng@hellug.gr>,       Vladislav
       <ivladislavefimov@gmail.com>,   Yuri   Kozlov   <yuray@komyakino.ru>   и    Иван    Павлов
       <pavia00@gmail.com>

       Этот  перевод  является  бесплатной  документацией;  прочитайте  Стандартную  общественную
       лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

       Если  вы  обнаружите  ошибки  в  переводе этой страницы руководства, пожалуйста, отправьте
       электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.