subpage_prot -
определяет
подстраничную
защиту
адресного
диапазона
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 <
[email protected]>, Azamat Hackimov
<
[email protected]>, Hotellook, Nikita
<
[email protected]>, Spiros Georgaras <
[email protected]>, Vladislav
<
[email protected]>, Yuri Kozlov <
[email protected]>
и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]