Читаем Linux API. Исчерпывающее руководство полностью

45.2. Напишите программы, подтверждающие доставку сигналов SIGBUS и SIGSEGV в обстоятельствах, описанных в подразделе 45.4.3.

45.3. Напишите программу, которая использует методику MAP_FIXED, описанную в разделе 45.10, для создания нелинейного отображения, аналогичного показанному на рис. 45.5.

46. Операции с виртуальной памятью

Эта глава посвящена системным вызовам, предназначенным для выполнения различных операций с виртуальным адресным пространством процесса:

• системный вызов mprotect() изменяет защиту участка виртуальной памяти;

• системные вызовы mlock() и mlockall() «запирают» участок виртуального пространства в рамках физической памяти и не дают сбросить его на диск;

• системный вызов mincore() позволяет процессу определять, находятся ли страницы виртуального пространства в физической памяти;

• системный вызов madvise() дает возможность сообщить ядру о потенциальной модели поведения процесса в контексте использования участка виртуальной памяти.

Некоторые из этих системных вызовов могут быть особенно полезны в сочетании с участками разделяемой памяти (см. главы 45 и 50), но вы можете применять их для работы с любыми сегментами виртуального адресного пространства.

Методики, описанные в данной главе, на самом деле не имеют никакого отношения к межпроцессному взаимодействию; я включил их в эту часть книги, поскольку они иногда используются вместе с разделяемой памятью.


46.1. Изменение защиты памяти: mprotect()


Системный вызов mprotect() изменяет защиту страниц виртуальной памяти в диапазоне длиной length байт, который начинается с адреса addr.

#include


int mprotect(void *addr, size_t length, int prot);

Возвращает 0 при успешном завершении или -1 при ошибке

Значение, переданное в аргументе addr, должно быть кратным размеру страницы памяти в системе (который возвращается вызовом sysconf(_SC_PAGESIZE)). Стандарт SUSv3 гласит, что аргумент addr должен быть выровнен по странице; в SUSv4 всего лишь предусмотрена такая возможность. Поскольку защита распространяется на целые страницы, значение length на практике округляется до следующего кратного размеру страницы в системе.

Аргумент prot представляет собой битовую маску, задающую новую защиту для данного участка памяти. Он должен быть равен либо PROT_NONE, либо сочетанию значений PROT_READ, PROT_WRITE и PROT_EXEC, к которым применено побитовое ИЛИ. Все эти флаги имеют то же значение, что и в вызове mmap() (табл. 45.2).

Если процесс попытается обратиться к участку памяти, нарушив заданную защиту, то ядро пошлет ему сигнал SIGSEGV.

Вызов mprotect() позволяет изменить защиту участка отображенной памяти, заданную с помощью mmap(), как показано в листинге 46.1. Эта программа создает анонимное отображение, любой доступ к которому изначально закрыт (PROT_NONE). Затем она открывает доступ для чтения и записи. Прежде чем выполнить данное изменение, программа использует вызов system(), чтобы запустить консольную команду, выводящую строчку из файла /proc/PID/maps, относящуюся к отображенному участку. Это позволит увидеть, как изменилась защита памяти (ту же информацию можно получить, вручную разобрав файл /proc/self/maps, но вызов system() позволяет сократить код программы). Запустив данное приложение, мы увидим следующее:

$ ./t_mprotect

Before mprotect()

b7cde000-b7dde000 —s 00000000 00:04 18258 /dev/zero (deleted)

After mprotect()

b7cde000-b7dde000 rw-s 00000000 00:04 18258 /dev/zero (deleted)

Последняя строка вывода говорит о том, что вызов mprotect() изменил права доступа к участку памяти на PROT_READ | PROT_WRITE.


Листинг 46.1. Изменение защиты памяти с помощью вызова mprotect()

vmem/t_mprotect.c

#define _BSD_SOURCE /* Получаем определение MAP_ANONYMOUS из */

#include

#include "tlpi_hdr.h"


#define LEN (1024 * 1024)


#define SHELL_FMT "cat /proc/%ld/maps | grep zero"

#define CMD_SIZE (sizeof(SHELL_FMT) + 20)

/* Выделяем дополнительное место для строки с целым числом */


int

main(int argc, char *argv[])

{

char cmd[CMD_SIZE];

char *addr;


/* Создаем анонимное отображение с полным отсутствием доступа */


addr = mmap(NULL, LEN, PROT_NONE, MAP_SHARED | MAP_ANONYMOUS, — 1, 0);

if (addr == MAP_FAILED)

errExit("mmap");


/* Выводим строку из /proc/self/maps, относящуюся к отображению */


printf("Before mprotect()\n");

snprintf(cmd, CMD_SIZE, SHELL_FMT, (long) getpid());

system(cmd);


/* Изменяем защиту памяти, разрешая чтение и запись */


if (mprotect(addr, LEN, PROT_READ | PROT_WRITE) == -1)

errExit("mprotect");


printf("After mprotect()\n");

system(cmd); /* Проверяем защиту, считывая файл /proc/self/maps */


exit(EXIT_SUCCESS);

}

vmem/t_mprotect.c


46.2. Блокирование памяти: mlock() и mlockall()


Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных