Как работает mprotect ()? - PullRequest
       0

Как работает mprotect ()?

2 голосов
/ 29 сентября 2010

Я собирал некоторые общие команды в ядре Linux и видел, что mprotect () использовался много раз. Мне просто интересно, каков решающий фактор, который mprotect () использует для определения того, что адрес памяти, для которого он устанавливает значение защиты, находится в его собственном адресном пространстве?

Ответы [ 3 ]

9 голосов
/ 30 сентября 2010

В архитектурах с MMU 1 адрес, который mprotect() принимает в качестве аргумента, является виртуальным адресом.Каждый процесс имеет свое независимое виртуальное адресное пространство, поэтому есть только две возможности:

  • Запрошенный адрес находится в пределах собственного диапазона адресов процесса;или
  • Запрошенный адрес находится в пределах диапазона адресов ядра (который отображается в каждом процессе).

mprotect() работает внутренне, изменяя флаги, прикрепленные к VMA 2 .Первое, что он должен сделать, это найти VMA, соответствующий адресу, который был передан - если переданный адрес был в пределах диапазона адресов ядра, то существует no VMA, и поэтому этот поиск завершится неудачей.То же самое происходит, если вы пытаетесь изменить защиту в области адресного пространства, которая не отображается.

Вы можете увидеть представление VMA в адресном пространстве процесса, изучив /proc/<pid>/smapsили /proc/<pid>/maps.


1.Блок управления памятью 2.Область виртуальной памяти, структура данных ядра, описывающая непрерывный участок памяти процесса .
3 голосов
/ 29 сентября 2010

Ядро ищет адрес, который вы передаете mprotect в таблицу страниц текущего процесса. Если его там нет, значит, он терпит неудачу. Если оно там, ядро ​​может попытаться пометить страницу новыми правами доступа. Я не уверен, но все же возможно, что ядро ​​вернет ошибку здесь, если бы была какая-то особая причина, по которой доступ не мог быть предоставлен (например, попытка изменить разрешения отображаемой в памяти общей файловой области на доступную для записи когда файл фактически был доступен только для чтения).

Имейте в виду, что таблица страниц, используемая процессором для определения доступности области памяти, не является той, которую ядро ​​использовало для поиска этого адреса. В таблице процессора могут быть дыры для таких вещей, как страницы, которые выгружаются на диск. Таблицы связаны, но не совпадают.

3 голосов
/ 29 сентября 2010

Это примерно виртуальная память .А насчет динамического компоновщика / загрузчика .Большинство системных вызовов mprotect(2), которые вы видите в трассировке, вероятно, связаны с внесением библиотечных зависимостей, хотя реализация malloc(3) может также вызывать ее.

Редактировать:

Чтобы ответить на ваш вопрос в комментариях - MMU и код внутри ядра защищают один процесс от другого.У каждого процесса есть иллюзия полного 32-битного или 64-битного адресного пространства.Адреса , с которыми вы работаете, являются виртуальными и принадлежат данному процессу.Ядро с помощью аппаратного обеспечения сопоставляет их с физическими страницами памяти.Эти страницы могут быть разделены между процессами неявно как код или явно для межпроцессного взаимодействия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...